--- MPIWGWeb/MPIWGProjects.py 2007/04/18 17:17:55 1.47.2.72 +++ MPIWGWeb/MPIWGProjects.py 2008/06/24 07:55:05 1.47.2.83 @@ -110,6 +110,29 @@ def sortI(x,y): except: return cmp(x[1],y[1]) + +def unicodify(str): + """decode str (utf-8 or latin-1 representation) into unicode object""" + 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 utf8ify(str): + """encode unicode object or string into byte string in utf-8 representation""" + if not str: + return "" + if type(str) is StringType: + return str + else: + return str.encode('utf-8') + + class MPIWGLink(SimpleItem): """create a symbolic link to another page""" @@ -307,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" @@ -330,15 +376,22 @@ class MPIWGRoot(ZSQLExtendFolder): if not str: return "" if type(str) is StringType: - try: - return str.decode('utf-8') - except: - return str.decode('latin-1') + try: + return str.decode('utf-8') + except: + return str.decode('latin-1') else: - return str + def getat(self,array,idx=0,default=None): + """return array element idx or default (but no exception)""" + if len(array) <= idx: + return default + else: + return array[idx] + + def browserCheck(self): """check the browsers request to find out the browser type""" bt = {} @@ -500,6 +553,8 @@ class MPIWGRoot(ZSQLExtendFolder): """returns the current section name""" root = self.absolute_url() url = self.REQUEST['URL'] + if not url: + return None path = string.replace(url, root, '') paths = path.split('/') if len(paths) > 0: @@ -549,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: @@ -830,21 +889,20 @@ class MPIWGRoot(ZSQLExtendFolder): #create the object e_mail=args[key] try: - newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name.encode('utf-8'),res.first_name.encode('utf-8'),k) + newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name,res.first_name,k) memberFolder._setObject(e_mail,newObj) obj=getattr(memberFolder,e_mail) obj.reindex_object() ret+="Created %s \n"%e_mail created=True except: - msg="Cannot create new user %s (%s %s)"%(e_mail,sys.exc_info()[0],sys.exc_info()[1]) logging.error(msg) ret+=msg+"\n" created=False if created: - qstr="update personal_www set web_object_created='yes',e_mail='%s' where key=%s"%(e_mail,self.ZSQLQuote(k)) + qstr="update personal_www set web_object_created='yes',e_mail='%s@mpiwg-berlin.mpg.de' where key=%s"%(e_mail,self.ZSQLQuote(k)) self.ZSQLQuery(qstr) return ret @@ -891,8 +949,11 @@ class MPIWGRoot(ZSQLExtendFolder): columns=data.keys() for x in ignoreEntries: - columns.remove(x) - + logging.info("ign rem: %s"%x) + try: #falls in ignore entries felder sind, die nicht in columns sind, fange den fehler ab + columns.remove(x) + except: + pass insert=[] @@ -914,6 +975,8 @@ class MPIWGRoot(ZSQLExtendFolder): # self.ZSQLQuery(queryStr) return True,msg + + def updatePersonalwww_doIt(self): """do the update""" args=self.REQUEST.form @@ -924,8 +987,8 @@ class MPIWGRoot(ZSQLExtendFolder): # generate the new entry if news and (len(news)>0): - ret+="

HinzugefŸgt

" - ret+="

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

" + ret+="

Hinzugefügt

" + ret+="

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

" ret+="" # update if len(conflicts.keys())>0: - ret+="

Bei €nderung belassen

" - ret+="

Bitte die Filemaker-db entsprehchend Šndern

" - + ret+="

Änderung des Benutzers übernehmen

" + ret+="

Wenn nötig in Filemaker-db ändern:

" + # konflicte for conflict in conflicts.keys(): ignoreEntries=[] displayIgnored=[] @@ -963,23 +1026,34 @@ class MPIWGRoot(ZSQLExtendFolder): ret+="" self.updatePersonEntry(resultSet[conflict],ignoreEntries=ignoreEntries) - + + # rest + cl=list(conflicts.keys()) + + for key in resultSet.keys(): + if key not in cl: + self.updatePersonEntry(resultSet[key]) return ret+"" + def updateInstitutsbiliography(self): """update the Institutsbibliogrpahy""" self.upDateSQL('personalwww.xml') 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) return pt() + def updatePersonalwww(self,uploadfile): """update personalwww @param uploadfile: file handle auf das file """ - dsn="dbname=personalwww" + dsn=self.getConnectionObj().connection_string + #dsn="dbname=personalwww" resultSet=updatePersonalWWW.importFMPXML(uploadfile) news,conflicts=updatePersonalWWW.checkImport(dsn, resultSet) @@ -1016,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() @@ -1039,10 +1118,21 @@ class MPIWGRoot(ZSQLExtendFolder): return entry - def getTree(self,dep=None,date=None,onlyActive=None): - """generate Tree from project list""" + def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0): + """generate Tree from project list + als Liste, jeder Eintrag ist ein Tupel ,(Tiefe, ProjektNummer,ProjektObject + onlyActive = 0 : alle Projekte + onlyActive = 1 : nur active Projekte + onlyActive = 2: nur inactive Projekte + + onlyArchived=0: alle Projekte + onlyArchived= 1 : nur aktuelle Projekte + onlyArchived = 2: nur archivierte Projekte + """ + returnListTmp=[] returnList=[] + for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05 for idNr in project[1].split(";"): # more than one number @@ -1058,10 +1148,25 @@ class MPIWGRoot(ZSQLExtendFolder): project[0].setActiveFlag(False) if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. - 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])) + + if (onlyActive==0): + returnListTmp.append((depth,nr,title,project[0])) + elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte + returnListTmp.append((depth,nr,title,project[0])) + elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte + returnListTmp.append((depth,nr,title,project[0])) + + + #filter jetzt die Liste nach Archived oder nicht + for entry in returnListTmp: + if (onlyArchived==0): + returnList.append(entry) + elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte + returnList.append(entry) + elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte + returnList.append(entry) + + return returnList @@ -1102,24 +1207,49 @@ class MPIWGRoot(ZSQLExtendFolder): """change the complete tree""" form=self.REQUEST.form hashList={} - fields=self.getTree() - + onlyArchived=int(form.get("onlyArchived",0)) + onlyActive=int(form.get("onlyActive",0)) + - for idNr in form.keys(): + fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive) + + logging.info("GOT TREE!----------------------------------------------------") + for field in form.keys(): - splitted=idNr.split('_') + splitted=field.split('_') + if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber - 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) + + nr=int(splitted[0]) # nummer des Datensatzes + currentEntry = fields[nr] + + if form.has_key(str(nr)+'_active'): # active flag is set + fields[nr][3].setActiveFlag(True) else: - - fields[int(splitted[0])][3].setActiveFlag(False) + fields[nr][3].setActiveFlag(False) + + #nummer hat sich geŠndert + + entryChanged = False; + + + if not (fields[nr][3].xdata_05==form[str(nr)+'_number']): + logging.info("Changed!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'])): + fields[nr][3].setCompletedAt(form[str(nr)+'_completed']) + logging.info("Changed!Completed+++++++++++++++++++++++++++++++++") + entryChanged = True + + + if entryChanged: + logging.info("Changed!+++++++++++++++++++++++++++++++++") + fields[nr][3].copyObjectToArchive() + if RESPONSE is not None: RESPONSE.redirect('showTree') @@ -1165,73 +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 + 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 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 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=[] @@ -1239,76 +1385,78 @@ 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): + 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: + onlyArchived=0: alle Projekte + onlyArchived= 1 : nur aktuelle Projekte + onlyArchived = 2: nur archivierte Projekte """ - # TODO: Die ganze Lšsung + # TODO: Die ganze Loesung def sortP(x,y): """sort by sorting number""" - #print x.xdata_05,y.xdata_05 return cmp(x.WEB_title,y.WEB_title) - - ret=[] - logging.error("XXXXXXXXXXXXXXXXX") - if key: - - #members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1) - members=self.MembersCatalog({'getKey':key}) - if len(members)==0: - return ret - - splitted = [members[0].lastName,members[0].firstName] - - elif name: - - splitted=name.split(",") + ret=[] + if key: + proj=self.ProjectCatalog({'getPersonKeyList':key}) else: - return ret # name oder key mussen definiert sein - - #XXXX - splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] - - #for s in splitted: - # splitNeu.append("\""+s+"\"") - search=string.join(splitNeu,' AND ') + return ret # key muss definiert sein - proj=self.ProjectCatalog({'xdata_01':search}) - logging.error("XXXXXXXXXXX %s"%proj) + 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 (str(x.WEB_title).find('Einstein')>0)): - 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) - if len(proj2)>0: - ret.append((name,proj2)) - - return ret + projectListe=[] + + for proj in proj2: + obj=proj.getObject() + add=False + if onlyArchived==1: #nur aktuell projecte + if not obj.isArchivedProject(): + add=True + elif onlyArchived==2: #nur archivierte + if obj.isArchivedProject(): + add=True + else: #alle + add=True + + if onlyActive==1: #nur active projecte + if obj.isActiveProject(): + add=add & True + else: + add=add & False + + elif onlyArchived==2: #nur nicht aktvive + if not obj.isActiveProject(): + add=add & True + else: #alle + add=add & True + + if add: + projectListe.append(obj) + + + return projectListe def givePersonList(self,name): """check if person is in personfolder and return list of person objects""" @@ -1572,6 +1720,9 @@ class MPIWGProject(CatalogAware,Folder): meta_type='MPIWGProject' default_catalog='ProjectCatalog' + def decode(self,str): + """return unicode object""" + return unicodify(str) def sortedByPlace(self,metatype): """find metatype and sort by place""" @@ -1801,7 +1952,7 @@ class MPIWGProject(CatalogAware,Folder): RESPONSE.redirect('manageImages') - def hasChildren(self,date=None,onlyActive=True): + def hasChildren(self,date=None,onlyActive=1,onlyArchived=1): """check if project has children""" ct=self.getContexts(childs=self.getContent('xdata_05'), depth=1,date=date,onlyActive=onlyActive) @@ -1971,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: @@ -1995,11 +2147,94 @@ 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 isArchivedProject(self): + """check if the project is archived""" + + completed=getattr(self,'completedAt',0) + + #completed leer + if completed=="" : + return False; + if completed == 0: + return False; + + + return True + def setActiveFlag(self,status=True): """set the active flag""" self.isActiveFlag=status + def setCompletedAt(self,date): + """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY""" + logging.info("DATE:"+repr(date)) + transformedDate=self.transformDate(date); + logging.info("transformed"+repr(transformedDate)) + if transformedDate is not None: + setattr(self,"completedAt",transformedDate) + return True; + else: + return False; + + def getCompletedAt(self): + """gibt das transformierte Datum zurŸck""" + date=getattr(self,'completedAt','') + if date: + return self.reTransformDate(date); + else: + return ''; + + def reTransformDate(self,date): + """transformiert , transformdate zurueck""" + year=int(date/10000) + month=int((date-year*10000)/100) + day=int((date-year*10000-month*100)) + return """%s.%s.%s"""%(day,month,year); + + + def transformDate(self,date): + """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach YYYYMMDD, alle nicht angebebenn Werte + werden auf 0 gesetzt, es wird null zurŸckgegeben falls das Datum ungueltig ist""" + + if (date=="" ) : + return ""; + + if (date==None): + return None; + + splitted=date.split(".") + length=len(splitted) + year=0 + month=0 + day=0 + if length > 3: + return ""; + if length==3: + day = int(splitted[0]) + if length>1: + month=int(splitted[length-2]) + + if length > 0: + try: + year = int(splitted[length-1]) + except: + pass + + ## logging.info("month:"+(month)) + if not (0<=month<13): + return None; + + if not(0<=day<32): + return None; + + if (year>0) and (year<1900): #jahr nicht vierstellig eingegeben + year=2000+year; + return year*10000+month*100+day + + + def checkDate(self,date): """teste ob zum Zeitpunkt date eine andere version existierte""" @@ -2258,7 +2493,10 @@ class MPIWGProject(CatalogAware,Folder): if (text5=="
") or (text5=="
"): text5="" - return text5.encode('utf-8') + logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5))) + #return unicodify(text5) + return utf8ify(text5) # return as utf-8 byte string + def showImagesOfPage(self,imageUrl=None): """show Images of project""" @@ -2365,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""" @@ -2377,7 +2672,13 @@ class MPIWGProject(CatalogAware,Folder): setattr(self,x,[self.REQUEST[x].decode('utf-8')]) + + + completedAt = self.REQUEST.get('completedAt') + if not self.setCompletedAt(completedAt): + RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong') + if self.REQUEST.has_key('historicalNames'): self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n")) @@ -2385,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') @@ -2450,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): @@ -2521,4 +2848,4 @@ def manage_addMPIWGProject(self,id,RESPO if RESPONSE is not None: - RESPONSE.redirect('manage_main') \ No newline at end of file + RESPONSE.redirect('manage_main')