--- MPIWGWeb/Attic/MPIWGRoot.py 2008/08/28 18:20:09 1.1.2.6 +++ MPIWGWeb/Attic/MPIWGRoot.py 2012/01/06 08:23:10 1.1.2.33 @@ -29,7 +29,7 @@ import copy import updatePersonalWWW import MPIWGStaff from MPIWGHelper import * - +from BeautifulSoup import BeautifulSoup, Comment def sortWeight(x,y): x1=int(getattr(x[1],'weight','0')) @@ -40,6 +40,8 @@ def sortWeight(x,y): class MPIWGRoot(ZSQLExtendFolder): """Stammordner fuer den Web-Server""" + meta_type='MPIWGRoot' + fieldLabels={'WEB_title':'WEB_Title', 'xdata_01':'Responsible Scientists', 'xdata_02':'Department', @@ -58,15 +60,146 @@ class MPIWGRoot(ZSQLExtendFolder): 'WEB_project_description':'WEB_project_description', 'WEB_related_pub':'WEB_related_pub'} + # (is this used?) folders=['MPIWGProject','Folder','ECHO_Navigation'] - meta_type='MPIWGRoot' + # language of this instance + lang = 'en' + # types of objects that show up in navigation + nav_meta_types = ['MPIWGTemplate','MPIWGLink','MPIWGFolder'] + + manage_options = Folder.manage_options+( + {'label':'Update personal homepages','action':'updatePersonalwww_html'}, + {'label':'Reindex catalogs','action':'reindexCatalogs'}, + {'label':'Main config','action':'changeMPIWGRootForm'}, + {'label':'add e-mails','action':'showNewDBEntries'}, + #{'label':'update the institutsbibliography','action':'updateInstitutsbiliography'}, + #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, + #{'label':'Store Historical Persons','action':'storeHistoricalPersons'}, + ) + + + def getGetNeighbourhood(self,obj, wordStr, length=100,tagging=True): + """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte + alle Tags werden entfernt, die Fundstellen werden mit XX getaggt, die Umgebungen werden + case insensitive gesucht + @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet + "eine phrase", "*" bezeichnet wildcards und wird ignoriert" + @param length: optional, default wert 100, 2*length ist die groesse der Umgebung + @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false + """ + + ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird + ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt + + wordStr=wordStr.lstrip().rstrip() + + def isInRanges(nr,length): + """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck, + -1, wenn kein Treffer + + @param nr: Position die geprueft werden soll + @param length: Laenge des Wortes das geprueft werden soll + """ + for x in ranges: + if (x[0]<=nr) and (nr < (x[1]-length)): + return ranges.index(x) + return -1 + + # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt. + def rep_empty(str): + x= re.sub(" ","_",str.group(0)) + return re.sub("\"","",x) + + wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche " + + #deal with wildcards, for our purposes it is enough to delete the wildcard + wordStr=wordStr.replace("*","") + + words=wordStr.split(" ") + #if not words is ListType: + # words=[words] + + txt=obj.harvest_page() + if not txt: + return ret + + soup = BeautifulSoup(txt) + + comments = soup.findAll(text=lambda text:isinstance(text, Comment)) + [comment.extract() for comment in comments] + + txt = ''.join(soup.findAll(text=True)) + + + #txt=re.sub("<.*?>", "", txt) # loesche alle Tags + for word in words: + word=re.sub("_"," ",word) # ersetze zurueck "_" durch " " + pos=0 + + n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf + for i in range(n): + pos=txt.lower().find(word.lower(),pos) + + if pos > 0: + x=max(0,pos-length) + y=min(len(txt),pos+length) + + + #is word already in one of the results + nr=isInRanges(pos,len(word)) + if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese + x=min(ranges[nr][0],x) + y=max(ranges[nr][1],y) + + str=txt[x:y] + if x!=0: #add dots if in the middle of text + str="..."+str + + if y!=len(txt): #add dots if in the middle of text + str=str+"..." + + + + if nr >=0: # word ist in einer schon gefunden Umgebung + ranges[nr]=(x,y) # neue Position der Umgebung + + ret[nr]=str # neue Umgebung + else: # andernfalls neue Umgebung hinzufuegen + ranges.append((x,y)) + + ret.append(str) + + pos=pos+len(word) + else: + break; + + # now highlight everything + if tagging: + for x in range(len(ret)): + for word in words: + repl=re.compile(word,re.IGNORECASE) + ret[x]=repl.sub(""" %s"""%word.upper(),ret[x]) + + return ret + def copyAllImagesToMargin(self): + """tranformiere alle Bilder in die Margins""" + projects=self.getTree() + ret="" + for project in projects: + proj=project[3] + try: + persons=proj.copyImageToMargin(); + except: + logging.error("Cannnot do: %s"%repr(project)) + def transformProjectsToId(self): """trnasformiere zu ID, Hilfsfunktion die die alten Templates analysiert und mit der neuen Liste verantwortlicher Personen versieht""" projects=self.getTree() ret="" for project in projects: + proj=project[3] persons=proj.identifyNames(proj.getContent('xdata_01')) if not hasattr(proj,'responsibleScientistsList'): @@ -84,6 +217,7 @@ class MPIWGRoot(ZSQLExtendFolder): proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey())) return ret + def harvestProjects(self): """harvest""" @@ -123,6 +257,9 @@ class MPIWGRoot(ZSQLExtendFolder): else: return array[idx] + def getLang(self): + """returns the default language""" + return self.lang def browserCheck(self): """check the browsers request to find out the browser type""" @@ -225,11 +362,6 @@ class MPIWGRoot(ZSQLExtendFolder): def subNavStatic(self,obj): """subnav" von self""" - def sortWeight(x,y): - x1=int(getattr(x[1],'weight','0')) - y1=int(getattr(y[1],'weight','0')) - return cmp(x1,y1) - subs=self.ZopeFind(obj,obj_metatypes=['MPIWGTemplate','MPIWGLink']) subret=[] @@ -240,40 +372,24 @@ class MPIWGRoot(ZSQLExtendFolder): return subret def subNav(self,obj): - """return subnav elemente""" - def sortWeight(x,y): - x1=int(getattr(x[1],'weight','0')) - y1=int(getattr(y[1],'weight','0')) - return cmp(x1,y1) - #if obj.meta_type in ['MPIWGTemplate','MPIWGLink']: - # id=obj.aq_parent.getId() - #else: - - #id=obj.getId() - - - #suche die zweite ebene - - if not obj.aq_parent.getId() in ['de','en']: - obj=obj.aq_parent - - while not self.ZopeFind(self,obj_ids=[obj.getId()]): - obj=obj.aq_parent - - - if hasattr(self,obj.getId()): - - subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink']) - subret=[] - - for x in subs: - if not(x[1].title==""): - subret.append(x) - subret.sort(sortWeight) - return subret - else: - return None - + """return sub-navigation elements i.e. below sections""" + # get section -> parent should be MPIWGRoot + p = obj + sec = None + # descend parents to the root (and remember the last id) + while p is not None and p.meta_type != 'MPIWGRoot': + sec = p + p = p.aq_parent + + subsecs = sec.objectItems(self.nav_meta_types) + subsecs = [s for s in subsecs if s[1].title != ""] + subsecs.sort(sortWeight) + return subsecs + + def isType(self,object,meta_type): + """teste ob ein object vom meta_type ist.""" + return (object.meta_type==meta_type) + def isActive(self,name): """teste ob subnavigation aktiv""" for part in self.REQUEST['URL'].split("/"): @@ -287,7 +403,8 @@ class MPIWGRoot(ZSQLExtendFolder): secs = self.objectItems(['MPIWGFolder']) secs.sort(sortWeight) #logging.debug("root: %s secs: %s"%(repr(self.absolute_url()), repr(secs))) - return secs + # return pure list of objects + return [s[1] for s in secs] def getSectionStyle(self, name, style=""): """returns a string with the given style + '-sel' if the current section == name""" @@ -296,6 +413,22 @@ class MPIWGRoot(ZSQLExtendFolder): else: return style + def getFeatures(self, num=None): + """returns a list of the last num Features""" + dir = getattr(self, 'features') + features = dir.objectItems(['MPIWGFeature']) + features.sort(sortWeight) + if num is not None: + # take only the last num elements + features = features[-num:] + # return pure list of objects + return [f[1] for f in features] + + + def getMPIWGRoot(self): + """returns the MPIWG root""" + return self + def MPIWGrootURL(self): """returns the URL to the root""" return self.absolute_url() @@ -327,6 +460,7 @@ class MPIWGRoot(ZSQLExtendFolder): def isActiveMember(self,key): """tested ob Mitarbeiter key ist aktiv""" + key=utf8ify(key) ret=self.getat(self.ZSQLInlineSearch(_table='personal_www', _op_key='eq',key=key, _op_publish_the_data='eq', @@ -482,13 +616,18 @@ class MPIWGRoot(ZSQLExtendFolder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGRootForm')).__of__(self) return pt() - def changeMPIWGRoot(self,title,disciplineList,themesList,connection_id,RESPONSE=None): + def changeMPIWGRoot(self,title,connection_id,coneServiceURL,lang=None,autocommit=None,RESPONSE=None): """change""" self.title=title self.connection_id=connection_id - self.disciplineList=disciplineList - self.themesList=themesList + #self.disciplineList=disciplineList + #self.themesList=themesList + self.coneServiceURL=coneServiceURL + + if lang is not None: + self.lang = lang + self.autocommit = (autocommit == "on") if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -496,7 +635,7 @@ class MPIWGRoot(ZSQLExtendFolder): def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): """childs alle childs, alle parents""" ret=[] - + if parents: pnums=parents.split(".") while len(pnums) > 1: @@ -525,7 +664,8 @@ class MPIWGRoot(ZSQLExtendFolder): else: ret.append(project) - logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret))) + #logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret))) + return ret @@ -573,17 +713,6 @@ class MPIWGRoot(ZSQLExtendFolder): return projects - manage_options = Folder.manage_options+( - {'label':'Update personal homepages','action':'updatePersonalwww_html'}, - {'label':'Reindex catalogs','action':'reindexCatalogs'}, - {'label':'Main config','action':'changeMPIWGRootForm'}, - {'label':'add e-mails','action':'showNewDBEntries'}, - {'label':'update the institutsbibliography','action':'updateInstitutsbiliography'}, - #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, - #{'label':'Store Historical Persons','action':'storeHistoricalPersons'}, - ) - - def updatePublicationDB(self,personId=None): """updates the publication db, i.e. copy year and type into the main table""" @@ -669,17 +798,20 @@ class MPIWGRoot(ZSQLExtendFolder): result,msg=MPIWGStaff.createNewDBEntry(self,data['publish_the_data'],data['key'],data['last_name'], - data['first_name'],data['title'],data['status'],"", + data['first_name'],data['titles_new'],data['status'],"", "",data['date_from'],data['date_to'], - data['department'],data['home_inst'],data['funded_by'], + data['department'],'',data['funded_by'], data['e_mail2'],data['current_work'],"yes",data['date_stay_at_mpiwg'],data['group'],"no",data['current_work']) return result,msg - def updatePersonEntry(self,data,ignoreEntries=[]): + def updatePersonEntry(self,data,ignoreEntries=None): """update an person entry from data. but ignore all fields in ignore Entries""" - - ignoreEntries.append('current_work') # TODO:updatecurrent work + if ignoreEntries is None: + ignoreEntries = [] + + #ignoreEntries.append('current_work') # TODO:updatecurrent work + logging.debug("updatePersonEntry: data=%s ignoreEntries=%s"%(repr(data),repr(ignoreEntries))) if data['date_to']=="": # wenn date_to leer data['date_to']="date_none" @@ -693,9 +825,9 @@ class MPIWGRoot(ZSQLExtendFolder): columns=data.keys() for x in ignoreEntries: - logging.info("ign rem: %s"%x) + logging.debug("updatePersonEntry: ignoring %s"%x) try: #falls in ignore entries felder sind, die nicht in columns sind, fange den fehler ab - columns.remove(x) + columns.remove(x) except: pass @@ -727,6 +859,8 @@ class MPIWGRoot(ZSQLExtendFolder): resultSet=self.REQUEST.SESSION['personal_www']['resultSet'] news=self.REQUEST.SESSION['personal_www']['news'] conflicts=self.REQUEST.SESSION['personal_www']['conflicts'] + logging.debug("updatePersonalwww_doIt: args=%s\n resultSet=%s\n news=%s\n conflicts=%s"%(args,resultSet,news,conflicts)) + ret="" # generate the new entry @@ -734,8 +868,8 @@ class MPIWGRoot(ZSQLExtendFolder): ret+="

Hinzugefügt

" ret+="

Neueinträge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.

" ret+="" @@ -761,13 +896,13 @@ class MPIWGRoot(ZSQLExtendFolder): if args[conflict.encode('utf-8')+'_'+cf[0]]=="stored": #use the stored one ignoreEntries.append(cf[0]) #so ignore field cf[0] displayIgnored.append(cf) + if len(displayIgnored)>0: ret+="

%s

"%conflict.encode('utf-8') - ret+="" for iE in displayIgnored: ret+=""%(iE[0].encode('utf-8'),iE[1].encode('utf-8'),iE[2].encode('utf-8')) - ret+="" + ret+="
%s%s%s
" self.updatePersonEntry(resultSet[conflict],ignoreEntries=ignoreEntries) @@ -786,6 +921,8 @@ class MPIWGRoot(ZSQLExtendFolder): return "DONE" + + def updatePersonalwww_html(self): """update form for the homepages web form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww.zpt')).__of__(self) @@ -818,8 +955,23 @@ class MPIWGRoot(ZSQLExtendFolder): try: self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + logger("MPIWG Root (reindexCatalog: projects)",logging.INFO,"DONE") except: - logger("MPIWG Root (updatehomepage)",logging.WARNING," %s %s"%sys.exc_info()[:2]) + logger("MPIWG Root (reindexCatalog: projects)",logging.WARNING," %s %s"%sys.exc_info()[:2]) + + try: + + self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + logger("MPIWG Root (reindexCatalog: members)",logging.INFO,"DONE") + except: + logger("MPIWG Root (reindexCatalog: members)",logging.WARNING," %s %s"%sys.exc_info()[:2]) + + try: + + self.fulltextProjectsMembers.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.INFO,"DONE") + except: + logger("MPIWG Root (reindexCatalog: fulltextProjectsMembers)",logging.WARNING," %s %s"%sys.exc_info()[:2]) @@ -838,8 +990,8 @@ class MPIWGRoot(ZSQLExtendFolder): return cmp(x[0],y[0]) results=self.MembersCatalog({'isPublished':True}) - - ret=[(", ".join([proj.lastName, proj.firstName]).decode('utf-8'),proj.getKey) for proj in results] + + ret=[(unicodify(", ".join([proj.lastName, proj.firstName])), proj.getKey) for proj in results] ret.sort(sorter) return ret @@ -861,17 +1013,21 @@ class MPIWGRoot(ZSQLExtendFolder): else: return entry - def getTreeRSS(self,dep=None,date=None,onlyActive=0,onlyArchived=0): + def getTreeRSS(self,dep=None,date=None,onlyActive=1,onlyArchived=0): """generateTree""" rss=""" """ for obj in self.getTree(dep, date, onlyActive, onlyArchived): + linkStr="""http://www.mpiwg-berlin.mpg.de/en/research/projects/%s""" rss+="""""" - rss+="""http://wwwneu.mpiwg-berlin.mpg.de/en/research/projects/%s"""%obj[3].getId() + rss+=linkStr%obj[3].getId() rss+="""""" - + if hasattr(obj[3],'publicationList'): + rss+="""""" + rss+=linkStr%(obj[3].getId()+"/publicationList"); + rss+="""""" rss+=""" """ @@ -888,6 +1044,8 @@ class MPIWGRoot(ZSQLExtendFolder): onlyArchived=0: alle Projekte onlyArchived= 1 : nur aktuelle Projekte onlyArchived = 2: nur archivierte Projekte + + department fuer das Tree geholt werden soll """ returnListTmp=[] @@ -907,7 +1065,7 @@ class MPIWGRoot(ZSQLExtendFolder): if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive project[0].setActiveFlag(False) - if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. + if (not dep) or (splittedId[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. if (onlyActive==0): returnListTmp.append((depth,nr,title,project[0])) @@ -969,9 +1127,9 @@ class MPIWGRoot(ZSQLExtendFolder): hashList={} onlyArchived=int(form.get("onlyArchived",0)) onlyActive=int(form.get("onlyActive",0)) + dep=form.get("dep",None) - - fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive) + fields=self.getTree(dep=dep,onlyArchived=onlyArchived,onlyActive=onlyActive) logging.info("GOT TREE!----------------------------------------------------") for field in form.keys(): @@ -988,25 +1146,33 @@ class MPIWGRoot(ZSQLExtendFolder): else: fields[nr][3].setActiveFlag(False) - #nummer hat sich geŠndert + #nummer hat sich geaendert entryChanged = False; - + if isinstance(fields[nr][3].xdata_05,list): #for some reasons somtimes the content of the field is a list with one entry. + fields[nr][3].xdata_05=fields[nr][3].xdata_05[0] + if not (fields[nr][3].xdata_05==form[str(nr)+'_number']): logging.info("Changed!Number+++++++++++++++++++++++++++++++++") + logging.info(repr(fields[nr][3].xdata_05)+" ---> "+ repr(form[str(nr)+'_number'])) fields[nr][3].xdata_05=form[str(nr)+'_number'] entryChanged = True #completed har sich geaendert - - if not (fields[nr][3].getCompletedAt()==fields[nr][3].transformDate(form[str(nr)+'_completed'])): + + td = fields[nr][3].transformDate # hole die funktion zum transformieren des datums + + if not (td(fields[nr][3].getCompletedAt())==td(form[str(nr)+'_completed'])): fields[nr][3].setCompletedAt(form[str(nr)+'_completed']) + logging.info(repr(td(fields[nr][3].getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed']))) logging.info("Changed!Completed+++++++++++++++++++++++++++++++++") entryChanged = True - if not (fields[nr][3].getStartedAt()==fields[nr][3].transformDate(form[str(nr)+'_started'])): + if not (td(fields[nr][3].getStartedAt())==td(form[str(nr)+'_started'])): fields[nr][3].setStartedAt(form[str(nr)+'_started']) + + logging.info(repr(td(fields[nr][3].getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started']))) logging.info("Changed!Started+++++++++++++++++++++++++++++++++") entryChanged = True @@ -1065,12 +1231,16 @@ class MPIWGRoot(ZSQLExtendFolder): if key=="": return "" - catalogged=self.MembersCatalog({'getKey':key}) - if len(catalogged)==0: - return "" - else: - return catalogged[0].getObject().getId() + try: + key=utf8ify(key) + catalogged=self.MembersCatalog({'getKey':key}) + if len(catalogged)==0: + return "" + else: + return catalogged[0].getObject().getId() + except: + return "" @@ -1078,9 +1248,10 @@ class MPIWGRoot(ZSQLExtendFolder): """give tuple member /projects""" ret=[] members=self.getAllMembers() - + logging.error("X %s"%repr(members)) #return str(members) for x in members: + logging.error("X %s"%repr(x)) projects=self.getProjectsOfMember(key=x[1],date=date) if len(projects)>0: ret.append((x[0],projects)) @@ -1104,7 +1275,7 @@ class MPIWGRoot(ZSQLExtendFolder): ret=[] if key: - proj=self.ProjectCatalog({'getPersonKeyList':key}) + proj=self.ProjectCatalog({'getPersonKeyList':utf8ify(key)}) else: return ret # key muss definiert sein @@ -1112,6 +1283,7 @@ class MPIWGRoot(ZSQLExtendFolder): if proj: proj2=[] for x in proj: + #logging.error("proj:%s"%repr(x.getPath())) if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''): proj2.append(x) @@ -1123,7 +1295,7 @@ class MPIWGRoot(ZSQLExtendFolder): proj2.sort(sortP) projectListe=[] - + #logging.error("getprojectsofmember proj2: %s"%repr(proj2)) for proj in proj2: obj=proj.getObject() add=False @@ -1134,7 +1306,7 @@ class MPIWGRoot(ZSQLExtendFolder): if obj.isArchivedProject(): add=True else: #alle - add=True + add=True if onlyActive==1: #nur active projecte if obj.isActiveProject(): @@ -1151,7 +1323,7 @@ class MPIWGRoot(ZSQLExtendFolder): if add: projectListe.append(obj) - + #logging.error("getprojectsofmember projectliste: %s"%repr(projectListe)) return projectListe def givePersonList(self,name): @@ -1348,6 +1520,19 @@ class MPIWGRoot(ZSQLExtendFolder): return "done" + def sortResults(self,results): + """search the catalog and give results back sorted by meta_type""" + ret = {} + logging.debug(results()) + for result in results(): + metaType = result.meta_type + resultList= ret.get(metaType,[]) + resultList.append(result) + ret[metaType]=resultList + + logging.debug(ret) + return ret + def manage_addMPIWGRootForm(self): """form for adding the root""" @@ -1362,4 +1547,4 @@ def manage_addMPIWGRoot(self,id,title,co setattr(ob,'connection_id',connection_id) if RESPONSE is not None: RESPONSE.redirect('manage_main') - \ No newline at end of file +