--- MPIWGWeb/MPIWGProjects.py 2004/05/24 10:24:27 1.6 +++ MPIWGWeb/MPIWGProjects.py 2010/09/14 06:22:50 1.47.2.118 @@ -1,356 +1,793 @@ -"""This files contains the class MPIWG Projects -for organizing and maintaining the different projectspages +"""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 - -import MPIWGStaff -import string +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 re +import os +import email from types import * - -import xmlhelper # Methoden zur Verwaltung der projekt xmls +import logging +import xmlhelper # Methoden zur Verwaltung der projekt xml 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 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 + +#import MPIWGStaff + +from MPIWGHelper import * + +import MPIWGRoot +import MPIWGLink +import MPIWGTemplate -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'] +# die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin. +# Sonst funktionieren die alten Webseiten nicht mehr. -def sortF(x,y): +class MPIWGRoot(MPIWGRoot.MPIWGRoot): + """depricated""" - return cmp(x[1],y[1]) - -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 +class MPIWGLink(MPIWGLink.MPIWGLink): + """depricated""" + +class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate): + """depricated""" + +class MPIWGProject_publication(Folder): + """publications object fuer project""" - try: - xret=xret+"%04i"%int(ysplit[i]) - except: - xret=xret+"%04i"%0 - + 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() - return cmp(int(yret),int(xret)) - except: - return cmp(x[1],y[1]) + 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 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 + -class MPIWGRoot(Folder): - """Stammordner für den Web-Server""" + 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""" - folders=['MPIWGProject','Folder'] - meta_type='MPIWGRoot' - - def __init__(self, id, title): - """init""" - self.id=id - self.title=title + if (not text) and (not description): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self) + return pt() + + + if text: + self.text=text[0:] + + if description: + self.description=description + + 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) + - def getProjectFields(self,fieldName,folder=None,sort=None): - """getListofFieldNames""" - ret=[] - #print "FN",fieldName - if not folder: - folder=self - for object in folder.__dict__: - - obj=getattr(folder,object) - if hasattr(obj,'meta_type'): - #print obj.meta_type - if obj.meta_type=='MPIWGProject': - if fieldName=="WEB_title_or_short": - #print "HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - #print len(obj.getContent('xdata_07')) - 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 RESPONSE: + self.redirect(RESPONSE,"../managePublications") - if obj.meta_type in self.folders: - - ret += self.getProjectFields(fieldName,obj) +class MPIWGProject_relatedProject(Folder): + """publications object fuer project""" - if sort=="int": - ret.sort(sortI) - else: - ret.sort(sortF) + meta_type="MPIWGProject_relatedProject" + def redirect(self,RESPONSE,url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" - return ret + 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 showNewProjects(self): - projects=[] - for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets - if objs[0].xdata_05[0] == "": - - projects.append(objs) - - return projects - - manage_options = Folder.manage_options+( - {'label':'Import Persons','action':'importNamesForm'}, - ) - - def importNamesForm(self): - """Form""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self) - return pt() + def editRelatedProject(self,link=None,RESPONSE=None): + """edit a publication""" - def importNames(self,fileupload,folderName,RESPONSE=None): - """import komma-sep list email,lastName,firstName""" - project=getattr(self,folderName) - - for line in fileupload.readlines(): - #print line - splitted=line.split(",") - if not (splitted[0]==""): - newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2]) - try: - project._setObject(splitted[0],newObj) - except: - print "not done:",splitted[0] - if RESPONSE is not None: - RESPONSE.redirect('manage_main') + if (not link): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_relatedProjectForm.zpt')).__of__(self) + return pt() - def getAllMembers(self): - """give list of all members""" - ret=[] + + + + + # 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) + + - for x in self.members.objectValues('MPIWGStaff'): - #print x.title - ret.append(x.title) - - ret.sort() - return ret + + + self.orginallink=link[0:] + self.objid=objid[0:] + + self.projectWEB_title=object.getContent('WEB_title')[0:] + + self.enabled=True; + + + if RESPONSE: + self.redirect(RESPONSE,"../manageRelatedProjects") + +class MPIWGProject_image(Image): + """Images for Projects""" + + meta_type="MPIWGProject_image" + + def showImage(self,imageUrl=None): + """show Images at an extra page""" + self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self) + return pt() + + def editImage(self,file=None,caption=None,RESPONSE=None): + """edit the Image""" + if (not file) and (not caption): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_imageForm.zpt')).__of__(self) + return pt() + + if file and (not file.filename.lstrip().rstrip()==""): + self.manage_upload(file) - 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): - """generate Tree from project list""" - returnList=[] - for project in self.getProjectFields('xdata_05',sort="int"): # 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 - returnList.append((depth,nr,title,project[0])) - - 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)) + if caption: + self.caption=caption[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: + self.redirect(RESPONSE,"../manageImages") +class MPIWGProject(CatalogAware,Folder,Cacheable): + """Class for Projects""" + + def _p_resolveConflict(self, oldState, savedState, newState): + return newState - if RESPONSE is not None: - RESPONSE.redirect('showTree') + 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""" - def changeTree(self,RESPONSE=None): - """change the complete tree""" - form=self.REQUEST.form - hashList={} - fields=self.getTree() - + timeStamp=time.time() - for idNr in form.keys(): - fields[int(idNr)][3].xdata_05=form[idNr] + 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): + return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) + founds=self.ZopeFind(self,obj_metatypes=[metatype]); + + founds.sort(sort) + return founds + - if RESPONSE is not None: - RESPONSE.redirect('showTree') + def copyPublicationsToList(self,RESPONSE=None): + """copy publications in to list""" - def getProjectWithId(self,id): - fields=self.getProjectFields('xdata_05') - for field in fields: - if field[1]==id: - return field[0] + publicationTxt=self.getContent('WEB_related_pub') - return None - + pubSplits=publicationTxt.split("
") + + for pubSplit in pubSplits: + 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')=='' and self.getContent('xdata_13')=='') - def getUrlFromPerson(self,list): - """get urls to person list""" - ret=[] - persons=list.split(";") - for person in persons: + + + return not ret; - 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=='': + + + + def copyImageToMargin(self,RESPONSE=None): + """copy inline images to marginal images""" + + + #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: - proj=self.MembersCatalog({'title':search}) + imageURLs.append(tmp[0].split("\"")[1].encode('utf-8')) except: - proj=None + + try: + imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')) + except: + imageURLs.append("") + + split2="".join(tmp[1:]) + + + splitted=split2.split("""""") + if len(splitted)>1: + tmp=splitted[1].split("
") + imageCaptions.append(tmp[0].encode('utf-8')) + + + 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 - if proj: - ret.append("%s"%(proj[0].absolute_url,person)) - else: - ret.append("%s"%person) - return string.join(ret,";") - - def getProjectsOfMembers(self): - """give tuple member /projects""" - ret=[] - members=self.getAllMembers() - for x in members: - splitted=x.split(",") - - proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')}) - if proj: - ret.append((x,proj)) - return ret - def givePersonList(self,name): - """check if person is in personfolder and return list of person objects""" + 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: - splitted=name.split(",") - if len(splitted)==1: - splitted=name.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=='': - proj=self.MembersCatalog({'title':search}) + self.redirect(RESPONSE,'manageImages') + + def manageImages(self,imageName=None,op=None): + """managage images""" + + + if imageName and op: + if op=='up': + images=self.getImages() + for image in images: + if image[0]==imageName: + nr=images.index(image) + if not nr==0: + images[nr-1][1].place+=1 + images[nr][1].place-=1 + pass + elif op=='down': + images=self.getImages() + for image in images: + if image[0]==imageName: + nr=images.index(image) + if not (nr==len(images)-1): + images[nr+1][1].place-=1 + images[nr][1].place+=1 + pass + + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageImagesForm.zpt')).__of__(self) + return pt() + + def managePublications(self,pubName=None,op=None): + """managage images""" + + + if pubName and op: + if op=='up': + publications=self.getPublications() + for publication in publications: + if publication[0]==pubName: + nr=publications.index(publication) + if not nr==0: + publications[nr-1][1].place+=1 + publications[nr][1].place-=1 + pass + elif op=='down': + publications=self.getPublications() + for publication in publications: + if publication[0]==pubName: + nr=publications.index(publication) + if not (nr==len(publications)-1): + publications[nr+1][1].place-=1 + publications[nr][1].place+=1 + pass + + + 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 + - if proj: - return [[x.lastName,x.firstName] for x in proj] + 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 [] + 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") + -## 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)) + def getPublications(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_publication']) - return objs + 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 personCheck(self,names): - """all persons for list""" - #print "names",names - splitted=names.split(";") - ret={} - for name in splitted: + def addPublication(self,text,RESPONSE=None): + """add an MPIWG_Publication""" - if not (name==""): - try: - ret[name]=self.givePersonList(name) - except: - """NOTHIHN""" - #print "RET",ret - return ret + name="publication_"+str(self.getLastPublicationNumber()+1) + + newPublication=MPIWGProject_publication(name) - 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 + self._setObject(name,newPublication) + obj=getattr(self,name) + obj.text=text[0:] + obj.enabled=True; + obj.place=self.getLastPublicationNumber()+1 + obj.id=name + + if RESPONSE is not None: + self.redirect(RESPONSE,'managePublications') - def isCheckField(self,fieldname): - """return chechfield""" + 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""" + + name="RelatedProject"+str(self.getLastRelatedProjectNumber()+1) + + # 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 - return (fieldname in checkFields) + if RESPONSE is not None: + + self.redirect(RESPONSE,'manageRelatedProjects') + - + def getLastPublicationNumber(self): + publications=self.getPublications() -def manage_addMPIWGRootForm(self): - """form for adding the root""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self) - return pt() + if not publications: + return 0 + else: + return getattr(publications[-1][1],'place',0) + + def getLastRelatedProjectNumber(self): + publications=self.getRelatedProjects() + + if not publications: + return 0 + else: + return getattr(publications[-1][1],'place',0) + + def deletePublication(self,id,RESPONSE=None): + """delete Publication id""" + self.manage_delObjects([id]) + if RESPONSE: + + self.redirect(RESPONSE,'managePublications') + + def deleteRelatedProject(self,id,RESPONSE=None): + """delete Publication id""" + self.manage_delObjects([id]) + if RESPONSE: + + self.redirect(RESPONSE,'manageRelatedProjects') + + def getImages(self): + """get all Images""" -def manage_addMPIWGRoot(self,id,title,RESPONSE=None): - """add a root folder""" - newObj=MPIWGRoot(id,title) - self._setObject(id,newObj) + def sort_images(x,y): + return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) - if RESPONSE is not None: - RESPONSE.redirect('manage_main') + + 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) + return images -class MPIWGProject(Folder): - """Class for Projects""" + def getLastImageNumber(self): + images=self.getImages() + + if not images: + return 0 + else: + return getattr(images[-1][1],'place',0) + + def deleteImage(self,id,RESPONSE=None): + """delete Image id""" + try: + self.manage_delObjects([id]) + except: + logging.error("ERROR MPIWG: %s %s"%sys.exc_info()[0:2]) + if RESPONSE: + self.redirect(RESPONSE,'manageImages') - meta_type='MPIWGProject' + + 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""" + + if not filename: + filename=fileHd.filename + + if not fileHd: + fileHd=file(os.path.join(package_home(globals()),'blank.gif')) + + newImage=MPIWGProject_image(filename,filename,fileHd) + + self._setObject(filename,newImage) + obj=getattr(self,filename) + obj.caption=caption[0:] + obj.enabled=True; + obj.place=self.getLastImageNumber()+1 + obj.id=filename + + if RESPONSE is not None: + + self.redirect(RESPONSE,'manageImages') + + def PrincipiaSearchSource(self): + """Return cataloguable key for ourselves.""" + return str(self) + + def versionHeader(self): + """version Header, gibt header text entsprechend der aktuellen version aus""" + + actualTime=time.localtime() + retTXT="""""") + if len(splitted)>1: + tmp=splitted[1].split("
") + #return repr(splitted[1]) try: - text =x + self.imageURL=tmp[0].split("\"")[1].encode('utf-8') except: - text="ERROR" - #print "TEXT",text.encode('ascii','ignore') - return text + try: + self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8') + except: + self.imageURL="" + + split2="".join(tmp[1:]) + + text3=splitted[0]+split2 + + splitted=text3.split("""""") + if len(splitted)>1: + tmp=splitted[1].split("
") + self.imagecap=tmp[0].encode('utf-8') + + split4="".join(tmp[1:]) + + text5=splitted[0]+split4 + else: + #keine caption + text5=text3 + else: + #kein bild + text5=text2 + else: + text5=text2 + + #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=="