--- MPIWGWeb/MPIWGProjects.py 2007/10/18 12:00:17 1.47.2.79 +++ MPIWGWeb/MPIWGProjects.py 2008/06/18 11:29:25 1.47.2.80 @@ -530,6 +530,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: @@ -1084,10 +1086,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 @@ -1103,10 +1116,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 @@ -1147,24 +1175,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)) + + + fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive) - for idNr in form.keys(): + 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') @@ -1227,13 +1280,17 @@ class MPIWGRoot(ZSQLExtendFolder): 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: @@ -1289,28 +1346,27 @@ class MPIWGRoot(ZSQLExtendFolder): return ret - def getProjectsOfMember(self,name=None,key=None,date=None): + def getProjectsOfMember(self,name=None,key=None,date=None,onlyArchived=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 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") + ret=[] 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 - + return ret splitted = [members[0].lastName,members[0].firstName] elif name: @@ -1319,15 +1375,13 @@ class MPIWGRoot(ZSQLExtendFolder): 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 ') proj=self.ProjectCatalog({'xdata_01':search}) - logging.error("XXXXXXXXXXX %s"%proj) + if proj: proj2=[] for x in proj: @@ -1350,8 +1404,23 @@ class MPIWGRoot(ZSQLExtendFolder): proj2.sort(sortP) - if len(proj2)>0: - ret.append((name,proj2)) + projectListe=[] + + for proj in proj2: + obj=proj.getObject() + if onlyArchived==1: #nur aktuell projecte + if not obj.isArchivedProject(): + projectListe.append(proj) + elif onlyArchived==2: #nur archivierte + if obj.isArchivedProject(): + projectListe.append(proj) + else: #alle + projectListe.append(proj) + + + + if len(projectListe)>0: + ret.append((name,projectListe)) return ret @@ -1849,7 +1918,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) @@ -2043,11 +2112,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""" @@ -2429,6 +2581,10 @@ 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"))