Mercurial > hg > MPIWGWeb
changeset 51:d456fe185649
more work on projects. more cleanup.
author | casties |
---|---|
date | Tue, 30 Apr 2013 12:49:26 +0200 |
parents | e30a4bd074db |
children | 1ed79b33200c |
files | MPIWGProjects.py MPIWGRoot.py MPIWGRoot_deleted_methods.py |
diffstat | 3 files changed, 380 insertions(+), 308 deletions(-) [+] |
line wrap: on
line diff
--- a/MPIWGProjects.py Mon Apr 29 20:34:17 2013 +0200 +++ b/MPIWGProjects.py Tue Apr 30 12:49:26 2013 +0200 @@ -584,6 +584,8 @@ pass + # invalidate thumbnail + self.projectThumb = None pt = PageTemplateFile('zpt/project/edit_images', globals()).__of__(self) return pt() @@ -832,8 +834,7 @@ # invalidate thumbnail self.projectThumb = None - if RESPONSE is not None: - + if RESPONSE is not None: self.redirect(RESPONSE, 'manageImages') @@ -1684,6 +1685,7 @@ if tree is None: tree = HashTree(keySeparator='.', keyFn=getInt) for p in self.objectValues(spec='MPIWGProject'): + # add all projects tree.add(p.getNumber(), p) self._v_projectTree = tree @@ -1692,7 +1694,7 @@ return tree - def getProjectsAsList(self, start, active=1, archived=1): + def getProjectsAsList(self, start=None, active=1, archived=1): """Return flattened list of projects, starting from start. active = 0 : all projects @@ -1749,6 +1751,76 @@ return projects + security.declareProtected('View management screens', 'changeProjectTree') + def changeProjectTree(self, RESPONSE=None): + """change the complete tree""" + form=self.REQUEST.form + hashList={} + onlyArchived=int(form.get("onlyArchived",0)) + onlyActive=int(form.get("onlyActive",0)) + dep=form.get("dep",None) + + fields = self.getProjectsAsList(start=dep, archived=onlyArchived, active=onlyActive) + + logging.info("GOT TREE!----------------------------------------------------") + for field in form.keys(): + + splitted=field.split('_') + if (len(splitted)>1) and (splitted[1]=="runningNumber"): + #feld hat die Form Nummer_name und runnignNumber + nr=int(splitted[0]) # nummer des Datensatzes + project = fields[nr] + + # + # change active + # + if form.has_key('%s_active'%nr): # active flag is set + project.setActiveFlag(True) + else: + project.setActiveFlag(False) + + # + # nummer hat sich geaendert + # + entryChanged = False; + pronum = project.getNumber() + formnum = form['%s_number'%nr] + + if not (pronum == formnum): + logging.debug("Changed!Number+++++++++++++++++++++++++++++++++") + logging.debug(repr(fields[nr].xdata_05)+" ---> "+ repr(form[str(nr)+'_number'])) + entryChanged = True + + # + # completed hat sich geaendert + # + td = project.transformDate # hole die funktion zum transformieren des datums + formstarted = form[str(nr)+'_started'] + formcompleted = form[str(nr)+'_completed'] + + if not (td(project.getCompletedAt()) == td(formcompleted)): + logging.info(repr(td(project.getCompletedAt()))+" ---> "+ repr(td(form[str(nr)+'_completed']))) + logging.info("Changed!Completed+++++++++++++++++++++++++++++++++") + entryChanged = True + + if not (td(project.getStartedAt()) == td(formstarted)): + logging.info(repr(td(project.getStartedAt()))+" ---> "+ repr(td(form[str(nr)+'_started']))) + logging.info("Changed!Started+++++++++++++++++++++++++++++++++") + entryChanged = True + + if entryChanged: + logging.info("Changed!+++++++++++++++++++++++++++++++++") + project.copyObjectToArchive() + project.xdata_05 = formnum + project.setCompletedAt(formcompleted) + project.setStartedAt(formstarted) + # reset tree + self._v_projectTree = None + + if RESPONSE is not None: + RESPONSE.redirect(self.en.MPIWGrootURL()+'/admin/showTree') + + security.declareProtected('View management screens', 'updateAllProjectMembers') def updateAllProjectMembers(self, updateResponsibleScientistsList=False): """Re-create responsibleScientistsLists and projects_members table from all current projects."""
--- a/MPIWGRoot.py Mon Apr 29 20:34:17 2013 +0200 +++ b/MPIWGRoot.py Tue Apr 30 12:49:26 2013 +0200 @@ -121,23 +121,6 @@ return bt - def versionHeaderEN(self): - """version header text""" - - date= self.REQUEST.get('date',None) - if date: - txt="""<h2>This pages shows the project which existed at %s</h2>"""%str(date) - return txt - return "" - - def versionHeaderDE(self): - """version header text""" - date= self.REQUEST.get('date',None) - if date: - txt="""<h2>Auf dieser Seite finden Sie die Projekte mit Stand vom %s</h2>"""%str(date) - return "" - - def createOrUpdateId_raw(self): """create sequence to create ids for bibliography""" debug=None @@ -165,22 +148,6 @@ splitted=url.split("/") return splitted[4] - def generateUrlProject(self,url,project=None): - """erzeuge aus absoluter url, relative des Projektes""" - if project: - splitted=url.split("/") - length=len(splitted) - short=splitted[length-2:length] - - base=self.REQUEST['URL3']+"/"+"/".join(short) - - else: - findPart=url.find("/projects/") - base=self.REQUEST['URL1']+"/"+url[findPart:] - - - return base - def isNewCapital(self,text=None,reset=None): if text: @@ -406,34 +373,6 @@ """quote""" return urllib.unquote(str) - - - def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None): - """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents""" - def sort(x,y): - return cmp(x.WEB_title[0],y.WEB_title[0]) - - if type(fieldContentsEntry) is StringType: - fieldContentsTmp=[fieldContentsEntry] - else: - fieldContentsTmp=fieldContentsEntry - - fieldContents=[] - for x in fieldContentsTmp: - fieldContents.append(" AND ".join(x.split())) - projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')}) - #print projects - #ret=[x for x in projects] - ret=[] - for x in projects: - obj=x.getObject() - obj=obj.getActualVersion(date) - if obj and (not getattr(obj,'invisible',None)): - #if not (x in ret): - ret.append(x) - - ret.sort(sort) - return ret def changeMPIWGRootForm(self): """edit""" @@ -534,50 +473,6 @@ - - def getProjectFields(self,fieldName,date=None,folder=None,sort=None): - """getListofFieldNames""" - ret=[] - - objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0) - - - for object in objects: - obj=object[1] - obj=obj.getActualVersion(date) - if obj and (not getattr(obj,'invisible',None)): - if fieldName=="WEB_title_or_short": - - if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer - fieldNameTmp="WEB_title" - else: - fieldNameTmp="xdata_07" - else: - fieldNameTmp=fieldName - - ret.append((obj,obj.getContent(fieldNameTmp))) - - - if sort=="int": - ret.sort(sortI) - elif sort=="stopWords": - - ret.sort(sortStopWords(self)) - - else: - ret.sort(sortF) - - return ret - - def showNewProjects(self): - projects=[] - for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets - if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""): - - projects.append(objs) - - return projects - def updatePublicationDB(self,personId=None): """updates the publication db, i.e. copy year and type into the main table""" @@ -814,43 +709,6 @@ - def reindexCatalogs(self,RESPONSE=None): - """reindex members and project catalog""" - - - try: - - self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) - logger("MPIWG Root (reindexCatalog: projects)",logging.INFO,"DONE") - except: - 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]) -# -# -# -# - - - if RESPONSE: - RESPONSE.redirect('manage_main') - - - def getAllMembers(self): #ret=[] @@ -900,171 +758,8 @@ rss+="""</channel> </rss>""" - return rss - 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 - - department fuer das Tree geholt werden soll - """ - logging.debug("MPIWGRoot.getTree()") - - 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 - if not idNr=="": - splittedId=idNr.split(".") - depth=len(splittedId) - nr=idNr - #title=project[0].WEB_title - title=[project[0].getContent('WEB_title')] - #print title - - if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive - project[0].setActiveFlag(False) - - if (not dep) or (splittedId[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. - - 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 - - - - def changePosition(self,treeId,select,RESPONSE=None): - """Change Postion Entry""" - numbers=[] - - # Suche hoechste bisherige nummer - projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05 - #print "pj",projects - for project in projects: #suche alle subtrees der treeId - #print treeId - - founds=re.match(treeId+"\.(.*)",project[1].split(";")[0]) - if founds: - #print "x",founds.group(0),len(founds.group(0).split(".")) - if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene - try: - numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1])) - except: - numbers.append(int(0)) - - try: - highest=max(numbers) - except: - highest=0 - projects=self.showNewProjects() - for i in self.makeList(select): - highest+=10 - projects[int(i)][0].xdata_05=treeId+"."+str(highest) - - - if RESPONSE is not None: - RESPONSE.redirect('showTree') - - def changeTree(self,RESPONSE=None): - """change the complete tree""" - form=self.REQUEST.form - hashList={} - onlyArchived=int(form.get("onlyArchived",0)) - onlyActive=int(form.get("onlyActive",0)) - dep=form.get("dep",None) - - fields=self.getTree(dep=dep,onlyArchived=onlyArchived,onlyActive=onlyActive) - - logging.info("GOT TREE!----------------------------------------------------") - for field in form.keys(): - - splitted=field.split('_') - if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber - - - 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[nr][3].setActiveFlag(False) - - #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 - - 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 (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 - - - if entryChanged: - logging.info("Changed!+++++++++++++++++++++++++++++++++") - fields[nr][3].copyObjectToArchive() - - - if RESPONSE is not None: - RESPONSE.redirect('showTree') - - def getProjectWithId(self,id): - fields=self.getProjectFields('xdata_05') - for field in fields: - if field[1]==id: - return field[0] - - return None - - - def getRelativeUrlFromPerson(self,list): """get urls to person list"""
--- a/MPIWGRoot_deleted_methods.py Mon Apr 29 20:34:17 2013 +0200 +++ b/MPIWGRoot_deleted_methods.py Tue Apr 30 12:49:26 2013 +0200 @@ -508,3 +508,308 @@ else: return True + + 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, Titel, 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 + + department fuer das Tree geholt werden soll + """ + logging.debug("MPIWGRoot.getTree()") + + 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 + if not idNr=="": + splittedId=idNr.split(".") + depth=len(splittedId) + nr=idNr + #title=project[0].WEB_title + title=[project[0].getContent('WEB_title')] + #print title + + if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive + project[0].setActiveFlag(False) + + if (not dep) or (splittedId[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. + + 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 + + def changePosition(self,treeId,select,RESPONSE=None): + """Change Postion Entry""" + numbers=[] + + # Suche hoechste bisherige nummer + projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05 + #print "pj",projects + for project in projects: #suche alle subtrees der treeId + #print treeId + + founds=re.match(treeId+"\.(.*)",project[1].split(";")[0]) + if founds: + #print "x",founds.group(0),len(founds.group(0).split(".")) + if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene + try: + numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1])) + except: + numbers.append(int(0)) + + try: + highest=max(numbers) + except: + highest=0 + projects=self.showNewProjects() + for i in self.makeList(select): + highest+=10 + projects[int(i)][0].xdata_05=treeId+"."+str(highest) + + if RESPONSE is not None: + RESPONSE.redirect('showTree') + + def changeTree(self,RESPONSE=None): + """change the complete tree""" + form=self.REQUEST.form + hashList={} + onlyArchived=int(form.get("onlyArchived",0)) + onlyActive=int(form.get("onlyActive",0)) + dep=form.get("dep",None) + + fields=self.getTree(dep=dep,onlyArchived=onlyArchived,onlyActive=onlyActive) + + logging.info("GOT TREE!----------------------------------------------------") + for field in form.keys(): + + splitted=field.split('_') + if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber + + + 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[nr][3].setActiveFlag(False) + + #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 + + 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 (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 + + + if entryChanged: + logging.info("Changed!+++++++++++++++++++++++++++++++++") + fields[nr][3].copyObjectToArchive() + + + if RESPONSE is not None: + RESPONSE.redirect('showTree') + + + + def getProjectWithId(self,id): + fields=self.getProjectFields('xdata_05') + for field in fields: + if field[1]==id: + return field[0] + + return None + + + + def reindexCatalogs(self,RESPONSE=None): + """reindex members and project catalog""" + + + try: + + self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + logger("MPIWG Root (reindexCatalog: projects)",logging.INFO,"DONE") + except: + 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]) +# +# +# +# + + + if RESPONSE: + RESPONSE.redirect('manage_main') + + + + def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None): + """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents""" + def sort(x,y): + return cmp(x.WEB_title[0],y.WEB_title[0]) + + if type(fieldContentsEntry) is StringType: + fieldContentsTmp=[fieldContentsEntry] + else: + fieldContentsTmp=fieldContentsEntry + + fieldContents=[] + for x in fieldContentsTmp: + fieldContents.append(" AND ".join(x.split())) + projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')}) + #print projects + #ret=[x for x in projects] + ret=[] + for x in projects: + obj=x.getObject() + obj=obj.getActualVersion(date) + if obj and (not getattr(obj,'invisible',None)): + #if not (x in ret): + ret.append(x) + + ret.sort(sort) + return ret + + + def getProjectFields(self,fieldName,date=None,folder=None,sort=None): + """getListofFieldNames""" + ret=[] + + objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0) + + + for object in objects: + obj=object[1] + obj=obj.getActualVersion(date) + if obj and (not getattr(obj,'invisible',None)): + if fieldName=="WEB_title_or_short": + + if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer + fieldNameTmp="WEB_title" + else: + fieldNameTmp="xdata_07" + else: + fieldNameTmp=fieldName + + ret.append((obj,obj.getContent(fieldNameTmp))) + + + if sort=="int": + ret.sort(sortI) + elif sort=="stopWords": + + ret.sort(sortStopWords(self)) + + else: + ret.sort(sortF) + + return ret + + def showNewProjects(self): + projects=[] + for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets + if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""): + + projects.append(objs) + + return projects + + def generateUrlProject(self,url,project=None): + """erzeuge aus absoluter url, relative des Projektes""" + if project: + splitted=url.split("/") + length=len(splitted) + short=splitted[length-2:length] + + base=self.REQUEST['URL3']+"/"+"/".join(short) + + else: + findPart=url.find("/projects/") + base=self.REQUEST['URL1']+"/"+url[findPart:] + + + return base + + + def versionHeaderEN(self): + """version header text""" + + date= self.REQUEST.get('date',None) + if date: + txt="""<h2>This pages shows the project which existed at %s</h2>"""%str(date) + return txt + return "" + + def versionHeaderDE(self): + """version header text""" + date= self.REQUEST.get('date',None) + if date: + txt="""<h2>Auf dieser Seite finden Sie die Projekte mit Stand vom %s</h2>"""%str(date) + return "" + + +