--- MPIWGWeb/MPIWGProjects.py 2009/12/15 13:16:47 1.47.2.111 +++ MPIWGWeb/MPIWGProjects.py 2010/09/14 13:23:46 1.47.2.121 @@ -25,6 +25,7 @@ from AccessControl import getSecurityMan from bibliography import * import time from OFS.Cache import Cacheable +import xmlrpclib #import xml.dom.minidom import sys #from Ft.Xml.XPath import Evaluate @@ -72,7 +73,42 @@ class MPIWGProject_publication(Folder): logging.debug(email.Utils.formatdate()+' GMT') RESPONSE.redirect(url+addStr%timeStamp) - def editPublication(self,text=None,image1=None,image2=None,description=None,RESPONSE=None): + def hasLinkToBookPage(self): + """teste ob eingebener link zu einer MPIWG Book page geht""" + + if (getattr(self,'link','')==''): + return False #es gibt keinen link + + server = xmlrpclib.ServerProxy(self.link) + + try: + server.getImageUrls() + return True + except: + return False + + + def getImageUrls(self): + """get the image urls""" + + if (getattr(self,'link','')==''): + return False #es gibt keinen link + + server = xmlrpclib.ServerProxy(self.link) + + try: + urls = server.getImageUrls() + ret=[] + for url in urls: + url = os.path.join(self.link,url) + ret.append(url) + + except: + return [] + + return ret + + def editPublication(self,text=None,image1=None,image2=None,description=None,link=None,RESPONSE=None): """edit a publication""" if (not text) and (not description): @@ -80,8 +116,14 @@ class MPIWGProject_publication(Folder): return pt() - self.text=text[0:] - self.description=description + if text: + self.text=text[0:] + + if description: + self.description=description + + if link: + self.link=link[0:] if image1: if hasattr(self,'publicationImage1'): @@ -98,8 +140,67 @@ class MPIWGProject_publication(Folder): self._setObject('publicationImage2',nO) + self.ZCacheable_invalidate() if RESPONSE: - self.redirect(RESPONSE,"../managePublications") + self.redirect(RESPONSE,"../managePublications") + +class MPIWGProject_relatedProject(Folder): + """publications object fuer project""" + + meta_type="MPIWGProject_relatedProject" + 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 editRelatedProject(self,link=None,RESPONSE=None): + """edit a publication""" + + if (not link): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_relatedProjectForm.zpt')).__of__(self) + return pt() + + + + + + # hole die id des projektes + splitted=link.split("/") + + #teste ob es das project gibt + if len(splitted)<1: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) + + objid=splitted[-1] + object = getattr(self.projects,objid,None) + + if object==None: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) + + + + + + self.orginallink=link[0:] + self.objid=objid[0:] + + self.projectWEB_title=object.getContent('WEB_title')[0:] + + self.enabled=True; + self.ZCacheable_invalidate() + + if RESPONSE: + self.redirect(RESPONSE,"../manageRelatedProjects") class MPIWGProject_image(Image): """Images for Projects""" @@ -125,14 +226,13 @@ class MPIWGProject_image(Image): self.caption=caption[0:] if RESPONSE: - self.redirect(RESPONSE,"../manageImages") class MPIWGProject(CatalogAware,Folder,Cacheable): """Class for Projects""" def _p_resolveConflict(self, oldState, savedState, newState): - return newState + return newState security=ClassSecurityInfo() meta_type='MPIWGProject' @@ -178,10 +278,45 @@ class MPIWGProject(CatalogAware,Folder,C pubSplit=pubSplit.replace("

","") self.addPublication(pubSplit) + setattr(self,"WEB_related_pub_copied",True); + if RESPONSE: - + self.redirect(RESPONSE,'managePublications') + def hasRelatedPublicationsOldVersion(self): + """teste ob es related publications gibt""" + + ret = True; + if (self.getContent('WEB_related_pub')==''): + ret=False; #nichts im alten feld + logging.debug("webrel:"+repr(ret)) + if (getattr(self,'WEB_related_pub_copied',False)): + ret=False; # alte daten sind schon kopiert worden + + logging.debug("webrel_copied:"+repr(ret)) + publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication']); + + if(len(publications)>0): + ret=False; # es gibt publicationen in der neuen liste + + + logging.debug("len(publ)"+repr(ret)) + + return ret; + + def hasRelatedDigitalSources(self): + """test ob es digital sources gibt""" + + + ret = (self.getContent('xdata_11').lstrip().rstrip()=='') + + + + return not ret; + + + def copyImageToMargin(self,RESPONSE=None): """copy inline images to marginal images""" @@ -249,7 +384,7 @@ class MPIWGProject(CatalogAware,Folder,C obj.update_data(data) if RESPONSE: - + self.redirect(RESPONSE,'manageImages') def manageImages(self,imageName=None,op=None): @@ -307,6 +442,36 @@ class MPIWGProject(CatalogAware,Folder,C pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_managePublicationsForm.zpt')).__of__(self) return pt() + + def manageRelatedProjects(self,pubName=None,op=None): + """managage relatedProjectd""" + + + if pubName and op: + if op=='up': + relatedProjects=self.getRelatedProjects() + for project in relatedProjects: + if project[0]==pubName: + nr=relatedProjects.index(project) + if not nr==0: + relatedProjects[nr-1][1].place+=1 + relatedProjects[nr][1].place-=1 + pass + elif op=='down': + relatedProjects=self.getRelatedProjects() + for project in relatedProjects: + if project[0]==pubName: + nr=relatedProjects.index(project) + if not (nr==len(relatedProjects)-1): + relatedProjects[nr+1][1].place-=1 + relatedProjects[nr][1].place+=1 + pass + + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageRelatedProjectsForm.zpt')).__of__(self) + return pt() + + def hasExtendedPublicationList(self): """test if extended publication list exists""" if not hasattr(self,"publicationList"): @@ -329,7 +494,7 @@ class MPIWGProject(CatalogAware,Folder,C if RESPONSE: - self.redirect(RESPONSE,"managePublications") + self.redirect(RESPONSE,"managePublications") def getPublications(self): @@ -342,10 +507,23 @@ class MPIWGProject(CatalogAware,Folder,C publications.sort(sort_images) return publications + def getRelatedProjects(self): + """get all Publications""" + def sort_images(x,y): + return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) + + publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_relatedProject']) + + publications.sort(sort_images) + return publications + def addPublication(self,text,RESPONSE=None): """add an MPIWG_Publication""" - - name="publication_"+str(self.getLastPublicationNumber()+1) + number=self.getLastPublicationNumber()+1 + name="publication_"+str(number) + while hasattr(self,name): + number+=1 + name="publication_"+str(number) newPublication=MPIWGProject_publication(name) @@ -355,14 +533,70 @@ class MPIWGProject(CatalogAware,Folder,C obj.enabled=True; obj.place=self.getLastPublicationNumber()+1 obj.id=name - + self.ZCacheable_invalidate() if RESPONSE is not None: - + self.redirect(RESPONSE,'managePublications') + def errorRelatedProjects(self,link): + """error creating a related project""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_project_error_relatedProject.zpt')).__of__(self) + return pt(link=link) + + def addRelatedProject(self,link,RESPONSE=None): + """add an MPIWG_Publication""" + + + + number=self.getLastPublicationNumber()+1 + name="RelatedProject"+str(number) + while hasattr(self,name): + number+=1 + name="RelatedProject_"+str(number) + + # hole die id des projektes + splitted=link.split("/") + + #teste ob es das project gibt + if len(splitted)<1: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) + + objid=splitted[-1] + object = getattr(self.projects,objid,None) + + if object==None: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) + return + + newPublication=MPIWGProject_relatedProject(name) + + self._setObject(name,newPublication) + obj=getattr(self,name) + obj.orginallink=link[0:] + obj.objid=objid[0:] + logging.debug("add relobj:objid"+repr(obj.objid)) + obj.projectWEB_title=object.getContent('WEB_title')[0:] + logging.debug("add relobj:webtitle"+repr(obj.projectWEB_title)) + obj.enabled=True; + obj.place=self.getLastRelatedProjectNumber()+1 + obj.id=name + self.ZCacheable_invalidate() + if RESPONSE is not None: + + self.redirect(RESPONSE,'manageRelatedProjects') + + def getLastPublicationNumber(self): publications=self.getPublications() + + if not publications: + return 0 + else: + return getattr(publications[-1][1],'place',0) + + def getLastRelatedProjectNumber(self): + publications=self.getRelatedProjects() if not publications: return 0 @@ -372,10 +606,19 @@ class MPIWGProject(CatalogAware,Folder,C def deletePublication(self,id,RESPONSE=None): """delete Publication id""" self.manage_delObjects([id]) + self.ZCacheable_invalidate() if RESPONSE: - + self.redirect(RESPONSE,'managePublications') - + + def deleteRelatedProject(self,id,RESPONSE=None): + """delete Publication id""" + self.manage_delObjects([id]) + self.ZCacheable_invalidate() + if RESPONSE: + + self.redirect(RESPONSE,'manageRelatedProjects') + def getImages(self): """get all Images""" @@ -411,7 +654,7 @@ class MPIWGProject(CatalogAware,Folder,C except: logging.error("ERROR MPIWG: %s %s"%sys.exc_info()[0:2]) if RESPONSE: - self.redirect(RESPONSE,'manageImages') + self.redirect(RESPONSE,'manageImages') @@ -518,23 +761,30 @@ class MPIWGProject(CatalogAware,Folder,C 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 + """delete archive time""" + del self.archiveTime def versionManageForm(self): """version Manage form:currently only set to invisible""" @@ -546,7 +796,7 @@ class MPIWGProject(CatalogAware,Folder,C self.invisible=invisible if RESPONSE is not None: - + self.redirect(RESPONSE,'manage_main') @@ -668,16 +918,16 @@ class MPIWGProject(CatalogAware,Folder,C else: return "" # test ob parent abgeschlossen ist - try: #TODO: ersetzte try except durch vernuenftige abfrage + 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: + 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); @@ -698,8 +948,8 @@ class MPIWGProject(CatalogAware,Folder,C 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; @@ -822,7 +1072,6 @@ class MPIWGProject(CatalogAware,Folder,C security = getSecurityManager() bound_names['user'] = security.getUser() - # Retrieve the value from the cache. keyset = None @@ -842,7 +1091,9 @@ class MPIWGProject(CatalogAware,Folder,C 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) @@ -894,12 +1145,13 @@ class MPIWGProject(CatalogAware,Folder,C 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 + if field=="short_title": + text = self.getContent("xdata_07") + if text=="": + text = self.getContent("WEB_title") + return text text=u'' @@ -1003,6 +1255,7 @@ class MPIWGProject(CatalogAware,Folder,C def saveEditedContent(self,kupu=None,preview=None): """save Edited content""" + #logging.debug("saveEditedContent kupu=%s preview=%s"%(kupu,preview)) if preview: kupu=preview @@ -1012,7 +1265,6 @@ class MPIWGProject(CatalogAware,Folder,C newcontent= kupu[start+6:end] if preview: - return self.preview(newcontent) self.copyObjectToArchive() @@ -1094,6 +1346,7 @@ class MPIWGProject(CatalogAware,Folder,C def preview(self,description): """preview""" + #logging.debug("preview description=%s"%description) tmpPro=getattr(self,"previewTemplate",None) if not tmpPro: tmpPro=MPIWGProject("previewTemplate") @@ -1102,7 +1355,7 @@ class MPIWGProject(CatalogAware,Folder,C 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") @@ -1110,7 +1363,7 @@ class MPIWGProject(CatalogAware,Folder,C 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 """ @@ -1118,8 +1371,8 @@ class MPIWGProject(CatalogAware,Folder,C - %s - + %s + """%self.WEB_project_description[0] return """ @@ -1127,8 +1380,8 @@ class MPIWGProject(CatalogAware,Folder,C - %s - + %s + """%self.getContent('WEB_project_description') @@ -1153,7 +1406,7 @@ class MPIWGProject(CatalogAware,Folder,C 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',[])] @@ -1175,9 +1428,9 @@ class MPIWGProject(CatalogAware,Folder,C 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):