--- MPIWGWeb/MPIWGProjects.py 2008/06/20 07:45:57 1.47.2.82 +++ MPIWGWeb/MPIWGProjects.py 2008/06/24 07:55:05 1.47.2.83 @@ -330,7 +330,30 @@ class MPIWGRoot(ZSQLExtendFolder): folders=['MPIWGProject','Folder','ECHO_Navigation'] meta_type='MPIWGRoot' - + 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'): + proj.responsibleScientistsList=[] + + for person in persons.items(): + logging.info("XXXX"+repr(person)) + if len(person[1]) >1: #nicht eindeutig + ret+="nicht eindeutig --- %s: %s\n"%(proj.getId(),person[0]) + + elif len(person[1]) ==0: #kein eintrage + ret+="kein eintrag--- %s: %s\n"%(proj.getId(),person[0]) + proj.responsibleScientistsList.append((person[0],"")) + else: + proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey())) + + return ret + def harvestProjects(self): """harvest""" folder="/tmp" @@ -581,8 +604,12 @@ class MPIWGRoot(ZSQLExtendFolder): def isActual(self,project): """checke if project is actual""" actualTime=time.localtime() - obj= project.getObject() + if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList + obj=project.getObject() + else: + obj=project + if getattr(obj,'archiveTime',actualTime)< actualTime: return False else: @@ -1063,12 +1090,17 @@ class MPIWGRoot(ZSQLExtendFolder): def getAllMembers(self): #ret=[] + def sorter(x,y): + return cmp(x[0],y[0]) + results=self.MembersCatalog({'isPublished':True}) - ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results] + ret=[(", ".join([proj.lastName, proj.firstName]).decode('utf-8'),proj.getKey) for proj in results] - ret.sort() + ret.sort(sorter) return ret + + def printAllMembers(self): """print""" members=self.getAllMembers() @@ -1263,77 +1295,89 @@ class MPIWGRoot(ZSQLExtendFolder): ret.append("%s"%person) return string.join(ret,";") - - def getMembersFromList(self,list): - """get member names from person full text list""" - memberlist=[] - persons=list.split(";") - for person in persons: - if len(person)>1: #nicht nur Trennzeichen - splitted=person.split(",") - if len(splitted)==1: - splitted=person.lstrip().rstrip().split(" ") - splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] - if splittedNew[0]=='': - del splittedNew[0] - search=string.join(splittedNew,' AND ') - - if not search=='': - try: - - member=self.MembersCatalog({'title':search}) - - except: - member=None - if member: - logging.error("search publ %s:"%member[0].getObject().isPublished()) - if member and (member[0].getObject().isPublished()): - if person =="Otto Sibum" : person="H. Otto Sibum" - if person =="Norton Wise" : person="M. Norton Wise" - - #memberlist.append("%s"%(member[0].absolute_url,person.encode('utf-8'))) - memberlist.append((person, member[0].getObject().getId())) - else: - #memberlist.append("%s"%person.encode('utf-8')) - memberlist.append((person,None)) - return memberlist - - def getUrlFromPerson(self,list): - """get urls to person list""" - ret=[] - persons=list.split(";") - for person in persons: - - if len(person)>1: #nicht nur Trennzeichen - splitted=person.split(",") - if len(splitted)==1: - splitted=person.lstrip().rstrip().split(" ") - splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] - if splittedNew[0]=='': - del splittedNew[0] - search=string.join(splittedNew,' AND ') - - if not search=='': - - try: - proj=self.MembersCatalog({'title':search}) - except: - proj=None + def getMemberIdFromKey(self,key): + """gibt die ensprechende id im members Ordner zum key""" + + if key=="": + return "" + catalogged=self.MembersCatalog({'getKey':key}) + if len(catalogged)==0: + return "" + else: + return catalogged[0].getObject().getId() + - if proj and (proj[0].getObject().isPublished()): - if person =="Otto Sibum" : person="H. Otto Sibum" - if person =="Norton Wise" : person="M. Norton Wise" - #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8'))) - if self.MPIWGrootURL().split("/")[-1]=='en': - tmpPath="/en/staff/members/" - else: - tmpPath="/de/mitarbeiter/members/" - ret.append("%s"%(tmpPath+proj[0].getObject().getId()+"/index.html",person)) - else: - #ret.append("%s"%person.encode('utf-8')) - ret.append("%s"%person) - return string.join(ret,";") + +# def getMembersFromList(self,list): +# """get member names from person full text list""" +# memberlist=[] +# persons=list.split(";") +# for person in persons: +# if len(person)>1: #nicht nur Trennzeichen +# splitted=person.split(",") +# if len(splitted)==1: +# splitted=person.lstrip().rstrip().split(" ") +# splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] +# if splittedNew[0]=='': +# del splittedNew[0] +# search=string.join(splittedNew,' AND ') +# +# if not search=='': +# try: +# +# member=self.MembersCatalog({'title':search}) +# +# except: +# member=None +# if member: +# logging.error("search publ %s:"%member[0].getObject().isPublished()) +# if member and (member[0].getObject().isPublished()): +# if person =="Otto Sibum" : person="H. Otto Sibum" +# if person =="Norton Wise" : person="M. Norton Wise" +# +# #memberlist.append("%s"%(member[0].absolute_url,person.encode('utf-8'))) +# memberlist.append((person, member[0].getObject().getId())) +# else: +# #memberlist.append("%s"%person.encode('utf-8')) +# memberlist.append((person,None)) +# return memberlist +# def getUrlFromPerson(self,list): +# """get urls to person list""" +# ret=[] +# persons=list.split(";") +# for person in persons: +# +# if len(person)>1: #nicht nur Trennzeichen +# splitted=person.split(",") +# if len(splitted)==1: +# splitted=person.lstrip().rstrip().split(" ") +# splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] +# if splittedNew[0]=='': +# del splittedNew[0] +# search=string.join(splittedNew,' AND ') +# +# if not search=='': +# +# try: +# proj=self.MembersCatalog({'title':search}) +# except: +# proj=None +# +# if proj and (proj[0].getObject().isPublished()): +# if person =="Otto Sibum" : person="H. Otto Sibum" +# if person =="Norton Wise" : person="M. Norton Wise" +# #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8'))) +# if self.MPIWGrootURL().split("/")[-1]=='en': +# tmpPath="/en/staff/members/" +# else: +# tmpPath="/de/mitarbeiter/members/" +# ret.append("%s"%(tmpPath+proj[0].getObject().getId()+"/index.html",person)) +# else: +# #ret.append("%s"%person.encode('utf-8')) +# ret.append("%s"%person) +# return string.join(ret,";") +# def getProjectsOfMembers(self,date=None): """give tuple member /projects""" ret=[] @@ -1341,14 +1385,15 @@ class MPIWGRoot(ZSQLExtendFolder): #return str(members) for x in members: - - ret+=self.getProjectsOfMember(name=x,date=date) + projects=self.getProjectsOfMember(key=x[1],date=date) + if len(projects)>0: + ret.append((x[0],projects)) return ret - def getProjectsOfMember(self,name=None,key=None,date=None,onlyArchived=1,onlyActive=1): + def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1): """get projects of a member - @param name: (optional)Vorname + Nachname + @param key: (optional) Key zur Idenfikation des Benutzer @param date: (optional) Version die zum Zeitpunkt date gueltig war @param onlyArchived: @@ -1362,48 +1407,23 @@ class MPIWGRoot(ZSQLExtendFolder): return cmp(x.WEB_title,y.WEB_title) ret=[] - if key: - - members=self.MembersCatalog({'getKey':key}) - if len(members)==0: - return ret - splitted = [members[0].lastName,members[0].firstName] - - elif name: - - splitted=name.split(",") + if key: + proj=self.ProjectCatalog({'getPersonKeyList':key}) else: - return ret # name oder key mussen definiert sein + return ret # key muss definiert sein - splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] - - search=string.join(splitNeu,' AND ') - - proj=self.ProjectCatalog({'xdata_01':search}) - if proj: proj2=[] for x in proj: - if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''): - # furchtbarer hack um sicher zustellen dass christoph hoffmann nicht mit Dieter Hoffmann verwechselt wird. - - if not((splitted[1]=="Christoph") and (splitted[0]=="Hoffmann") and ( (("%s"%x.WEB_title).find('Einstein')>0) or (("%s"%x.WEB_title).find('Quantum')>0))): - logging.info("XXXXXXXXXXXXXXXXXXXXXXXX") - proj2.append(x) + if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''): + proj2.append(x) else: proj2=[] - proj=self.ProjectCatalog({'xdata_08':search}) - if proj: - names=[x.WEB_title for x in proj] - for x in proj: - - if (not x.WEB_title in names) and (getattr(x.getObject(),'archiveTime','')==''): - proj2.append(x) - - + + proj2.sort(sortP) projectListe=[] @@ -1433,12 +1453,10 @@ class MPIWGRoot(ZSQLExtendFolder): add=add & True if add: - projectListe.append(proj) + projectListe.append(obj) - if len(projectListe)>0: - ret.append((name,projectListe)) - - return ret + + return projectListe def givePersonList(self,name): """check if person is in personfolder and return list of person objects""" @@ -2104,6 +2122,7 @@ class MPIWGProject(CatalogAware,Folder): self.id=id self.title=id self.isActiveFlag=True #Flag is true is the project is still active, False if accomplished + self.responsibleScientistsList=[] # enthaelt die Lister der verantwortlichen Wissenschaftler in der Form (NAME, KEY), key ist "" flass Wissenschaftler nicht an unserem Haus if argv: for arg in definedFields: @@ -2584,7 +2603,64 @@ class MPIWGProject(CatalogAware,Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProject.zpt')).__of__(self) return pt() - + def isResponsibleScientist(self,key): + """teste ob eine Person in der Liste der respl. scientists auftaucht""" + #logging.info("XXXXXXXXXXXXX"+repr(self.responsibleScientistsList)) + + + keys = [x[1] for x in getattr(self,"responsibleScientistsList",[])] + + if key in keys: + return True + else: + return False + + def getPersonKeyList(self): + """gibt die key Lister der beteiligten Personen zurŸck""" + return [x[1] for x in getattr(self,'responsibleScientistsList',[])] + + + + + def identifyNames(self,nameList): + """Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname + und ordnet diese dann Mitarbeiter IDs zu falls es schone eine Liste gibt wird im Projekte gibt wird diese Upgedated. + @param nameList + """ + nameList=nameList.replace(";",",") # falls ; als Trenner ersetze + names=nameList.split(",") + + returnNamesDict={} + + + for name in names: + name=name.lstrip().rstrip() + nameSplitted = name.split(" ") + if len(nameSplitted)>1: #vor und nachname angegeben) + + lastname=nameSplitted[-1] + firstname=nameSplitted[0] + else: + firstname ="" + lastname=nameSplitted[0] + + #finde Mitarbeiter mit den entsprechenden Name + logging.info("Search: %s %s %s"%(name,firstname,lastname)) + cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname) + + #Teste ob die ensprechenden Namen schon der Liste zu geordnet sind + #if not hasattr(self,'responsibleScientistsList'): + # self.responsibleScientistsList={} + # + # if name in self.responsibleScientistsList.values() + + if len(cataloggedNames)>0: + returnNamesDict[name]=cataloggedNames + else: + returnNamesDict[name]=[] + + return returnNamesDict + def editMPIWGProject(self,RESPONSE=None,fromEdit=None): """edit the project and archive the old version""" @@ -2596,6 +2672,8 @@ class MPIWGProject(CatalogAware,Folder): setattr(self,x,[self.REQUEST[x].decode('utf-8')]) + + completedAt = self.REQUEST.get('completedAt') if not self.setCompletedAt(completedAt): @@ -2608,9 +2686,30 @@ class MPIWGProject(CatalogAware,Folder): self.setActiveFlag(True) else: self.setActiveFlag(False) + + self.responsibleScientistsList=[] # setze die Liste der verantwortlichen Wissenschaftler zurueck + + names={} + keys={} + tmpList=[] + for key in self.REQUEST.keys(): #gehe durch das Formular + splitted=key.split("_") + if splitted[0]=="responsibleScientist": #wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt + nr=splitted[2] + if splitted[1]=="name": + names[nr]=self.REQUEST[key] + elif splitted[1]=="key": + keys[nr]=self.REQUEST[key] + + + for nr in names.keys(): + tmpList.append((names[nr],keys.get(nr,""))) + + self.responsibleScientistsList=tmpList if fromEdit and (RESPONSE is not None): - RESPONSE.redirect('./editMPIWGBasisEditor') - + #RESPONSE.redirect('./editMPIWGBasisEditor') + return self.editMPIWGBasisEditor(identifiedNames=self.identifyNames(self.REQUEST.get('xdata_01',''))) + else: if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -2673,10 +2772,15 @@ class MPIWGProject(CatalogAware,Folder): return 0 security.declareProtected('View management screens','editMPIWGBasisEditor') - def editMPIWGBasisEditor(self): + def editMPIWGBasisEditor(self, identifiedNames=None): + """editform""" + if not identifiedNames: + identifiedNames=self.identifyNames(self.getContent('xdata_01')) + # identifiedNames=self.getFullNameEntries() + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self) - return pt() + return pt(identifiedNames=identifiedNames) security.declareProtected('View management screens','editMPIWGBasisForm') def editMPIWGBasisForm(self):