--- MPIWGWeb/MPIWGProjects.py 2005/09/15 13:50:55 1.47.2.24 +++ MPIWGWeb/MPIWGProjects.py 2012/01/09 13:14:46 1.47.2.126 @@ -1,1161 +1,209 @@ """This contains the class MPIWG Projects for organizing and maintaining the different project pages +$author dwinter - last change 26.06.2008 + """ from Products.PageTemplates.PageTemplateFile import PageTemplateFile -from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate -from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder from Products.ZCatalog.CatalogPathAwareness import CatalogAware +from Products.MPIWGBibliography.BibliographyManager import BibliographyManager from OFS.Image import Image from Globals import package_home import urllib -import MPIWGStaff -import string import re -import os +import os +import email from types import * -import zLOG +import logging import xmlhelper # Methoden zur Verwaltung der projekt xml from OFS.SimpleItem import SimpleItem from OFS.Folder import Folder -from Products.ZSQLMethods.SQL import SQLConnectionIDs +from OFS.Image import Image from AccessControl import ClassSecurityInfo +from AccessControl import getSecurityManager from bibliography import * import time +from OFS.Cache import Cacheable +import xmlrpclib +#import xml.dom.minidom +import sys +#from Ft.Xml.XPath import Evaluate +#from Ft.Xml.XPath.Context import Context +#from Ft.Xml.Domlette import NonvalidatingReader,PrettyPrint, Print +#from Ft.Xml import EMPTY_NAMESPACE +#import copy +#import updatePersonalWWW -definedFields=['WEB_title','xdata_01','xdata_02','xdata_03','xdata_04','xdata_05','xdata_06','xdata_07','xdata_08','xdata_09','xdata_10','xdata_11','xdata_12','xdata_13','WEB_project_header','WEB_project_description','WEB_related_pub'] - -checkFields = ['xdata_01'] - - - -def sortF(x,y): - try: - return cmp(x[1],y[1]) - except: - try: - return cmp(str(x[1]),str(y[1])) - except: - - return 0 - -def sortI(x,y): - xsplit=x[1].split(".") - ysplit=y[1].split(".") - xret="" - yret="" - try: - for i in range(5): - try: - yret=yret+"%04i"%int(xsplit[i]) - except: - yret=yret+"%04i"%0 - - try: - xret=xret+"%04i"%int(ysplit[i]) - except: - xret=xret+"%04i"%0 - - - return cmp(int(yret),int(xret)) - except: - return cmp(x[1],y[1]) - -class MPIWGLink(SimpleItem): - """create a symbolic link to another page""" - - meta_type="MPIWGLink" - - def isActiveItem(self): - """teste ob ausgewaehlt""" - #url1 beim link anstelle von url1, da link jeweils index_html als url hat. - if self.absolute_url()==self.REQUEST['URL1']: - return "aktiv" - else: - return "" - - def __init__(self,id,link,title='',weight=''): - """init mpiwglink""" - self.id=id - self.link=link - self.title=title - self.weight=weight - - def getObj(self): - """bekomme original""" - ## objpath=self.link.replace("/",".") -## if objpath[0]!=".": -## objpath="."+objpath - -## print objpath -## return eval("self"+objpath) - - - splitted=self.link.lstrip().split("/") - obj=self - for x in splitted: - if not x=="": - obj=getattr(obj,x) - - return obj - - def getWeight(self): - if self.linkWeight and linkWeight!="": - return self.linkWeight - else: - return self.getObj().weight - - manage_options=SimpleItem.manage_options+( - {'label':'main config','action':'changeLinkForm'}, - ) - - - def changeLinkForm(self): - """change MPIWG link""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGLinkChange.zpt')).__of__(self) - return pt() - - def changeLink(self,link,title,weight,RESPONSE=None): - """change links""" - self.link=link - self.title=title - self.weight=weight - - if RESPONSE is not None: - RESPONSE.redirect('manage') - - def index_html(self): - """index""" - - return self.getObj().pt_render(extra_context={'here':self}) - - -def manage_addMPIWGLinkForm(self): - """Form for adding link""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGLink.zpt')).__of__(self) - return pt() +#import MPIWGStaff -def manage_addMPIWGLink(self,id,link,title,weight,RESPONSE=None): - """add link""" - newObj=MPIWGLink(id,link,title,weight) +from MPIWGHelper import * - self._setObject(id,newObj) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - -class MPIWGTemplate(ZopePageTemplate): - """Create a layout Template for different purposes""" - - meta_type="MPIWGTemplate" - - manage_options=ZopePageTemplate.manage_options+( - {'label':'Change Weight','action':'changeWeightForm'}, - ) - - def changeWeightForm(self): - """change weight form""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGTemplateChangeWeight.zpt')).__of__(self) - return pt() - - def changeWeight(self,weight,RESPONSE=None): - """change weight""" - self.weight=weight - if RESPONSE is not None: - RESPONSE.redirect('manage') - - - def __init__(self, id, text=None, content_type=None,MPIWGType=None): - self.id = str(id) - - - - self.ZBindings_edit(self._default_bindings) - if text is None: - self._default_content_fn = os.path.join(package_home(globals()), - 'zpt/MPIWG_%s_template_standard.zpt'%MPIWGType) - text = open(self._default_content_fn).read() - self.pt_edit(text, content_type) - - - """change form""" - - def isActiveItem(self): - """teste ob ausgewaehlt""" - if self.absolute_url()==self.REQUEST['URL']: - return "aktiv" - else: - return "" - -def manage_addMPIWGTemplateForm(self): - """Form for adding""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self) - return pt() - -from urllib import quote - - -def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,weight=0,REQUEST=None): - "Add a Page Template with optional file content." - if type(MPIWGType)==StringType: - MPIWGTypes=[MPIWGType] - else: - MPIWGTypes=MPIWGType - - for singleType in MPIWGTypes: +import MPIWGRoot +import MPIWGLink +import MPIWGTemplate +import transaction - if REQUEST is None: - self._setObject(id, MPIWGTemplate(id, text,EchoType=singleType)) - ob = getattr(self, id) - - if title: - ob.pt_setTitle(title) - return ob - else: - file = REQUEST.form.get('file') - headers = getattr(file, 'headers', None) - if headers is None or not file.filename: - zpt = MPIWGTemplate(id,MPIWGType=singleType) - else: - zpt = MPIWGTemplate(id, file, headers.get('content_type')) +# die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin. +# Sonst funktionieren die alten Webseiten nicht mehr. - self._setObject(id, zpt) - ob = getattr(self, id) - if title: - ob.pt_setTitle(title) - - try: - u = self.DestinationURL() - except AttributeError: - u = REQUEST['URL1'] - - ob = getattr(self, id) - ob.weight=weight - - REQUEST.RESPONSE.redirect(u+'/manage_main') - return '' - - -class MPIWGRoot(ZSQLExtendFolder): - """Stammordner für den Web-Server""" - - fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department', - 'xdata_03':'Historical Persons','xdata_04':'Time period', - 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title', - 'xdata_08':'Other involved scholars' ,'xdata_09':'Disciplines','xdata_10':'Themes', - 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners', - 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header', - 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'} +class MPIWGRoot(MPIWGRoot.MPIWGRoot): + """depricated""" - folders=['MPIWGProject','Folder','ECHO_Navigation'] - meta_type='MPIWGRoot' - - def versionHeaderEN(self): - """version header text""" - - date= self.REQUEST.get('date',None) - if date: - txt="""
%s
\n"%project[0]) - - def replaceNotEmpty(self,format,field): - """replace not empty""" - if field and (not field.lstrip()==''): - return format%field - else: - return "" - +class MPIWGProject_publication(Folder): + """publications object fuer project""" - def isActual(self,project): - """checke if project is actual""" - actualTime=time.localtime() - obj= project.getObject() - - if getattr(obj,'archiveTime',actualTime)< actualTime: - return False - else: - return True - - def redirectIndex_html(self,request): - #return request['URL1']+'/index_html' + meta_type="MPIWGProject_publication" + def redirect(self,RESPONSE,url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" - return urllib.urlopen(request['URL1']+'/index_html').read() - - - def formatBibliography(self,here,found): - """format""" - return formatBibliography(here,found) - - def getValue(self,fieldStr): - """Inhalt des Feldes""" + timeStamp=time.time() - if type(fieldStr)==StringType: - field=fieldStr + if url.find("?")>-1: #giebt es schon parameter + addStr="&time=%s" else: - field=fieldStr[0] - try: - if field[len(field)-1]==";": - field=field[0:len(field)-1] - except: - - """nothing""" - field=re.sub(r';([^\s])','; \g<1>',field) - return field.encode('utf-8') - - - - def sortedNames(self,list): - """sort names""" - - def sortLastName(x_c,y_c): - try: - x=urllib.unquote(x_c).encode('utf-8','ignore') - except: - x=urllib.unquote(x_c) - - try: - y=urllib.unquote(y_c).encode('utf-8','ignore') - except: - x=urllib.unquote(y_c) - - + addStr="?time=%s" - try: - last_x=x.split()[len(x.split())-1] - last_y=y.split()[len(y.split())-1] - - except: + RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') + logging.debug(email.Utils.formatdate()+' GMT') + RESPONSE.redirect(url+addStr%timeStamp) - last_x="" - last_y="" - - - - if last_xnew:%s
\n"%found.username) - except: - RESPONSE.write("old:%s (%s,%s)
\n"%(found.username,found.name,found.vorname)) - - - #delete non existing - - - foundUserNames=[x.username for x in founds] - for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1): - - if member[1].getId() not in foundUserNames: - member[1].aq_parent.manage_delObjects(ids=[member[1].getId()]) - RESPONSE.write("deleted:%s
\n"%member[1].getId()) try: - self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + urls = server.getImageUrls() + ret=[] + for url in urls: + url = os.path.join(self.link,url) + ret.append(url) + except: - pass - self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) - - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - + return [] - def getAllMembers(self): - """give list of all members""" - ret=[] - - #for x in self.members.objectValues('MPIWGStaff'): - #print x.title - # ret.append(x.title.decode('utf-8')) - - for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']): - ret.append(x[1].title.decode('utf-8')) - - ret.sort() - #print ret - return ret - - def printAllMembers(self): - """prin""" - members=self.getAllMembers() - ret="" - for x in members: - ret+="%s
"%x - return ret - - def makeList(self,entry): - """makes a list out of one entry or repeat a list""" - if type(entry) is StringType: - return [entry] - else: - return entry - - - def getTree(self,date=None): - """generate Tree from project list""" - - 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": - returnList.append((depth,nr,title,project[0])) - - return returnList - - def formatElementsAsList(self,elements): - """formatiere tree als liste""" - - actualDepth=0 - ret="" - for element in elements: - if (element[0]>actualDepth): - #fuege soviele ul ein wie unterschied in tiefe - if element[0]==1: - ret+=""""""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) - - elif element[0]==3: - return """
"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) - - - 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) + def editPublication(self,text=None,image1=None,image2=None,description=None,link=None,RESPONSE=None): + """edit a publication""" + if (not text) and (not description): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self) + return pt() - if RESPONSE is not None: - RESPONSE.redirect('showTree') + + if text: + self.text=text[0:] - def changeTree(self,RESPONSE=None): - """change the complete tree""" - form=self.REQUEST.form - hashList={} - fields=self.getTree() - + if description: + self.description=description - for idNr in form.keys(): - if not (fields[int(idNr)][3].xdata_05==form[idNr]): - fields[int(idNr)][3].xdata_05=form[idNr] - fields[int(idNr)][3].copyObjectToArchive() + if link: + self.link=link[0:] + if image1: + if hasattr(self,'publicationImage1'): + self.publicationImage1.manage_upload(image1) + else: + nO = Image('publicationImage1','',image1) + self._setObject('publicationImage1',nO) + + if image2: + if hasattr(self,'publicationImage2'): + self.publicationImage2.manage_upload(image2) + else: + nO = Image('publicationImage2','',image2) + self._setObject('publicationImage2',nO) + - if RESPONSE is not None: - RESPONSE.redirect('showTree') + self.ZCacheable_invalidate() + if RESPONSE: + self.redirect(RESPONSE,"../managePublications") - def getProjectWithId(self,id): - fields=self.getProjectFields('xdata_05') - for field in fields: - if field[1]==id: - return field[0] +class MPIWGProject_relatedProject(Folder): + """publications object fuer project""" - return None - + 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() - def getRelativeUrlFromPerson(self,list): - """get urls to person list""" - ret=[] - persons=list.split(";") - for person in persons: + if url.find("?")>-1: #giebt es schon parameter + addStr="&time=%s" + else: + addStr="?time=%s" - if len(person)>1: #nicht nur Trennzeichen - splitted=person.split(",") - if len(splitted)==1: - splitted=person.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 + RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') + logging.debug(email.Utils.formatdate()+' GMT') + RESPONSE.redirect(url+addStr%timeStamp) - if proj: - #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8'))) - ret.append("%s"%('members/'+proj[0].id+'/index.html',person)) - else: - #ret.append("%s"%person.encode('utf-8')) - ret.append("%s"%person) - return string.join(ret,";") - - 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 + def editRelatedProject(self,link=None,RESPONSE=None): + """edit a publication""" - if proj: - 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'))) - ret.append("%s"%(proj[0].absolute_url+"/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=[] - members=self.getAllMembers() - #return str(members) - for x in members: - ret+=self.getProjectsOfMember(name=x,date=date) - - return ret + if (not link): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_relatedProjectForm.zpt')).__of__(self) + return pt() - def getProjectsOfMember(self,name=None,email=None,date=None): - """get project of a member""" - def sortP(x,y): - """sort by sorting number""" - #print x.xdata_05,y.xdata_05 - return cmp(x.WEB_title,y.WEB_title) - - ret=[] - splitNeu=[] - if email: - - members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1) - name = members[0][1].title.decode('utf-8') - - y=name - splitted=y.split(",") - #XXXX - splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] + + - #for s in splitted: - # splitNeu.append("\""+s+"\"") - search=string.join(splitNeu,' AND ') + # hole die id des projektes + splitted=link.split("/") - proj=self.ProjectCatalog({'xdata_01':search}) - - if proj: - proj2=[] - for x in proj: - if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''): - if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)): - 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((y,proj2)) - - return ret - - def givePersonList(self,name): - """check if person is in personfolder and return list of person objects""" + #teste ob es das project gibt + if len(splitted)<1: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) - splitted=name.split(",") - if len(splitted)==1: - splitted=name.lstrip().rstrip().split(" ") - splittedNew=[split.lstrip() for split in splitted] - - if splittedNew[0]=='': - del splittedNew[0] - search=string.join(splittedNew,' AND ') - if not search=='': - proj=self.MembersCatalog({'title':search}) - - if proj: - return [[x.lastName,x.firstName] for x in proj] - else: - return [] - -## splitted=name.split(",") # version nachname, vorname... -## if len(splitted)>1: -## lastName=splitted[0] -## firstName=splitted[1] -## else: -## splitted=name.split(" ") #version vorname irgenwas nachnamae - -## lastName=splitted[len(splitted)-1] -## firstName=string.join(splitted[0:len(splitted)-1]) - -## objs=[] - - #print self.members - ## for x in self.members.__dict__: -## obj=getattr(self.members,x) -## if hasattr(obj,'lastName') and hasattr(obj,'firstName'): - -## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)): - -## objs.append((obj,lastName+", "+firstName)) - + objid=splitted[-1] + object = getattr(self.projects,objid,None) - return objs - - - def personCheck(self,names): - """all persons for list""" - #print "names",names - splitted=names.split(";") - ret={} - for name in splitted: - - if not (name==""): - try: - ret[name]=self.givePersonList(name) - except: - """NOTHIHN""" - #print "RET",ret - return ret - - def giveCheckList(self,person,fieldname): - """return checklist""" - #print "GCL",fieldname - if fieldname=='xdata_01': - x=self.personCheck(person.getContent(fieldname)) - #print "GCLBACKX",x - return x + if object==None: + self.redirect(RESPONSE,'errorRelatedProjects?link='+link) + - def isCheckField(self,fieldname): - """return chechfield""" - return (fieldname in checkFields) - - - + + self.orginallink=link[0:] + self.objid=objid[0:] - -def manage_addMPIWGRootForm(self): - """form for adding the root""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGRootForm.zpt')).__of__(self) - return pt() - -def manage_addMPIWGRoot(self,id,title,connection_id="",RESPONSE=None): - """add a root folder""" - newObj=MPIWGRoot(id,title) - self._setObject(id,newObj) - ob=getattr(self,id) - setattr(ob,'connection_id',connection_id) - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - -class MPIWGProject_publication(SimpleItem): - """publications object fuer project""" - - meta_type="MPIWGProject_publication" - - def editPublication(self,text=None,RESPONSE=None): - """edit a publication""" - - if (not text): - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self) - return pt() - + self.projectWEB_title=object.getContent('WEB_title')[0:] + + self.enabled=True; + self.ZCacheable_invalidate() - self.text=text[0:] - if RESPONSE: - RESPONSE.redirect("../managePublications") - + self.redirect(RESPONSE,"../manageRelatedProjects") + class MPIWGProject_image(Image): """Images for Projects""" @@ -1180,16 +228,36 @@ 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""" + return unicodify(str) + def sortedByPlace(self,metatype): """find metatype and sort by place""" def sort(x,y): @@ -1213,30 +281,114 @@ class MPIWGProject(CatalogAware,Folder): pubSplit=pubSplit.replace("","") self.addPublication(pubSplit) + setattr(self,"WEB_related_pub_copied",True); + if RESPONSE: - RESPONSE.redirect('managePublications') + + 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 copyImageToMargin(self,RESPONSE=None): + 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""" - self.getContent('WEB_project_description',filter='yes') + + + #getImages from WEB_project_description + description=self.getContent('WEB_project_description') + + text2=description + splitted=text2.split("""""") + + imageURLs=[] + imageCaptions=[] + for split in splitted[1:]: + tmp=split.split("
") + #return repr(splitted[1]) + + try: + imageURLs.append(tmp[0].split("\"")[1].encode('utf-8')) + except: + + try: + imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')) + except: + imageURLs.append("") + + split2="".join(tmp[1:]) - filename=self.imageURL.split("/")[-1] - #lege neues images object an, mit leerem bild - if self.ZopeFind(self,obj_ids=[filename]): - #existiert das bild schon, dann neueun filenamen - filename="project_image_"+filename - - self.addImage(None,self.imagecap,filename=filename) - #hole die bilddaten aus der url - data=urllib.urlopen(self.absolute_url()+"/"+self.imageURL).read() + splitted=split2.split("""""") + if len(splitted)>1: + tmp=splitted[1].split("
") + imageCaptions.append(tmp[0].encode('utf-8')) - obj=getattr(self,filename) - obj.update_data(data) + + else: + #keine caption + + imageCaptions.append("") + + + #eintragen: + for imageURL in imageURLs: + filename=imageURL.split("/")[-1] + #lege neues images object an, mit leerem bild + + if self.ZopeFind(self,obj_ids=[filename]): + #existiert das bild schon, dann neuen filenamen + filename="project_image_"+filename + + self.addImage(None,imageCaptions[imageURLs.index(imageURL)],filename=filename) + #hole die bilddaten aus der url + url=self.absolute_url()+"/"+imageURL + #url=self.absolute_url()+"/"+filename + + try:#relative url + data=urllib.urlopen(url).read() + except: + try:#absolute + data=urllib.urlopen(self.imageURL).read() + except: + logger("MPIWG Project",logging.ERROR,"can't open: %s"%url) + + obj=getattr(self,filename) + obj.update_data(data) if RESPONSE: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def manageImages(self,imageName=None,op=None): """managage images""" @@ -1293,21 +445,88 @@ class MPIWGProject(CatalogAware,Folder): 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"): + return False + else: + return True + + def createExtendedPublicationList(self,RESPONSE=None): + """erzeuge erweiterte publications liste""" + pl = BibliographyManager("publicationList","","institutsbiblio",self.connection_id) + self._setObject("publicationList", pl) + + + zt=ZopePageTemplate('index.html') + pl._setObject('index.html',zt) + default_content_fn = os.path.join(package_home(globals()), + 'zpt/showExtendedProjectBibliography.zpt') + text = open(default_content_fn).read() + zt.pt_edit(text, 'text/html') + + if RESPONSE: + self.redirect(RESPONSE,"managePublications") + + def getPublications(self): """get all Publications""" def sort_images(x,y): return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) - print self.getId() + publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication']) 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) @@ -1317,13 +536,70 @@ class MPIWGProject(CatalogAware,Folder): 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: - RESPONSE.redirect('managePublications') + + 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 @@ -1331,16 +607,36 @@ class MPIWGProject(CatalogAware,Folder): return getattr(publications[-1][1],'place',0) def deletePublication(self,id,RESPONSE=None): - """delete Publication id""" - self.manage_delObjects([id]) - if RESPONSE: - RESPONSE.redirect('managePublications') - + """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""" + def sort_images(x,y): return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) - print self.getId() + + + if (getattr(self,'imageURL','')!='') or (getattr(self,'imagecap','')!='') : + try: + self.addImage(None,getattr(self,'imagecap',''),RESPONSE=None,filename=getattr(self,'imageURL','')) + except: + pass + self.imageURL='' + self.imagecap='' + images=self.ZopeFind(self,obj_metatypes=['MPIWGProject_image']) images.sort(sort_images) @@ -1356,10 +652,27 @@ 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) + + if ct and len(ct)>0: + return True + else: + return False + def addImage(self,fileHd,caption,RESPONSE=None,filename=None): """add an MPIWG_Project_image""" @@ -1376,9 +689,11 @@ class MPIWGProject(CatalogAware,Folder): obj.caption=caption[0:] obj.enabled=True; obj.place=self.getLastImageNumber()+1 - + obj.id=filename + if RESPONSE is not None: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def PrincipiaSearchSource(self): """Return cataloguable key for ourselves.""" @@ -1447,22 +762,44 @@ class MPIWGProject(CatalogAware,Folder): else: return 1 + def isActualForIndex(self): #isActual kann nicht indiziert werden, da intern fom ZCAtalog verwendete Funktion + """gibt 1 zurueck wenn aktuell, 0 sonst""" + actualTime=time.localtime() + + + #print getattr(self,'archiveTime',actualTime) + if getattr(self,'archiveTime',actualTime)< actualTime: + return 0 + else: + return 1 + 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) @@ -1473,7 +810,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): @@ -1491,13 +829,13 @@ class MPIWGProject(CatalogAware,Folder): new.append(split) except: new.append(split) - return string.join(new) + return " ".join(new) def generateTemplate(self,RESPONSE=None): - """Erzeuge Template für defined fields not_used""" + """Erzeuge Template fuer defined fields not_used""" id="index_html" title=id @@ -1509,7 +847,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""" @@ -1517,12 +855,15 @@ class MPIWGProject(CatalogAware,Folder): self.creationTime=time.strftime("%Y%m%d%H%M%S",time.localtime())[0:] 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: - try: - setattr(self,arg,argv[arg]) - except: - setattr(self,arg,"") + try: + setattr(self,arg,argv[arg]) + except: + setattr(self,arg,"") else: for arg in definedFields: setattr(self,arg,'') @@ -1537,6 +878,131 @@ 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=self.getCompletedAt() + + #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 setStartedAt(self,date): + """set the date of start, 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,"startedAt",transformedDate) + 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 + 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 zurueck, an dem Projekt begonnen wurde.""" + date=getattr(self,'startedAt','') + 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)) + if (day==0) and (month==0): + return """%s"""%year; + if day==0 : + return """%s.%s"""%(month,year); + + 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 angebenen Werte + werden auf 0 gesetzt, es wird null zurueckgegeben falls das Datum ungueltig ist""" + + if (date==None): + return None; + + + if (date.lstrip().rstrip()=="" ) : + return ""; + + 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""" @@ -1578,8 +1044,39 @@ class MPIWGProject(CatalogAware,Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self) return pt() + + def harvest_page(self,context=None,mode="normal"): + """seite fuer harvesting fuer die Projektsuche""" + + + if not context: + context=self + + if self.isActiveProject() and self.isActual(): + templates = self.en.getHarvestCache() + + ext=getattr(self,"harvest_main",None) + if ext: + rendered = getattr(self,ext.getId())() + templates[self.absolute_url()]=rendered + transaction.commit() + return rendered + + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context) + + rendered = pt() + templates[self.absolute_url()]=rendered + transaction.commit() + return rendered + + + def index_html(self,request=True,context=None): """show homepage""" + + bound_names={} + if not context: context=self if request: @@ -1589,11 +1086,67 @@ class MPIWGProject(CatalogAware,Folder): else: self.REQUEST.SESSION['MPI_redirected']=None - #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) + #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: + 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"]) + 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() @@ -1618,7 +1171,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): @@ -1638,11 +1198,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'): @@ -1652,12 +1215,15 @@ class MPIWGProject(CatalogAware,Folder): splitted=text2.split("""""") if len(splitted)>1: tmp=splitted[1].split("
") - #return repr(splitted[1]) + #return repr(splitted[1]) try: - self.imageURL=tmp[0].split("\"")[1].encode('utf-8') - except: - self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8') - + self.imageURL=tmp[0].split("\"")[1].encode('utf-8') + except: + try: + self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8') + except: + self.imageURL="" + split2="".join(tmp[1:]) text3=splitted[0]+split2 @@ -1665,7 +1231,7 @@ class MPIWGProject(CatalogAware,Folder): splitted=text3.split("""""") if len(splitted)>1: tmp=splitted[1].split("
") - self.imagecap=tmp[0].encode('utf-8') + self.imagecap=tmp[0].encode('utf-8') split4="".join(tmp[1:]) @@ -1679,15 +1245,21 @@ class MPIWGProject(CatalogAware,Folder): else: text5=text2 - #teste ob WEB_project_description und keine führenden p tags + #teste ob WEB_project_description und keine fuehrenden p tags if (len(text5)>4) and (not text5[0:3]=='') and (field=='WEB_project_description'): text5= "
"+text5+"
" #filter image + text5=text5.lstrip().rstrip() #loescher leerzeichen und einzelndes br + if (text5=="