--- MPIWGWeb/MPIWGProjects.py 2005/12/22 21:10:14 1.47.2.45 +++ MPIWGWeb/MPIWGProjects.py 2006/08/03 09:43:40 1.47.2.56 @@ -270,6 +270,19 @@ class MPIWGRoot(ZSQLExtendFolder): folders=['MPIWGProject','Folder','ECHO_Navigation'] meta_type='MPIWGRoot' + def decode(self,str): + """decoder""" + if not str: + return "" + if type(str) is StringType: + try: + return str.decode('utf-8') + except: + return str.decode('latin-1') + else: + + return str + def versionHeaderEN(self): """version header text""" @@ -340,7 +353,23 @@ class MPIWGRoot(ZSQLExtendFolder): return True else: return False - + + 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=[] + + for x in subs: + if not(x[1].title==""): + subret.append(x) + subret.sort(sortWeight) + return subret + def subNav(self,obj): """return subnav elemente""" def sortWeight(x,y): @@ -355,12 +384,14 @@ class MPIWGRoot(ZSQLExtendFolder): #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']) @@ -634,7 +665,7 @@ class MPIWGRoot(ZSQLExtendFolder): """test""" return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url - def getContexts(self,childs=None,parents=None,depth=None,date=None): + def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): """childs alle childs, alle parents""" ret=[] @@ -649,15 +680,17 @@ class MPIWGRoot(ZSQLExtendFolder): if childs: for project in self.getProjectFields('xdata_05',sort='int',date=date): searchStr=childs+"(\..*)" - if re.match(searchStr,project[1]): - - if depth: - - if int(depth)>=len(project[1].split("."))-len(childs.split(".")): - + + if (onlyActive and project[0].isActiveProject()) or (not onlyActive): + if re.match(searchStr,project[1]): + + if depth: + + if int(depth)>=len(project[1].split("."))-len(childs.split(".")): + + ret.append(project) + else: ret.append(project) - else: - ret.append(project) return ret def getProjectFields(self,fieldName,date=None,folder=None,sort=None): @@ -765,10 +798,14 @@ class MPIWGRoot(ZSQLExtendFolder): RESPONSE.setHeader('Content-type', 'text/html') RESPONSE.write("\n") + RESPONSE.write("Update Institutsbibliography\n") + ret=self.upDateSQL('personalwww.xml') + RESPONSE.write("done Insitutsbibliography:%s\n"%ret) url="http://itgroup.mpiwg-berlin.mpg.de:8050/FMPro?-db=personal-www&-format=-dso_xml&-lay=sql_export&-max=20000&-findall" dom = NonvalidatingReader.parseUri(url) #fh=urllib.urlopen(url) #dom=xml.dom.minidom.parse(fh) + RESPONSE.write("got_xml_File\n") @@ -826,7 +863,7 @@ class MPIWGRoot(ZSQLExtendFolder): vorname,username,title,position,e_mail, e_mail_p,date_from,date_to, abteilung,heimat_inst,funded_by, - e_mail2,txt,txt_p) + e_mail2,txt,txt_p,stay_at_mpiwg) RESPONSE.write("""

%s

"""%ret[1].encode('utf-8')) except: RESPONSE.write("

ERROR:%s %s %s

\n"%(username.encode('utf-8'),name.encode('utf-8'),vorname.encode('utf-8'))) @@ -852,14 +889,14 @@ class MPIWGRoot(ZSQLExtendFolder): done= obj.updateDBEntry(DBid=id,publish_the_data=publish_the_data, date_from=date_from, - date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position) + date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position,abteilung=abteilung) if not done and (publish_the_data=='yes'): ret=obj.createNewDBEntry(publish_the_data,id,name, vorname,username,title,position,e_mail, e_mail_p,date_from,date_to, abteilung,heimat_inst,funded_by, - e_mail2,txt,txt_p) + e_mail2,txt,txt_p,stay_at_mpiwg) if not ret[0]: RESPONSE.write("

Error: %s

\n"%repr(ret[1])) @@ -871,7 +908,7 @@ class MPIWGRoot(ZSQLExtendFolder): #self.updatePublicationDB() - self.ZSQLResetConnection() + #self.ZSQLResetConnection() RESPONSE.write("

Done

") return True @@ -888,6 +925,7 @@ class MPIWGRoot(ZSQLExtendFolder): + if RESPONSE: RESPONSE.redirect('manage_main') @@ -933,25 +971,35 @@ class MPIWGRoot(ZSQLExtendFolder): RESPONSE.redirect('manage_main') - def getAllMembers(self): - """give list of all members""" - ret=[] +# def getAllMembers(self,reset=None): +# """give list of all members""" +# ret=[] +# +# +# if reset or (getattr(self,'_v_membersList',None) is None): +# for member in self.members._objects: +# if member['meta_type']=='MPIWGStaff': +# memberObj=getattr(self.members,member['id']) +# if memberObj.isPublished(): +# ret.append(memberObj.title.decode('utf-8')) +# +# ret.sort() +# self._v_membersList=ret[0:] +# print ret +# +# return self._v_membersList - #for x in self.members.objectValues('MPIWGStaff'): - #print x.title - # ret.append(x.title.decode('utf-8')) - - for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']): - if x[1].isPublished(): - ret.append(x[1].title.decode('utf-8')) - - ret.sort() - #print ret - + def getAllMembers(self): + #ret=[] + + results=self.MembersCatalog({'isPublished':True}) + + ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results] + + ret.sort() return ret - def printAllMembers(self): - """prin""" + """print""" members=self.getAllMembers() ret="" for x in members: @@ -967,7 +1015,7 @@ class MPIWGRoot(ZSQLExtendFolder): return entry - def getTree(self,date=None): + def getTree(self,date=None,onlyActive=None): """generate Tree from project list""" returnList=[] @@ -981,9 +1029,14 @@ class MPIWGRoot(ZSQLExtendFolder): #title=project[0].WEB_title title=[project[0].getContent('WEB_title')] #print title - if idNr[0]!="x": + + if idNr[0]=="x": # kompatibilitŠt mit alter Konvention, x vor der Nummer macht project inactive + project[0].setActiveFlag(False) + + if onlyActive and project[0].isActiveProject(): #nur active projekte returnList.append((depth,nr,title,project[0])) - + elif not onlyActive: + returnList.append((depth,nr,title,project[0])) return returnList def formatElementsAsList(self,elements): @@ -1030,7 +1083,7 @@ class MPIWGRoot(ZSQLExtendFolder): ret+="""
  • \n""" if actualDepth==1: - departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group','6':'Research Network'} + departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group','6':'Ind. Research Group','7':'Research Network'} department=element[3].getContent('xdata_05') ret+="""
    %s: """%(department,departmentName[department]) @@ -1100,11 +1153,21 @@ class MPIWGRoot(ZSQLExtendFolder): for idNr in form.keys(): - if not (fields[int(idNr)][3].xdata_05==form[idNr]): - fields[int(idNr)][3].xdata_05=form[idNr] - fields[int(idNr)][3].copyObjectToArchive() - - + + splitted=idNr.split('_') + + if len(splitted)==1: # name des Feldes = idNr, dann Aendere id_nr + if not (fields[int(idNr)][3].xdata_05==form[idNr]): + fields[int(idNr)][3].xdata_05=form[idNr] + fields[int(idNr)][3].copyObjectToArchive() + + if form.has_key(idNr+'_active'): # active flag is set + + fields[int(splitted[0])][3].setActiveFlag(True) + else: + + fields[int(splitted[0])][3].setActiveFlag(False) + if RESPONSE is not None: RESPONSE.redirect('showTree') @@ -1186,8 +1249,10 @@ class MPIWGRoot(ZSQLExtendFolder): """give tuple member /projects""" ret=[] members=self.getAllMembers() + #return str(members) for x in members: + ret+=self.getProjectsOfMember(name=x,date=date) return ret @@ -1255,6 +1320,7 @@ class MPIWGRoot(ZSQLExtendFolder): if splittedNew[0]=='': del splittedNew[0] search=string.join(splittedNew,' AND ') + if not search=='': proj=self.MembersCatalog({'title':search}) @@ -1412,33 +1478,70 @@ class MPIWGProject(CatalogAware,Folder): RESPONSE.redirect('managePublications') - def copyImageToMargin(self,RESPONSE=None): - #TODO: copy more than one image + def copyImageToMargin(self,RESPONSE=None): """copy inline images to marginal images""" - self.getContent('WEB_project_description',filter='yes') + + + #getImages from WEB_project_description + description=self.getContent('WEB_project_description') + + text2=description + splitted=text2.split("""

    """) + + imageURLs=[] + imageCaptions=[] + for split in splitted[1:]: + tmp=split.split("

    ") + #return repr(splitted[1]) + try: + imageURLs.append(tmp[0].split("\"")[1].encode('utf-8')) + except: + imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')) + + split2="

    ".join(tmp[1:]) + - filename=self.imageURL.split("/")[-1] - #lege neues images object an, mit leerem bild + splitted=split2.split("""

    """) + if len(splitted)>1: + tmp=splitted[1].split("

    ") + imageCaptions.append(tmp[0].encode('utf-8')) + + + else: + #keine caption + + imageCaptions.append("") + + - if self.ZopeFind(self,obj_ids=[filename]): - #existiert das bild schon, dann neueun filenamen - filename="project_image_"+filename - - self.addImage(None,self.imagecap,filename=filename) - #hole die bilddaten aus der url - url=self.absolute_url()+"/"+self.imageURL - #url=self.absolute_url()+"/"+filename - try:#relative url - data=urllib.urlopen(url).read() - except: - try:#absolute - data=urllib.urlopen(self.imageURL).read() + + + + #eintragen: + for imageURL in imageURLs: + filename=imageURL.split("/")[-1] + #lege neues images object an, mit leerem bild + + if self.ZopeFind(self,obj_ids=[filename]): + #existiert das bild schon, dann neuen filenamen + filename="project_image_"+filename + + self.addImage(None,imageCaptions[imageURLs.index(imageURL)],filename=filename) + #hole die bilddaten aus der url + url=self.absolute_url()+"/"+imageURL + #url=self.absolute_url()+"/"+filename + + try:#relative url + data=urllib.urlopen(url).read() except: - zLOG.LOG("MPIWG Project",zLOG.ERROR,"can't open: %s"%url) + try:#absolute + data=urllib.urlopen(self.imageURL).read() + except: + zLOG.LOG("MPIWG Project",zLOG.ERROR,"can't open: %s"%url) - obj=getattr(self,filename) - obj.update_data(data) + obj=getattr(self,filename) + obj.update_data(data) if RESPONSE: RESPONSE.redirect('manageImages') @@ -1565,6 +1668,17 @@ class MPIWGProject(CatalogAware,Folder): if RESPONSE: RESPONSE.redirect('manageImages') + + def hasChildren(self,date=None,onlyActive=True): + """check if project has children""" + ct=self.getContexts(childs=self.getContent('xdata_05'), + depth=1,date=date,onlyActive=onlyActive) + + if ct and len(ct)>0: + return True + else: + return False + def addImage(self,fileHd,caption,RESPONSE=None,filename=None): """add an MPIWG_Project_image""" @@ -1722,6 +1836,8 @@ class MPIWGProject(CatalogAware,Folder): self.creationTime=time.strftime("%Y%m%d%H%M%S",time.localtime())[0:] self.id=id self.title=id + self.isActiveFlag=True #Flag is true is the project is still active, False if accomplished + if argv: for arg in definedFields: try: @@ -1742,6 +1858,14 @@ class MPIWGProject(CatalogAware,Folder): ) + def isActiveProject(self): + """check if the project is still active, default is true, set to false is the project is accomplished""" + return getattr(self,'isActiveFlag',True) + + def setActiveFlag(self,status=True): + """set the active flag""" + self.isActiveFlag=status + def checkDate(self,date): """teste ob zum Zeitpunkt date eine andere version existierte""" @@ -1782,7 +1906,106 @@ class MPIWGProject(CatalogAware,Folder): """warnung: project noch nicht existent""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self) return pt() - + + def getGetNeighbourhood(self,wordStr, length=100): + """finde umgebung um die worte in wordStr, zurŸckgegeben 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 grš§e der Umgebung + """ + + ret=[] # nimmt das Array auf, dass spŠter zurŸckgegeben wird + ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt + + def isInRanges(nr,length): + """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurŸck, + -1, wenn kein Treffer + + @param nr: Position die geprŸft werden soll + @param length: LŠnge des Wortes das geprŸft 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=self.harvest_page() + + 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 vergrš§ere diese + x=min(ranges[nr][0],x) + y=max(ranges[nr][1],y) + + str=txt[x:y] + + 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 hinzufŸgen + ranges.append((x,y)) + + ret.append(str) + + pos=pos+len(word) + else: + break; + + # now highlight everything + 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 harvest_page(self,context=None): + """seite fuer harvesting fuer die Projektsuche""" + if not context: + context=self + + if self.isActiveProject() and self.isActual(): + ext=getattr(self,"harvest_main",None) + if ext: + return getattr(self,ext.getId())() + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context) + + + return pt() + def index_html(self,request=True,context=None): """show homepage""" if not context: @@ -2011,6 +2234,10 @@ class MPIWGProject(CatalogAware,Folder): setattr(self,x,[self.REQUEST[x].decode('utf-8')]) + if self.REQUEST.has_key('active'): + self.setActiveFlag(True) + else: + self.setActiveFlag(False) if fromEdit and (RESPONSE is not None): RESPONSE.redirect('./editMPIWGBasisEditor') @@ -2147,4 +2374,4 @@ def manage_addMPIWGProject(self,id,RESPO if RESPONSE is not None: - RESPONSE.redirect('manage_main') + RESPONSE.redirect('manage_main') \ No newline at end of file