--- MPIWGWeb/MPIWGProjects.py 2004/08/10 13:27:25 1.20 +++ MPIWGWeb/MPIWGProjects.py 2010/09/13 11:23:58 1.47.2.117 @@ -1,706 +1,638 @@ """This contains the class MPIWG Projects -for organizing and maintaining the different projectspages +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 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. +class MPIWGRoot(MPIWGRoot.MPIWGRoot): + """depricated""" + +class MPIWGLink(MPIWGLink.MPIWGLink): + """depricated""" + +class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate): + """depricated""" + +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 sortF(x,y): - try: - return cmp(x[1],y[1]) - except: + 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: - return cmp(str(x[1]),str(y[1])) - except: - print "error",x[1],y[1] - 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 + 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""" - try: - xret=xret+"%04i"%int(ysplit[i]) - except: - xret=xret+"%04i"%0 - + 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:] - return cmp(int(yret),int(xret)) - except: - return cmp(x[1],y[1]) - - -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':'Part of','xdata_10':'Covered by', - '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'} - - folders=['MPIWGProject','Folder'] - meta_type='MPIWGRoot' - - def replaceNotEmpty(self,format,field): - """replace not empty""" - if field and (not field==''): - return format%field - else: - return "" + if description: + self.description=description + if link: + self.link=link[0:] - def formatBibliography(self,here,found): - """format""" - return formatBibliography(here,found) + 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: + self.redirect(RESPONSE,"../managePublications") + +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 getValue(self,field): - """Inhalt des Feldes""" + 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) - if type(field)==StringType: - try: - if field[len(field)-1]==";": - field=field[0:len(text)-1] - except: - """nothing""" - - return field.encode('utf-8') + if caption: + 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 + + 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: - return field[0].encode('utf-8') + 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 - 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) + def copyPublicationsToList(self,RESPONSE=None): + """copy publications in to list""" - try: - y=urllib.unquote(y_c).encode('utf-8','ignore') - except: - x=urllib.unquote(y_c) - + publicationTxt=self.getContent('WEB_related_pub') - - try: - last_x=x.split()[len(x.split())-1] - last_y=y.split()[len(y.split())-1] + pubSplits=publicationTxt.split("
") - except: + for pubSplit in pubSplits: + pubSplit=pubSplit.replace("
","") + self.addPublication(pubSplit) - last_x="" - last_y="" - - + 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')=='') - if last_x""") - for project in projects: - lg=len(project[1].xdata_03[0])-1 + 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:]) - if (lg>1) and (project[1].xdata_03[0][lg]==";"): - project[1].xdata_03[0]=project[1].xdata_03[0][0:lg] - - - - try: - if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ; - for person in project[1].xdata_03[0].split(";"): - personNormal=normalize(person) - if personNormal in list.keys(): - list[urllib.quote(personNormal)][1].append(project[1]) - else: - list[urllib.quote(personNormal)]=(personNormal,[project[1]]) - else: #guess , is sepeator - for person in project[1].xdata_03[0].split(","): - personNormal=normalize(person) - if urllib.quote(personNormal) in list.keys(): - list[urllib.quote(personNormal)][1].append(project[1]) - else: - list[urllib.quote(personNormal)]=(personNormal,[project[1]]) + splitted=split2.split("""""") + if len(splitted)>1: + tmp=splitted[1].split("
") + imageCaptions.append(tmp[0].encode('utf-8')) - except: - print "ERROR",project - - return list - def storeHistoricalPersons(self,RESPONSE=None): - """store persons""" - self.personDict={} - personDict=self.harvestHistoricalPersons() - for person in personDict.keys(): - for project in personDict[person][1]: - if person in self.personDict.keys(): - self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0])) else: - self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])]) + #keine caption - if RESPONSE is not None: - RESPONSE.redirect("showHistoricalPersons") + 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) - - def getPersonDict(self,name): - """name von dict""" - - try: - return self.personDict[name][0].encode('utf-8') - except: - return self.personDict[name][0] - return self.personDict[name][0].decode('latin-1').encode('utf-8') + obj=getattr(self,filename) + obj.update_data(data) - - def showHistoricalPersons(self): - """show persons""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self) - return pt() - + if RESPONSE: - def editHistoricalPersonsForm(self): - """edit historical persons for consistency""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self) - return pt() - - def getProjectsByFieldContent(self,fieldName,fieldContentsEntry): - """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents""" - if type(fieldContentsEntry) is StringType: - fieldContents=[fieldContentsEntry] - else: - fieldContents=fieldContentsEntry + self.redirect(RESPONSE,'manageImages') - projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')}) - #print projects - return projects + 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 - def changeMPIWGRootForm(self): - """edit""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self) - return pt() - - def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None): - """change""" - self.title=title - self.disciplineList=disciplineList - self.themesList=themesList - if RESPONSE is not None: - RESPONSE.redirect('manage_main') + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageImagesForm.zpt')).__of__(self) + return pt() - def getDisciplineList(self): - """get disciplines as list""" - return self.disciplineList.split("\n") - - def getThemeList(self): - """get themes as list""" - return self.themesList.split("\n") - - def test(self): - """test""" - return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url + def managePublications(self,pubName=None,op=None): + """managage images""" - def getContexts(self,childs=None,parents=None,depth=None): - """childs alle childs, alle parents""" - ret=[] - if parents: - splitted=parents.split(".") - parentId=string.join(splitted[0:len(splitted)-1],".") - - for project in self.getProjectFields('xdata_05',sort='int'): - if project[1]==parentId: - ret.append(project) - - if childs: - for project in self.getProjectFields('xdata_05',sort='int'): - searchStr=childs+"(\..*)" - if re.match(searchStr,project[1]): - - if depth: - if int(depth)>=len(project[1].split("."))-len(childs.split(".")): - - ret.append(project) - else: - ret.append(project) - return ret - - 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 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 - if obj.meta_type in self.folders: - - ret += self.getProjectFields(fieldName,obj) - if sort=="int": - ret.sort(sortI) + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_managePublicationsForm.zpt')).__of__(self) + return pt() + def hasExtendedPublicationList(self): + """test if extended publication list exists""" + if not hasattr(self,"publicationList"): + return False else: - ret.sort(sortF) + return True - return ret - - 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 - + def createExtendedPublicationList(self,RESPONSE=None): + """erzeuge erweiterte publications liste""" + pl = BibliographyManager("publicationList","","institutsbiblio",self.connection_id) + self._setObject("publicationList", pl) - manage_options = Folder.manage_options+( - {'label':'Import Persons','action':'importNamesForm'}, - {'label':'Main config','action':'changeMPIWGRootForm'}, - {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, - {'label':'Store Historical Persons','action':'storeHistoricalPersons'}, - ) - def importNamesForm(self): - """Form""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self) - return pt() - - def importNames(self,fileupload,folderName,RESPONSE=None): - """import komma-sep list email,lastName,firstName""" - project=getattr(self,folderName) - load=fileupload.read() - - for line in load.split('\r'): - - - splitted=line.split(",") - print splitted - - if not (splitted[0]==""): - newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2]) - - try: - project._setObject(splitted[0],newObj) - print "done:",splitted[0] - except: - print "not done:",splitted[0] - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - def getAllMembers(self): - """give list of all members""" - ret=[] + 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') - #for x in self.members.objectValues('MPIWGStaff'): - #print x.title - # ret.append(x.title.decode('utf-8')) + + if RESPONSE: + self.redirect(RESPONSE,"managePublications") - 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 getPublications(self): + """get all Publications""" + def sort_images(x,y): + return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) - def printAllMembers(self): - """prin""" - members=self.getAllMembers() - ret="" - for x in members: - ret+="%s
"%x - return ret - + publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication']) - 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 - title=[project[0].getContent('WEB_title')] - #print title - returnList.append((depth,nr,title,project[0])) - - return returnList - - def formatElementForOverview(self,element): - """format the element for output in overview""" - if element[0]==1: #department - return """"""%(element[3].absolute_url(),element[3].getContent('WEB_title'))
-
- elif element[0]==3:
- return """
%s"""%(element[3].absolute_url(),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))
+ publications.sort(sort_images)
+ return publications
- 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 addPublication(self,text,RESPONSE=None):
+ """add an MPIWG_Publication"""
+ name="publication_"+str(self.getLastPublicationNumber()+1)
+
+ newPublication=MPIWGProject_publication(name)
+ 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:
- RESPONSE.redirect('showTree')
- def changeTree(self,RESPONSE=None):
- """change the complete tree"""
- form=self.REQUEST.form
- hashList={}
- fields=self.getTree()
+ self.redirect(RESPONSE,'managePublications')
+
+ def getLastPublicationNumber(self):
+ publications=self.getPublications()
- for idNr in form.keys():
- fields[int(idNr)][3].xdata_05=form[idNr]
-
+ 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 getImages(self):
+ """get all Images"""
- if RESPONSE is not None:
- RESPONSE.redirect('showTree')
+ def sort_images(x,y):
+ return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
- def getProjectWithId(self,id):
- fields=self.getProjectFields('xdata_05')
- for field in fields:
- if field[1]==id:
- return field[0]
- return None
-
+ 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
+
+ def getLastImageNumber(self):
+ images=self.getImages()
- def getRelativeUrlFromPerson(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.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=='':
+ 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')
- try:
- proj=self.MembersCatalog({'title':search})
- except:
- proj=None
- if proj:
- #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8')))
- ret.append("%s"%('members/'+proj[0].id,person))
- else:
- #ret.append("%s"%person.encode('utf-8'))
- ret.append("%s"%person)
- return string.join(ret,";")
+
+ def hasChildren(self,date=None,onlyActive=1,onlyArchived=1):
+ """check if project has children"""
-
- 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.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=='':
+ 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
- try:
- proj=self.MembersCatalog({'title':search})
- except:
- proj=None
+
+ 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 proj:
- #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8')))
- ret.append("%s"%(proj[0].absolute_url,person))
- else:
- #ret.append("%s"%person.encode('utf-8'))
- ret.append("%s"%person)
- return string.join(ret,";")
-
- def getProjectsOfMembers(self):
- """give tuple member /projects"""
- ret=[]
- members=self.getAllMembers()
- #return str(members)
- for x in members:
- ret+=self.getProjectsOfMember(name=x)
+ if RESPONSE is not None:
- return ret
+ self.redirect(RESPONSE,'manageImages')
- def getProjectsOfMember(self,name=None,email=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])
- name = members[0][1].title.decode('utf-8')
-
- y=name
- splitted=y.split(",")
- for s in splitted:
- splitNeu.append("\""+s+"\"")
- search=string.join(splitNeu,' AND ')
-
- proj=self.ProjectCatalog({'xdata_01':search})
- if proj:
- proj2=[x for x in proj]
- # proj2.sort(sortP)
- # ret.append((y,proj2))
- 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:
- proj2.append(x)
+ 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: + 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="" - if (type(text)==StringType) or (type(text)==UnicodeType): - return text + 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: - return text[0] + 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=="