--- MPIWGWeb/MPIWGProjects.py 2008/09/03 21:52:14 1.47.2.100 +++ MPIWGWeb/MPIWGProjects.py 2010/07/23 17:30:38 1.47.2.116 @@ -13,6 +13,7 @@ from Globals import package_home import urllib import re import os +import email from types import * import logging import xmlhelper # Methoden zur Verwaltung der projekt xml @@ -20,8 +21,10 @@ from OFS.SimpleItem import SimpleItem from OFS.Folder import Folder from OFS.Image import Image from AccessControl import ClassSecurityInfo +from AccessControl import getSecurityManager from bibliography import * import time +from OFS.Cache import Cacheable #import xml.dom.minidom import sys #from Ft.Xml.XPath import Evaluate @@ -55,6 +58,19 @@ class MPIWGProject_publication(Folder): """publications object fuer project""" meta_type="MPIWGProject_publication" + def redirect(self,RESPONSE,url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" + + timeStamp=time.time() + + if url.find("?")>-1: #giebt es schon parameter + addStr="&time=%s" + else: + addStr="?time=%s" + + RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') + logging.debug(email.Utils.formatdate()+' GMT') + RESPONSE.redirect(url+addStr%timeStamp) def editPublication(self,text=None,image1=None,image2=None,description=None,RESPONSE=None): """edit a publication""" @@ -81,10 +97,10 @@ class MPIWGProject_publication(Folder): nO = Image('publicationImage2','',image2) self._setObject('publicationImage2',nO) - + if RESPONSE: - RESPONSE.redirect("../managePublications") - + self.redirect(RESPONSE,"../managePublications") + class MPIWGProject_image(Image): """Images for Projects""" @@ -109,15 +125,30 @@ class MPIWGProject_image(Image): self.caption=caption[0:] if RESPONSE: - RESPONSE.redirect("../manageImages") + self.redirect(RESPONSE,"../manageImages") -class MPIWGProject(CatalogAware,Folder): +class MPIWGProject(CatalogAware,Folder,Cacheable): """Class for Projects""" - + + def _p_resolveConflict(self, oldState, savedState, newState): + return newState security=ClassSecurityInfo() meta_type='MPIWGProject' default_catalog='ProjectCatalog' + def redirect(self,RESPONSE,url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" + + timeStamp=time.time() + + if url.find("?")>-1: #giebt es schon parameter + addStr="&time=%s" + else: + addStr="?time=%s" + + RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') + logging.debug(email.Utils.formatdate()+' GMT') + RESPONSE.redirect(url+addStr%timeStamp) def decode(self,str): """return unicode object""" @@ -147,7 +178,8 @@ class MPIWGProject(CatalogAware,Folder): self.addPublication(pubSplit) if RESPONSE: - RESPONSE.redirect('managePublications') + + self.redirect(RESPONSE,'managePublications') def copyImageToMargin(self,RESPONSE=None): @@ -216,7 +248,8 @@ class MPIWGProject(CatalogAware,Folder): obj.update_data(data) if RESPONSE: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def manageImages(self,imageName=None,op=None): """managage images""" @@ -295,7 +328,8 @@ class MPIWGProject(CatalogAware,Folder): if RESPONSE: - RESPONSE.redirect("managePublications") + self.redirect(RESPONSE,"managePublications") + def getPublications(self): """get all Publications""" @@ -322,7 +356,8 @@ class MPIWGProject(CatalogAware,Folder): obj.id=name if RESPONSE is not None: - RESPONSE.redirect('managePublications') + + self.redirect(RESPONSE,'managePublications') def getLastPublicationNumber(self): @@ -337,7 +372,8 @@ class MPIWGProject(CatalogAware,Folder): """delete Publication id""" self.manage_delObjects([id]) if RESPONSE: - RESPONSE.redirect('managePublications') + + self.redirect(RESPONSE,'managePublications') def getImages(self): """get all Images""" @@ -369,13 +405,18 @@ class MPIWGProject(CatalogAware,Folder): def deleteImage(self,id,RESPONSE=None): """delete Image id""" - self.manage_delObjects([id]) + try: + self.manage_delObjects([id]) + except: + logging.error("ERROR MPIWG: %s %s"%sys.exc_info()[0:2]) if RESPONSE: - RESPONSE.redirect('manageImages') + self.redirect(RESPONSE,'manageImages') + 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) @@ -404,7 +445,8 @@ class MPIWGProject(CatalogAware,Folder): obj.id=filename if RESPONSE is not None: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def PrincipiaSearchSource(self): """Return cataloguable key for ourselves.""" @@ -475,20 +517,31 @@ class MPIWGProject(CatalogAware,Folder): def copyObjectToArchive(self): """kopiere aktuelles objekt ins archiv""" + logging.info("copytoarchive 1") cb=self.aq_parent.manage_copyObjects(self.getId()) + logging.info("copytoarchive 2") self.manage_pasteObjects(cb) + logging.info("copytoarchive 3") actualTime=time.localtime() self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime)) + logging.info("copytoarchive 4") obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime)) obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime)) + logging.info("copytoarchive 5") ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])] + logging.info("copytoarchive 6") obj.manage_delObjects(ids) + logging.info("copytoarchive 7") def setArchiveTime(self,time): """set Archive Time""" self.archiveTime=time[0:] - + + def delArchiveTime(self): + """delete archive time""" + del self.archiveTime + def versionManageForm(self): """version Manage form:currently only set to invisible""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self) @@ -499,7 +552,8 @@ class MPIWGProject(CatalogAware,Folder): self.invisible=invisible if RESPONSE is not None: - RESPONSE.redirect('manage_main') + + self.redirect(RESPONSE,'manage_main') def crossLinker(self): @@ -535,7 +589,7 @@ class MPIWGProject(CatalogAware,Folder): self._setObject(id,newObj) #self.manage_addPageTemplate(id,title) if RESPONSE is not None: - RESPONSE.redirect('manage_main') + self.redirect(RESPONSE,'manage_main') def __init__(self, id, argv=None): """initiere classe""" @@ -573,7 +627,7 @@ class MPIWGProject(CatalogAware,Folder): def isArchivedProject(self): """check if the project is archived""" - completed=getattr(self,'completedAt',0) + completed=self.getCompletedAt() #completed leer if completed=="" : @@ -610,22 +664,26 @@ class MPIWGProject(CatalogAware,Folder): return True; else: return False; + def getCompletedAt(self): """gibt das transformierte Datum zurueck, an dem das Projekt beendet wurde.""" date=getattr(self,'completedAt','') + if date: return self.reTransformDate(date); else: + return "" # test ob parent abgeschlossen ist - - ct=self.getContexts(parents=self.getContent('xdata_05'),depth=1) - if (len(ct)>0): #is there are parent - - return ct[0][0].getCompletedAt() - return ''; + try: #TODO: ersetzte try except durch vernuenftige abfrage + ct=self.getContexts(parents=self.getContent('xdata_05'),depth=1) + if (len(ct)>0): #is there are parent + return ct[0][0].getCompletedAt() + return ''; + except: + return ''; def getStartedAt(self): - """gibt das transformierte Datum zurŸck, an dem Projekt begonnen wurde.""" + """gibt das transformierte Datum zurueck, an dem Projekt begonnen wurde.""" date=getattr(self,'startedAt','') if date: return self.reTransformDate(date); @@ -646,8 +704,8 @@ class MPIWGProject(CatalogAware,Folder): 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""" + """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach YYYYMMDD, alle nicht angebenen Werte + werden auf 0 gesetzt, es wird null zurueckgegeben falls das Datum ungueltig ist""" if (date==None): return None; @@ -743,9 +801,67 @@ class MPIWGProject(CatalogAware,Folder): return pt() - + def index_html(self,request=True,context=None): """show homepage""" + + bound_names={} + + if not context: + context=self + if request: + if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None: + self.REQUEST.SESSION['MPI_redirected']=1 + self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date'])+"?date="+self.REQUEST['date']) + else: + self.REQUEST.SESSION['MPI_redirected']=None + + #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) + + + request2=getattr(self,'REQUEST',None) + + if request2 is not None: + response = request2.response + if not response.headers.has_key('content-type'): + response.setHeader('content-type', 'text/html') + + security = getSecurityManager() + bound_names['user'] = security.getUser() + + # Retrieve the value from the cache. + keyset = None + if self.ZCacheable_isCachingEnabled(): + + # Prepare a cache key. + keyset = {'here': self, 'params':request2['QUERY_STRING']} + + result = self.ZCacheable_get(keywords=keyset) + + if result is not None: + # Got a cached value. + return result + + pt = getTemplate(self, "project_main") + # Execute the template in a new security context. + security.addContext(self) + + try: + #logging.debug("index_html pt=%s"%repr(pt)) + result = pt.pt_render(extra_context=bound_names) + #logging.debug("index_html result=%s"%repr(result)) + if keyset is not None: + # Store the result in the cache. + self.ZCacheable_set(result, keywords=keyset) + + return result + finally: + security.removeContext(self) + + + + def index_html_old(self,request=True,context=None): + """show homepage""" if not context: context=self if request: @@ -756,10 +872,11 @@ class MPIWGProject(CatalogAware,Folder): self.REQUEST.SESSION['MPI_redirected']=None #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) + ext=getattr(self,"project_main",None) if ext: return getattr(self,ext.getId())() - + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','project_main')).__of__(context) return pt() @@ -784,7 +901,14 @@ class MPIWGProject(CatalogAware,Folder): def getContent(self,field,filter=None): """Inhalt des Feldes""" + #logging.debug("getContent field=%s filter=%s"%(field,filter)) + if field=="short_title": + text = self.getContent("xdata_07") + if text=="": + text = self.getContent("WEB_title") + return text + text=u'' for x in getattr(self,field): @@ -804,11 +928,14 @@ class MPIWGProject(CatalogAware,Folder): except: pass - if text=='': + if text=='': ## wozu die folgenden Zeilen?? text2=text else: text2=re.sub(r';([^\s])','; \g<1>',text) + if field=="WEB_project_description":##Jedenfalls darf letzteres nicht gemacht werden, falls normaler text + text2=text + #teste ob ergebnis leer und header dann nehme title if (text2=='') and (field=='WEB_project_header'): @@ -884,6 +1011,7 @@ class MPIWGProject(CatalogAware,Folder): def saveEditedContent(self,kupu=None,preview=None): """save Edited content""" + #logging.debug("saveEditedContent kupu=%s preview=%s"%(kupu,preview)) if preview: kupu=preview @@ -891,14 +1019,14 @@ class MPIWGProject(CatalogAware,Folder): start=kupu.find("") end=kupu.find("") newcontent= kupu[start+6:end] - + if preview: - return self.preview(newcontent) self.copyObjectToArchive() + self.ZCacheable_invalidate() self.WEB_project_description=newcontent[0:] - + self.REQUEST.RESPONSE.redirect("./index.html") return True @@ -949,6 +1077,7 @@ class MPIWGProject(CatalogAware,Folder): baseUrl = "/en/research/projects/" # add in the internal project hierarchy + ct=self.getContexts(parents=self.getContent('xdata_05')) # start with grandparents ct.reverse() @@ -963,6 +1092,7 @@ class MPIWGProject(CatalogAware,Folder): def getRootProject(self): """returns the root (=top level) project of the current project""" + ct=self.getContexts(parents=self.getContent('xdata_05')) if len(ct) > 0: return ct[-1][0] @@ -972,6 +1102,7 @@ class MPIWGProject(CatalogAware,Folder): def preview(self,description): """preview""" + #logging.debug("preview description=%s"%description) tmpPro=getattr(self,"previewTemplate",None) if not tmpPro: tmpPro=MPIWGProject("previewTemplate") @@ -980,7 +1111,7 @@ class MPIWGProject(CatalogAware,Folder): setattr(tmpPro,field,getattr(self,field)) tmpPro.WEB_project_description=description[0:] tmpPro.invisible=True - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self) + pt=PageTemplateFile('zpt/previewFrame.zpt',globals()).__of__(self) return pt() #return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate") @@ -988,7 +1119,7 @@ class MPIWGProject(CatalogAware,Folder): def getWebProject_description(self): """get description""" - debug= self.REQUEST.cookies.get("MP_debug_code",None) + debug = self.REQUEST.cookies.get("MP_debug_code",None) if debug and debug=="western": return """ @@ -996,8 +1127,8 @@ class MPIWGProject(CatalogAware,Folder): - %s - + %s + """%self.WEB_project_description[0] return """ @@ -1005,8 +1136,8 @@ class MPIWGProject(CatalogAware,Folder): - %s - + %s + """%self.getContent('WEB_project_description') @@ -1031,7 +1162,7 @@ class MPIWGProject(CatalogAware,Folder): return False def getPersonKeyList(self): - """gibt die key Liste der beteiligten Personen zurŸck (utf8 codiert)""" + """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)""" #logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[])) try: return [utf8ify(x[1]) for x in getattr(self,'responsibleScientistsList',[])] @@ -1053,9 +1184,9 @@ class MPIWGProject(CatalogAware,Folder): else: names=nameList.split(",") - self._v_names=[] - for name in names: - self._v_names.append(name.rstrip().lstrip()) + self._v_names=[] + for name in names: + self._v_names.append(name.rstrip().lstrip()) def sort(x,y): @@ -1106,7 +1237,7 @@ class MPIWGProject(CatalogAware,Folder): lastname=self.myCapitalize(lastname).encode('utf-8') logging.info("Search: %s %s %s"%(name,repr(firstname),repr(lastname))) try: - cataloggedNames=self.MembersCatalog({'firstName':firstname,'lastName':lastname}) + cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname) except: cataloggedNames=[] logging.error("ERROR: identifyNames %s %s"%sys.exc_info()[0:2]) @@ -1129,7 +1260,7 @@ class MPIWGProject(CatalogAware,Folder): """edit the project and archive the old version""" self.copyObjectToArchive() # archive the object - + self.ZCacheable_invalidate() for x in definedFields: if self.REQUEST.has_key(x): @@ -1215,7 +1346,7 @@ class MPIWGProject(CatalogAware,Folder): self.xdata_10="" if fromEdit and (RESPONSE is not None): - RESPONSE.redirect('./editMPIWGDisciplinesThemesEditor') + self.redirect(RESPONSE,'./editMPIWGDisciplinesThemesEditor') else: if RESPONSE is not None: