--- MPIWGWeb/MPIWGProjects.py 2007/07/02 15:50:22 1.47.2.78 +++ MPIWGWeb/MPIWGProjects.py 2010/09/13 11:23:58 1.47.2.117 @@ -1,1565 +1,148 @@ """This contains the class MPIWG Projects for organizing and maintaining the different project pages -""" -#TODO: mechanismus fur links to personen ueberarbeiten, da jetzt alle e_mails als members auftauchen unabhaenig vom status publish_the_data -#TODO: was passiert wenn aenderungen von jochen im filemaker nicht mit den aenderungen im sql uebereinstimmen -#TODO: in einzelnen projecte steht als pfad auf die bilder noch wwwneu statt www +$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 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 -import xml.dom.minidom +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 - -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'] - -#ersetzt logging -def logger(txt,method,txt2): - """logging""" - logging.info(txt+ txt2) - -def getTextFromNode(nodename): - nodelist=nodename.childNodes - rc = "" - for node in nodelist: - if node.nodeType == node.TEXT_NODE: - rc = rc + node.data - return rc - - -def sortStopWordsF(self,xo,yo): - if not hasattr(self,'_v_stopWords'): - self._v_stopWords=self.stopwords_en.data.split("\n") - - x=str(xo[1]) - y=str(yo[1]) - - strx=x.split(" ") - stry=y.split(" ") - - for tmp in strx: - if tmp.lower() in self._v_stopWords: - del strx[strx.index(tmp)] - - for tmp in stry: - if tmp.lower() in self._v_stopWords: - del stry[stry.index(tmp)] - - return cmp(" ".join(strx)," ".join(stry)) - -def sortStopWords(self): - return lambda x,y : sortStopWordsF(self,x,y) - -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 self.linkWeight!="": - return self.linkWeight - else: - return self.getObj().weight - - manage_options=( - {'label':'main config','action':'changeLinkForm'}, - )+SimpleItem.manage_options - - - 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,**argv): - """index""" - +#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 - try: - return self.getObj().pt_render(extra_context={'here':self}) - except: - self.REQUEST.RESPONSE.redirect(self.getObj().absolute_url()) - - +from MPIWGHelper import * -def manage_addMPIWGLinkForm(self): - """Form for adding link""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGLink.zpt')).__of__(self) - return pt() +import MPIWGRoot +import MPIWGLink +import MPIWGTemplate -def manage_addMPIWGLink(self,id,link,title,weight,RESPONSE=None): - """add link""" - newObj=MPIWGLink(id,link,title,weight) +# 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,newObj) +class MPIWGRoot(MPIWGRoot.MPIWGRoot): + """depricated""" - 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) - +class MPIWGLink(MPIWGLink.MPIWGLink): + """depricated""" - """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, text="",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: - - - 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')) - - 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 fuer 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'} - - folders=['MPIWGProject','Folder','ECHO_Navigation'] - meta_type='MPIWGRoot' - - - def harvestProjects(self): - """harvest""" - folder="/tmp" - try: - os.mkdir("/tmp/harvest_MPIWG") - except: - pass - founds=self.ZopeFind(self.aq_parent.projects,obj_metatypes=['MPIWGProject'],search_sub=1) - for found in founds: - txt=found[1].harvest_page() - - if txt and (txt != ""): - name=found[0].replace("/","_") - fh=file("/tmp/harvest_MPIWG/"+name,"w") - fh.write(txt) - fh.close() - - def decode(self,str): - """decoder""" - if not str: - return "" - if type(str) is StringType: - try: - return str.decode('utf-8') - except: - return str.decode('latin-1') - else: - return str - - - def getat(self,array,idx=0,default=None): - """return array element idx or default (but no exception)""" - if len(array) <= idx: - return default - else: - return array[idx] - - - def browserCheck(self): - """check the browsers request to find out the browser type""" - bt = {} - ua = self.REQUEST.get_header("HTTP_USER_AGENT") - bt['ua'] = ua - bt['isIE'] = False - bt['isN4'] = False - if string.find(ua, 'MSIE') > -1: - bt['isIE'] = True - else: - bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1) - - try: - nav = ua[string.find(ua, '('):] - ie = string.split(nav, "; ")[1] - if string.find(ie, "MSIE") > -1: - bt['versIE'] = string.split(ie, " ")[1] - except: pass - - bt['isMac'] = string.find(ua, 'Macintosh') > -1 - bt['isWin'] = string.find(ua, 'Windows') > -1 - bt['isIEWin'] = bt['isIE'] and bt['isWin'] - bt['isIEMac'] = bt['isIE'] and bt['isMac'] - bt['staticHTML'] = False - - return bt - - - def versionHeaderEN(self): - """version header text""" - - date= self.REQUEST.get('date',None) - if date: - txt="""

This pages shows the project which existed at %s

"""%str(date) - return txt - return "" - - def versionHeaderDE(self): - """version header text""" - date= self.REQUEST.get('date',None) - if date: - txt="""

Auf dieser Seite finden Sie die Projekte mit Stand vom %s

"""%str(date) - return "" - - - def createOrUpdateId_raw(self): - """create sequence to create ids for bibliography""" - debug=None - #suche groesste existierende id - founds=self.ZSQLQuery("select id from bibliography") - - if founds: - ids=[int(x.id[1:]) for x in founds] - maximum=max(ids) - - id_raw=self.ZSQLQuery("select nextval('id_raw')",debug=debug) - - if id_raw: - self.ZSQLQuery("drop sequence id_raw",debug=debug) - - self.ZSQLQuery("create sequence id_raw start %i"%(maximum+1),debug=debug) - - - def queryLink(self,link): - """append querystring to the link""" - return "%s?%s"%(link,self.REQUEST.get('QUERY_STRING','')) - - def getKategory(self,url): - """kategorie""" - splitted=url.split("/") - return splitted[4] - - def generateUrlProject(self,url,project=None): - """erzeuge aus absoluter url, relative des Projektes""" - if project: - splitted=url.split("/") - length=len(splitted) - short=splitted[length-2:length] - - base=self.REQUEST['URL3']+"/"+"/".join(short) - - else: - findPart=url.find("/projects/") - base=self.REQUEST['URL1']+"/"+url[findPart:] - - - return base - - def isNewCapital(self,text=None,reset=None): - if reset: - self.REQUEST['capital']="A" - return True - else: - if len(text)>0 and not (text[0]==self.REQUEST['capital']): - self.REQUEST['capital']=text[0] - return True - else: - return False - - def subNavStatic(self,obj): - """subnav" von self""" - def sortWeight(x,y): - x1=int(getattr(x[1],'weight','0')) - y1=int(getattr(y[1],'weight','0')) - return cmp(x1,y1) - - subs=self.ZopeFind(obj,obj_metatypes=['MPIWGTemplate','MPIWGLink']) - subret=[] - - for x in subs: - if not(x[1].title==""): - subret.append(x) - subret.sort(sortWeight) - return subret - - def subNav(self,obj): - """return subnav elemente""" - def sortWeight(x,y): - x1=int(getattr(x[1],'weight','0')) - y1=int(getattr(y[1],'weight','0')) - return cmp(x1,y1) - #if obj.meta_type in ['MPIWGTemplate','MPIWGLink']: - # id=obj.aq_parent.getId() - #else: - - #id=obj.getId() - - - #suche die zweite ebene - - if not obj.aq_parent.getId() in ['de','en']: - obj=obj.aq_parent - - while not self.ZopeFind(self,obj_ids=[obj.getId()]): - obj=obj.aq_parent - - - if hasattr(self,obj.getId()): - - subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink']) - subret=[] - - for x in subs: - if not(x[1].title==""): - subret.append(x) - subret.sort(sortWeight) - return subret - else: - return None - - def isActive(self,name): - """teste ob subnavigation aktiv""" - for part in self.REQUEST['URL'].split("/"): - if part==name: - return True - return False - - def getSection(self): - """returns the current section name""" - root = self.absolute_url() - url = self.REQUEST['URL'] - path = string.replace(url, root, '') - paths = path.split('/') - if len(paths) > 0: - sec = paths[1] - if sec.find('.') < 0: - return sec - else: - return None - return None - - def getSectionStyle(self, name, style=""): - """returns a string with the given style + '-sel' if the current section == name""" - if self.getSection() == name: - return style + '-sel' - else: - return style - - def MPIWGrootURL(self): - """returns the URL to the root""" - return self.absolute_url() - - def upDateSQL(self,fileName): - """updates SQL databases using fm.jar""" - fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar') - xmlPath=os.path.join(package_home(globals()), "updateSQL/%s"%fileName) - logger("MPIWG Web",logging.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath)) - ret=os.popen("java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath),"r").read() - logger("MPIWG Web",logging.INFO,"result convert: %s"%ret) - return 1 - - def patchProjects(self,RESPONSE): - """patch""" - projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject']) - for project in projects: - tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:] - setattr(project[1],'WEB_project_description',[tmp[0:]]) - RESPONSE.write("

%s

\n"%project[0]) - - def replaceNotEmpty(self,format,field): - """replace not empty""" - if field and (not field.lstrip()==''): - return format%field - else: - return "" - - - 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' - - return urllib.urlopen(request['URL1']+'/index_html').read() - - - def formatBibliography(self,here,found): - """format""" - return formatBibliography(here,found) +class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate): + """depricated""" - def getValue(self,fieldStr): - """Inhalt des Feldes""" - - if type(fieldStr)==StringType: - field=fieldStr - 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) - - - - try: - last_x=x.split()[len(x.split())-1] - last_y=y.split()[len(y.split())-1] - - except: - - last_x="" - last_y="" - - - - if last_xlast_y: - return -1 - else: - return 0 - - list.sort(sortLastName) - list.reverse() - - return list - - def __init__(self, id, title): - """init""" - self.id=id - self.title=title - - def removeStopWords(self,xo): - """remove stop words from xo""" - if not hasattr(self,'_v_stopWords'): - self._v_stopWords=self.stopwords_en.data.split("\n") - - x=str(xo) - - strx=x.split(" ") - - for tmp in strx: - - if tmp.lower() in self._v_stopWords: - del strx[strx.index(tmp)] - - return " ".join(strx) - - def urlQuote(self,str): - """quote""" - return urllib.quote(str) - - def urlUnQuote(self,str): - """quote""" - return urllib.unquote(str) - - - - def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None): - """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents""" - def sort(x,y): - return cmp(x.WEB_title[0],y.WEB_title[0]) - - if type(fieldContentsEntry) is StringType: - fieldContentsTmp=[fieldContentsEntry] - else: - fieldContentsTmp=fieldContentsEntry - - fieldContents=[] - for x in fieldContentsTmp: - fieldContents.append(" AND ".join(x.split())) - projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')}) - #print projects - #ret=[x for x in projects] - ret=[] - for x in projects: - obj=x.getObject() - obj=obj.getActualVersion(date) - if obj and (not getattr(obj,'invisible',None)): - #if not (x in ret): - ret.append(x) - - ret.sort(sort) - return ret - - def changeMPIWGRootForm(self): - """edit""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGRootForm')).__of__(self) - return pt() - - def changeMPIWGRoot(self,title,disciplineList,themesList,connection_id,RESPONSE=None): - """change""" - self.title=title - self.connection_id=connection_id - self.disciplineList=disciplineList - self.themesList=themesList - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - - - def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): - """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',date=date): - if project[1]==parentId: - ret.append(project) - - if childs: - for project in self.getProjectFields('xdata_05',sort='int',date=date): - searchStr=childs+"(\..*)" - - if (onlyActive and project[0].isActiveProject()) or (not onlyActive): - 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,date=None,folder=None,sort=None): - """getListofFieldNames""" - ret=[] - - objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0) - - - for object in objects: - obj=object[1] - obj=obj.getActualVersion(date) - if obj and (not getattr(obj,'invisible',None)): - if fieldName=="WEB_title_or_short": - - 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 sort=="int": - ret.sort(sortI) - elif sort=="stopWords": - - ret.sort(sortStopWords(self)) - - else: - ret.sort(sortF) - - return ret +class MPIWGProject_publication(Folder): + """publications object fuer project""" - def showNewProjects(self): - projects=[] - for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets - if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""): - - projects.append(objs) - - return projects - + meta_type="MPIWGProject_publication" + def redirect(self,RESPONSE,url): + """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" - manage_options = Folder.manage_options+( - {'label':'Update personal homepages','action':'updatePersonalwww_html'}, - {'label':'Reindex catalogs','action':'reindexCatalogs'}, - {'label':'Main config','action':'changeMPIWGRootForm'}, - {'label':'add e-mails','action':'showNewDBEntries'}, - {'label':'update the institutsbibliography','action':'updateInstitutsbiliography'}, - #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, - #{'label':'Store Historical Persons','action':'storeHistoricalPersons'}, - ) - - - def updatePublicationDB(self,personId=None): - """updates the publication db, i.e. copy year and type into the main table""" + timeStamp=time.time() - if personId: - founds = self.ZSQLInlineSearch(_table="publications",key_main=personId) + if url.find("?")>-1: #giebt es schon parameter + addStr="&time=%s" else: - founds = self.ZSQLInlineSearch(_table="publications") - - for found in founds: - - if found.id_institutsbibliographie and (not found.id_institutsbibliographie =="") and (not found.id_institutsbibliographie =="0"): - - entries = self.ZSQLInlineSearch(_table="institutsbiblio",id=found.id_institutsbibliographie) - for entry in entries: - self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type) - - if found.id_gen_bib and (not found.id_gen_bib ==""): - entries = self.ZSQLInlineSearch(_table="bibliography",id=found.id_gen_bib) - for entry in entries: - self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type) - - return True - - def showNewDBEntries(self): - """zeige neue Eintraege in der Datenbank ohne e-mail adressen bzw. fuer die noch kein Object angelegt wurde""" - - qstr="select * from personal_www where web_object_created='no' and not key=''" - res=self.ZSQLQuery(qstr) - - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','showNewDBEntries.zpt')).__of__(self) - return pt(newEntries=res) - - def createNewStaffObjects(self,RESPONSE): - """create new staff object""" - - memberFolder=getattr(self,'members') - args=self.REQUEST.form - arg_k=args.keys() - arg_k.remove("submit") - ret="" - for key in arg_k: - k=self.urlUnQuote(key) - - qstr="select * from personal_www where key=%s"%self.ZSQLQuote(k) - res=self.ZSQLQuery(qstr)[0] - if args[key]!="": #email-adresse wurde eingetragen - #create the object - e_mail=args[key] - try: - newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name,res.first_name,k) - memberFolder._setObject(e_mail,newObj) - obj=getattr(memberFolder,e_mail) - obj.reindex_object() - ret+="Created %s \n"%e_mail - created=True - except: - msg="Cannot create new user %s (%s %s)"%(e_mail,sys.exc_info()[0],sys.exc_info()[1]) - logging.error(msg) - ret+=msg+"\n" - created=False - - if created: - qstr="update personal_www set web_object_created='yes',e_mail='%s@mpiwg-berlin.mpg.de' where key=%s"%(e_mail,self.ZSQLQuote(k)) - self.ZSQLQuery(qstr) - - return ret - - - def generateNewPersonEntry(self,data): - """generate a new person entry for data, neue personen werden zunaechst nur in der datenbank angelegt """ - - #memberFolder=getattr(self,'members') - #create the object - -# try: -# newObj=MPIWGStaff.MPIWGStaff(urllib.quote(data['key']),data['last_name'].encode('utf-8'),data['first_name'].encode('utf-8')) -# memberFolder._setObject(urllib.quote(data['key']),newObj) -# except: -# return False, "Cannot create new user %s (%s %s)"%(data['key'],sys.exc_info()[0],sys.exc_info()[1]) -# - - #create the new entry in the database - - - result,msg=MPIWGStaff.createNewDBEntry(self,data['publish_the_data'],data['key'],data['last_name'], - data['first_name'],data['title'],data['status'],"", - "",data['date_from'],data['date_to'], - data['department'],data['home_inst'],data['funded_by'], - data['e_mail2'],data['current_work'],"yes",data['date_stay_at_mpiwg'],data['group'],"no",data['current_work']) - - return result,msg - - def updatePersonEntry(self,data,ignoreEntries=[]): - """update an person entry from data. but ignore all fields in ignore Entries""" - - ignoreEntries.append('current_work') # TODO:updatecurrent work - - if data['date_to']=="": # wenn date_to leer - data['date_to']="date_none" - - if data['date_from']=="": # wenn date_fromleer - data['date_from']="date_none" - msg="" - - - #eintragen - - columns=data.keys() - for x in ignoreEntries: - logging.info("ign rem: %s"%x) - try: #falls in ignore entries felder sind, die nicht in columns sind, fange den fehler ab - columns.remove(x) - except: - pass - - - insert=[] - for key in columns: - if data[key]=="date_none": # date_none eintrag wird zu null uebersetzt - insert.append('%s=null'%key) - else: - insert.append(""" "%s"=%s"""%(key,self.ZSQLQuote(data[key]))) + addStr="?time=%s" - insertStr=",".join(insert) - queryStr="update personal_www SET %s where key='%s'"%(insertStr,data['key']) - self.ZSQLQuery("SET DATESTYLE TO 'German'") - self.ZSQLQuery(queryStr) - - #currentwork - #if not (txt==""): - # queryStr="INSERT INTO current_work (id_main,current,publish) VALUES ('%s','%s','%s')"%(id,txt,txt_p) - # - # self.ZSQLQuery(queryStr) - - return True,msg - - - def updatePersonalwww_doIt(self): - """do the update""" - args=self.REQUEST.form - resultSet=self.REQUEST.SESSION['personal_www']['resultSet'] - news=self.REQUEST.SESSION['personal_www']['news'] - conflicts=self.REQUEST.SESSION['personal_www']['conflicts'] - ret="" - # generate the new entry - - if news and (len(news)>0): - ret+="

Hinzugefügt

" - ret+="

Neueinträge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.

" - ret+="" - - # update - - if len(conflicts.keys())>0: - ret+="

Änderung des Benutzers übernehmen

" - ret+="

Wenn nötig in Filemaker-db ändern:

" - - # konflicte - for conflict in conflicts.keys(): - ignoreEntries=[] - displayIgnored=[] - for cf in conflicts[conflict]: - if args[conflict.encode('utf-8')+'_'+cf[0]]=="stored": #use the stored one - ignoreEntries.append(cf[0]) #so ignore field cf[0] - displayIgnored.append(cf) - if len(displayIgnored)>0: - ret+="

%s

"%conflict.encode('utf-8') - - ret+="" - for iE in displayIgnored: - ret+=""%(iE[0].encode('utf-8'),iE[1].encode('utf-8'),iE[2].encode('utf-8')) - ret+="" - - self.updatePersonEntry(resultSet[conflict],ignoreEntries=ignoreEntries) - - # rest - cl=list(conflicts.keys()) - - for key in resultSet.keys(): - if key not in cl: - self.updatePersonEntry(resultSet[key]) - return ret+"" - - - def updateInstitutsbiliography(self): - """update the Institutsbibliogrpahy""" - self.upDateSQL('personalwww.xml') - return "DONE" - - - def updatePersonalwww_html(self): - """update form for the homepages web form""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww.zpt')).__of__(self) - return pt() + RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') + logging.debug(email.Utils.formatdate()+' GMT') + RESPONSE.redirect(url+addStr%timeStamp) - - def updatePersonalwww(self,uploadfile): - """update personalwww - @param uploadfile: file handle auf das file - """ - dsn=self.getConnectionObj().connection_string - #dsn="dbname=personalwww" - resultSet=updatePersonalWWW.importFMPXML(uploadfile) - news,conflicts=updatePersonalWWW.checkImport(dsn, resultSet) - - self.REQUEST.SESSION['personal_www']={} - self.REQUEST.SESSION['personal_www']['resultSet']=resultSet - self.REQUEST.SESSION['personal_www']['news']=news - self.REQUEST.SESSION['personal_www']['conflicts']=conflicts + def hasLinkToBookPage(self): + """teste ob eingebener link zu einer MPIWG Book page geht""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww_check.zpt')).__of__(self) - return pt() - - - - def reindexCatalogs(self,RESPONSE=None): - """reindex members and project catalog""" + if (getattr(self,'link','')==''): + return False #es gibt keinen link + server = xmlrpclib.ServerProxy(self.link) try: - - self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) + server.getImageUrls() + return True except: - logger("MPIWG Root (updatehomepage)",logging.WARNING," %s %s"%sys.exc_info()[:2]) - + return False + def getImageUrls(self): + """get the image urls""" - - if RESPONSE: - RESPONSE.redirect('manage_main') - - + if (getattr(self,'link','')==''): + return False #es gibt keinen link - - def getAllMembers(self): - #ret=[] - - results=self.MembersCatalog({'isPublished':True}) - - ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results] - - ret.sort() - return ret - def printAllMembers(self): - """print""" - members=self.getAllMembers() - ret="" - for x in members: - ret+="

%s

"%x - return ret - + server = xmlrpclib.ServerProxy(self.link) - 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,dep=None,date=None,onlyActive=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": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive - project[0].setActiveFlag(False) - - if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. - if onlyActive and project[0].isActiveProject(): #nur active projekte - returnList.append((depth,nr,title,project[0])) - elif not onlyActive: - 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)) - try: - highest=max(numbers) + urls = server.getImageUrls() + ret=[] + for url in urls: + url = os.path.join(self.link,url) + ret.append(url) + 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 is not None: - RESPONSE.redirect('showTree') - - def changeTree(self,RESPONSE=None): - """change the complete tree""" - form=self.REQUEST.form - hashList={} - fields=self.getTree() - - - for idNr in form.keys(): - - splitted=idNr.split('_') - - if len(splitted)==1: # name des Feldes = idNr, dann Aendere id_nr - if not (fields[int(idNr)][3].xdata_05==form[idNr]): - fields[int(idNr)][3].xdata_05=form[idNr] - fields[int(idNr)][3].copyObjectToArchive() - - if form.has_key(idNr+'_active'): # active flag is set - - fields[int(splitted[0])][3].setActiveFlag(True) - else: - - fields[int(splitted[0])][3].setActiveFlag(False) - - if RESPONSE is not None: - RESPONSE.redirect('showTree') - - def getProjectWithId(self,id): - fields=self.getProjectFields('xdata_05') - for field in fields: - if field[1]==id: - return field[0] - - return None - - - - - 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=='': - - 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+'/index.html',person)) - else: - #ret.append("%s"%person.encode('utf-8')) - ret.append("%s"%person) - return string.join(ret,";") - - - def getMembersFromList(self,list): - """get member names from person full text list""" - memberlist=[] - 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: - member=self.MembersCatalog({'title':search}) - except: - member=None - - if member and (member[0].getObject().isPublished()): - if person =="Otto Sibum" : person="H. Otto Sibum" - if person =="Norton Wise" : person="M. Norton Wise" - #memberlist.append("%s"%(member[0].absolute_url,person.encode('utf-8'))) - memberlist.append((person, member[0].getObject().getId())) - else: - #memberlist.append("%s"%person.encode('utf-8')) - memberlist.append((person,None)) - return memberlist - - 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 - - if proj and (proj[0].getObject().isPublished()): - 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'))) - if self.MPIWGrootURL().split("/")[-1]=='en': - tmpPath="/en/staff/members/" - else: - tmpPath="/de/mitarbeiter/members/" - ret.append("%s"%(tmpPath+proj[0].getObject().getId()+"/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 - - def getProjectsOfMember(self,name=None,key=None,date=None): - """get projects of a member - @param name: (optional)Vorname + Nachname - @param key: (optional) Key zur Idenfikation des Benutzer - @param date: (optional) Version die zum Zeitpunkt date gueltig war - """ - # TODO: Die ganze Loesung - def sortP(x,y): - """sort by sorting number""" - #print x.xdata_05,y.xdata_05 - return cmp(x.WEB_title,y.WEB_title) - - - ret=[] - logging.error("XXXXXXXXXXXXXXXXX") - if key: - - #members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1) - members=self.MembersCatalog({'getKey':key}) - if len(members)==0: - return ret - - splitted = [members[0].lastName,members[0].firstName] - - elif name: - - splitted=name.split(",") - else: - return ret # name oder key mussen definiert sein - - #XXXX - splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] - - #for s in splitted: - # splitNeu.append("\""+s+"\"") - search=string.join(splitNeu,' AND ') - - proj=self.ProjectCatalog({'xdata_01':search}) - logging.error("XXXXXXXXXXX %s"%proj) - if proj: - proj2=[] - for x in proj: - if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''): - # furchtbarer hack um sicher zustellen dass christoph hoffmann nicht mit Dieter Hoffmann verwechselt wird. - 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((name,proj2)) - - return ret - - def givePersonList(self,name): - """check if person is in personfolder and return list of person objects""" - - 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)) - -## 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 - - - def isCheckField(self,fieldname): - """return chechfield""" - - return (fieldname in checkFields) - - - def generateNameIndex(self): - """erzeuge einen index verwendeter personen""" - import psycopg - o = psycopg.connect('dbname=authorities user=dwinter password=3333',serialize=0) - results={} - print self.fulltext.historicalNames.items() - for nameItem in self.fulltext.historicalNames.items(): #gehe durch alle namen des lexikons - - c = o.cursor() - name=nameItem[0] - print "check",name - c.execute("select lastname,firstname from persons where lower(lastname) = '%s'"%quote(name)) - tmpres=c.fetchall() - firstnames=[result[1] for result in tmpres] # find all firstnames - if tmpres: - lastname=tmpres[0][0] - - for found in self.fulltext({'names':name}): - if found.getObject().isActual(): - for nh in found.getObject().getGetNeighbourhood(name, length=50,tagging=False): #hole umgebung - #schaue nun ob der vorname hinter oder vor dem name ist - position=nh.find(lastname) - # vorher - #print "NH",nh - bevorS=nh[0:position].split() - #print "BV",bevorS - if len(bevorS)>1: - try: - bevor=[bevorS[-1],bevorS[-2]] - except: - bevor=[bevorS[0]] - else: - bevor=[] - #nachher - behindS= re.split("[,|;| ]",nh[position:]) - #print "BH",behindS - if len(behindS)>2: - try: - behind=behindS[1:3] - except: - behind=[bevorS[1]] - else: - behind=[] - for firstname in firstnames: - if firstname in bevor+behind: #Namen wie mit Adelspraedikaten werden so erstmal nich gefunden - id="%s,%s"%(lastname,firstname) - if not results.has_key(id): - results[id]=[] - objId=found.getObject().getId() - if not (objId in results[id]): - print "d %s for %s"%(id,objId) - results[id].append(objId) - self.nameIndex=results - return results - - def editNameIndexHTML(self): - """edit the name index""" - if not hasattr(self,'nameIndexEdited'): # falls editierter index noch nicht existiert, kopiere automatisch erstellten - self.nameIndexEdited=copy.copy(self.nameIndex) - print "huh" - #self.nameIndexEdited=copy.copy(self.nameIndex) - #print self.nameIndexEdited - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editHistoricalNames.zpt')).__of__(self) - return pt() - - def getNamesInProject(self,projectId): - """get all names ofnameIndexEdited which are references in projec with projectId""" - ret=[] - for name in self.nameIndexEdited.keys(): - if projectId in self.nameIndexEdited[name]: - ret.append(name) - - return ret - - def editNameIndex(self,RESPONSE=None,name=None,occurrances=None,submit=None): - """edit the index""" - nI=self.nameIndexEdited # mI introduced to make sure that changes to nameIndexEdited are know to ZODB - if submit=="delete": - - - dh=getattr(self,'deletedHistoricalNames',{}) - - if type(dh) is ListType: - dh={} - if not dh.has_key(name): - dh[name]=occurrances.split("\n") - else: - dh[name]+=occurrances.split("\n") - - self.deletedHistoricalNames=dh - - del self.nameIndexEdited[name] - - - elif (submit=="change"): - - nI[name]=occurrances.split("\n")[0:] - - elif (submit=="add"): - if not nI.has_key(name): - nI[name]=occurrances.split("\n") - else: - nI[name]+=occurrances.split("\n") - - self.nameIndexEdited=nI - - - if RESPONSE is not None: - RESPONSE.redirect('editNameIndexHTML') - - - - def restoreIndex(self): - """restore""" - self.nameIndexEdited=self.nameIndex - return "done" - - - -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): + def editPublication(self,text=None,image1=None,image2=None,description=None,link=None,RESPONSE=None): """edit a publication""" - if (not text): + if (not text) and (not description): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self) return pt() - self.text=text[0:] + 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) + if RESPONSE: - RESPONSE.redirect("../managePublications") - + self.redirect(RESPONSE,"../managePublications") + class MPIWGProject_image(Image): """Images for Projects""" @@ -1584,16 +167,34 @@ 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""" @@ -1618,10 +219,46 @@ 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 hasRelatedDigitalSources(self): + """test ob es digital sources gibt""" + + + ret = (self.getContent('xdata_11')=='' and self.getContent('xdata_13')=='') + + + + return not ret; + + def copyImageToMargin(self,RESPONSE=None): """copy inline images to marginal images""" @@ -1637,15 +274,15 @@ class MPIWGProject(CatalogAware,Folder): for split in splitted[1:]: tmp=split.split("

") #return repr(splitted[1]) - + try: imageURLs.append(tmp[0].split("\"")[1].encode('utf-8')) except: - - try: + + try: imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')) - except: - imageURLs.append("") + except: + imageURLs.append("") split2="

".join(tmp[1:]) @@ -1688,7 +325,8 @@ class MPIWGProject(CatalogAware,Folder): obj.update_data(data) if RESPONSE: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def manageImages(self,imageName=None,op=None): """managage images""" @@ -1745,7 +383,31 @@ class MPIWGProject(CatalogAware,Folder): 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: + 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): @@ -1771,7 +433,8 @@ class MPIWGProject(CatalogAware,Folder): obj.id=name if RESPONSE is not None: - RESPONSE.redirect('managePublications') + + self.redirect(RESPONSE,'managePublications') def getLastPublicationNumber(self): @@ -1783,11 +446,12 @@ 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]) + if RESPONSE: + + self.redirect(RESPONSE,'managePublications') + def getImages(self): """get all Images""" @@ -1795,13 +459,13 @@ class MPIWGProject(CatalogAware,Folder): return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0)) - 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='' + 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']) @@ -1818,13 +482,18 @@ class MPIWGProject(CatalogAware,Folder): def deleteImage(self,id,RESPONSE=None): """delete Image id""" - self.manage_delObjects([id]) + try: + self.manage_delObjects([id]) + except: + logging.error("ERROR MPIWG: %s %s"%sys.exc_info()[0:2]) if RESPONSE: - RESPONSE.redirect('manageImages') + self.redirect(RESPONSE,'manageImages') + - def hasChildren(self,date=None,onlyActive=True): + 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) @@ -1853,7 +522,8 @@ class MPIWGProject(CatalogAware,Folder): obj.id=filename if RESPONSE is not None: - RESPONSE.redirect('manageImages') + + self.redirect(RESPONSE,'manageImages') def PrincipiaSearchSource(self): """Return cataloguable key for ourselves.""" @@ -1924,20 +594,31 @@ class MPIWGProject(CatalogAware,Folder): def copyObjectToArchive(self): """kopiere aktuelles objekt ins archiv""" + logging.info("copytoarchive 1") cb=self.aq_parent.manage_copyObjects(self.getId()) + logging.info("copytoarchive 2") self.manage_pasteObjects(cb) + logging.info("copytoarchive 3") actualTime=time.localtime() self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime)) + logging.info("copytoarchive 4") obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime)) obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime)) + logging.info("copytoarchive 5") ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])] + logging.info("copytoarchive 6") obj.manage_delObjects(ids) + logging.info("copytoarchive 7") def setArchiveTime(self,time): """set Archive Time""" self.archiveTime=time[0:] + def delArchiveTime(self): + """delete archive time""" + del self.archiveTime + def versionManageForm(self): """version Manage form:currently only set to invisible""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self) @@ -1948,7 +629,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): @@ -1966,7 +648,7 @@ class MPIWGProject(CatalogAware,Folder): new.append(split) except: new.append(split) - return string.join(new) + return " ".join(new) @@ -1984,7 +666,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""" @@ -1993,6 +675,7 @@ class MPIWGProject(CatalogAware,Folder): 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: @@ -2017,11 +700,128 @@ 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""" @@ -2062,94 +862,8 @@ class MPIWGProject(CatalogAware,Folder): """warnung: project noch nicht existent""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self) return pt() - - def getGetNeighbourhood(self,wordStr, length=100,tagging=True): - """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte - alle Tags werden entfernt, die Fundstellen werden mit XX getaggt, die Umgebungen werden - case insensitive gesucht - @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet - "eine phrase", "*" bezeichnet wildcards und wird ignoriert" - @param length: optional, default wert 100, 2*length ist die groesse der Umgebung - @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false - """ - - ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird - ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt - - def isInRanges(nr,length): - """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck, - -1, wenn kein Treffer - - @param nr: Position die geprueft werden soll - @param length: Laenge des Wortes das geprueft werden soll - """ - for x in ranges: - if (x[0]<=nr) and (nr < (x[1]-length)): - return ranges.index(x) - return -1 - - # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt. - def rep_empty(str): - x= re.sub(" ","_",str.group(0)) - return re.sub("\"","",x) - - wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche " - - #deal with wildcards, for our purposes it is enough to delete the wildcard - wordStr=wordStr.replace("*","") - - words=wordStr.split(" ") - #if not words is ListType: - # words=[words] - - txt=self.harvest_page() - if not txt: - return ret - txt=re.sub("<.*?>", "", txt) # loesche alle Tags - for word in words: - word=re.sub("_"," ",word) # ersetze zurueck "_" durch " " - pos=0 - - n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf - - for i in range(n): - pos=txt.lower().find(word.lower(),pos) - - if pos > 0: - x=max(0,pos-length) - y=min(len(txt),pos+length) - - - #is word already in one of the results - nr=isInRanges(pos,len(word)) - if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese - x=min(ranges[nr][0],x) - y=max(ranges[nr][1],y) - - str=txt[x:y] - - if nr >=0: # word ist in einer schon gefunden Umgebung - ranges[nr]=(x,y) # neue Position der Umgebung - - ret[nr]=str # neue Umgebung - else: # andernfalls neue Umgebung hinzufuegen - ranges.append((x,y)) - - ret.append(str) - - pos=pos+len(word) - else: - break; - - # now highlight everything - if tagging: - for x in range(len(ret)): - for word in words: - repl=re.compile(word,re.IGNORECASE) - ret[x]=repl.sub(""" %s"""%word.upper(),ret[x]) - - return ret - + + def harvest_page(self,context=None): """seite fuer harvesting fuer die Projektsuche""" if not context: @@ -2164,9 +878,67 @@ class MPIWGProject(CatalogAware,Folder): return pt() - + def index_html(self,request=True,context=None): """show homepage""" + + bound_names={} + + if not context: + context=self + if request: + if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None: + self.REQUEST.SESSION['MPI_redirected']=1 + self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date'])+"?date="+self.REQUEST['date']) + else: + self.REQUEST.SESSION['MPI_redirected']=None + + #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) + + + request2=getattr(self,'REQUEST',None) + + if request2 is not None: + response = request2.response + if not response.headers.has_key('content-type'): + response.setHeader('content-type', 'text/html') + + security = getSecurityManager() + bound_names['user'] = security.getUser() + + # Retrieve the value from the cache. + keyset = None + if self.ZCacheable_isCachingEnabled(): + + # Prepare a cache key. + keyset = {'here': self, 'params':request2['QUERY_STRING']} + + result = self.ZCacheable_get(keywords=keyset) + + if result is not None: + # Got a cached value. + return result + + pt = getTemplate(self, "project_main") + # Execute the template in a new security context. + security.addContext(self) + + try: + #logging.debug("index_html pt=%s"%repr(pt)) + result = pt.pt_render(extra_context=bound_names) + #logging.debug("index_html result=%s"%repr(result)) + if keyset is not None: + # Store the result in the cache. + self.ZCacheable_set(result, keywords=keyset) + + return result + finally: + security.removeContext(self) + + + + def index_html_old(self,request=True,context=None): + """show homepage""" if not context: context=self if request: @@ -2177,10 +949,11 @@ class MPIWGProject(CatalogAware,Folder): self.REQUEST.SESSION['MPI_redirected']=None #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) + ext=getattr(self,"project_main",None) if ext: return getattr(self,ext.getId())() - + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','project_main')).__of__(context) return pt() @@ -2205,7 +978,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): @@ -2225,11 +1005,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'): @@ -2243,10 +1026,10 @@ class MPIWGProject(CatalogAware,Folder): try: self.imageURL=tmp[0].split("\"")[1].encode('utf-8') except: - try: + try: self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8') - except: - self.imageURL="" + except: + self.imageURL="" split2="

".join(tmp[1:]) @@ -2277,10 +1060,13 @@ class MPIWGProject(CatalogAware,Folder): #filter image text5=text5.lstrip().rstrip() #loescher leerzeichen und einzelndes br - if (text5=="
") or (text5=="
"): - text5="" + if (text5=="
") or (text5=="
"): + text5="" + + #logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5))) + return unicodify(text5) + #return utf8ify(text5) # return as utf-8 byte string - return text5.encode('utf-8') def showImagesOfPage(self,imageUrl=None): """show Images of project""" @@ -2302,6 +1088,7 @@ class MPIWGProject(CatalogAware,Folder): def saveEditedContent(self,kupu=None,preview=None): """save Edited content""" + #logging.debug("saveEditedContent kupu=%s preview=%s"%(kupu,preview)) if preview: kupu=preview @@ -2309,14 +1096,14 @@ class MPIWGProject(CatalogAware,Folder): start=kupu.find("") end=kupu.find("") newcontent= kupu[start+6:end] - + if preview: - return self.preview(newcontent) self.copyObjectToArchive() + self.ZCacheable_invalidate() self.WEB_project_description=newcontent[0:] - + self.REQUEST.RESPONSE.redirect("./index.html") return True @@ -2341,8 +1128,58 @@ class MPIWGProject(CatalogAware,Folder): else: return style + def getLabel(self): + """returns label (or title) of this project""" + l = self.getContent('xdata_07') + if l: + return l + l = self.getContent('WEB_title') + if l: + return l + return self.title + + def getBreadcrumbs(self): + """return list of breadcrumbs from here to the root""" + crumbs = [] + # skip direct parent Folder /projects/ + parent = self.aq_parent.aq_parent + # get parents breadcrumbs + if hasattr(parent, 'getBreadcrumbs'): + crumbs = parent.getBreadcrumbs() + + # try to get acquisition URL from parent + if hasattr(parent, 'absolute_url'): + baseUrl = "%s/%s/"%(parent.absolute_url(), 'projects') + else: + baseUrl = "/en/research/projects/" + + # add in the internal project hierarchy + + ct=self.getContexts(parents=self.getContent('xdata_05')) + # start with grandparents + ct.reverse() + for c in ct: + label = shortenString(c[0].getLabel(), 13) + crumbs.append((label, baseUrl+c[0].getId(), c[0])) + + # add this project + crumbs.append((self.getLabel(), baseUrl+self.getId(), self)) + + return crumbs + + def getRootProject(self): + """returns the root (=top level) project of the current project""" + + ct=self.getContexts(parents=self.getContent('xdata_05')) + if len(ct) > 0: + return ct[-1][0] + else: + return self + + def preview(self,description): """preview""" + #logging.debug("preview description=%s"%description) tmpPro=getattr(self,"previewTemplate",None) if not tmpPro: tmpPro=MPIWGProject("previewTemplate") @@ -2351,7 +1188,7 @@ class MPIWGProject(CatalogAware,Folder): setattr(tmpPro,field,getattr(self,field)) tmpPro.WEB_project_description=description[0:] tmpPro.invisible=True - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self) + pt=PageTemplateFile('zpt/previewFrame.zpt',globals()).__of__(self) return pt() #return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate") @@ -2359,7 +1196,7 @@ class MPIWGProject(CatalogAware,Folder): def getWebProject_description(self): """get description""" - debug= self.REQUEST.cookies.get("MP_debug_code",None) + debug = self.REQUEST.cookies.get("MP_debug_code",None) if debug and debug=="western": return """ @@ -2367,8 +1204,8 @@ class MPIWGProject(CatalogAware,Folder): - %s - + %s + """%self.WEB_project_description[0] return """ @@ -2376,8 +1213,8 @@ class MPIWGProject(CatalogAware,Folder): - %s - + %s + """%self.getContent('WEB_project_description') @@ -2387,19 +1224,137 @@ class MPIWGProject(CatalogAware,Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProject.zpt')).__of__(self) return pt() - + def isResponsibleScientist(self,key): + """teste ob eine Person in der Liste der respl. scientists auftaucht""" + #logging.info("XXXXXXXXXXXXX"+repr(self.responsibleScientistsList)) + + + keys = [unicodify(x[1]) for x in getattr(self,"responsibleScientistsList",[])] + #logging.error("RESP. SCIEN:%s"%getattr(self,"responsibleScientistsList",[])) + #logging.error("RESP. SCIEN:%s"%unicodify(key)) + + if unicodify(key) in keys: + return True + else: + return False + + def getPersonKeyList(self): + """gibt die key Liste der beteiligten Personen zurueck (utf8 codiert)""" + #logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[])) + try: + return [utf8ify(x[1]) for x in getattr(self,'responsibleScientistsList',[])] + except: + return[] + + + def myCapitalize(self,txt): + """kapitalisiere auch Namen mit -""" + splitted=[x.capitalize() for x in txt.split("-")] + return "-".join(splitted) + + def getNamesOrdered(self,list): + """Sortiert die Liste nach der Reihenfolge in xdata_01""" + + nameList=self.getContent('xdata_01') + if nameList.find(";")>-1: # rate Trenner ist ; + names=nameList.split(";") + else: + names=nameList.split(",") + + self._v_names=[] + for name in names: + self._v_names.append(name.rstrip().lstrip()) + + + def sort(x,y): + try: + return cmp(self._v_names.index(x[0]),self._v_names.index(y[0])) + except: + return 0 + + list.sort(sort) + + return list + + ##nameList=nameList.replace(";",",") # falls ; als Trenner ersetze + + + + + def identifyNames(self,nameList): + """Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname + und ordnet diese dann Mitarbeiter IDs zu falls es schone eine Liste gibt wird im Projekte gibt wird diese Upgedated. + @param nameList + """ + + if nameList.find(";")>-1: # rate Trenner ist ; + names=nameList.split(";") + + else: + names=nameList.split(",") + + ##nameList=nameList.replace(";",",") # falls ; als Trenner ersetze + returnNamesDict={} + + + for name in names: + name=name.lstrip().rstrip() + nameSplitted = name.split(" ") + if len(nameSplitted)>1: #vor und nachname angegeben) + + lastname=nameSplitted[-1] + firstname=nameSplitted[0] + else: + firstname ="" + lastname=nameSplitted[0] + + #finde Mitarbeiter mit den entsprechenden Name + + firstname=self.myCapitalize(firstname).encode('utf-8') + lastname=self.myCapitalize(lastname).encode('utf-8') + logging.info("Search: %s %s %s"%(name,repr(firstname),repr(lastname))) + try: + cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname) + except: + cataloggedNames=[] + logging.error("ERROR: identifyNames %s %s"%sys.exc_info()[0:2]) + + #Teste ob die ensprechenden Namen schon der Liste zu geordnet sind + #if not hasattr(self,'responsibleScientistsList'): + # self.responsibleScientistsList={} + # + # if name in self.responsibleScientistsList.values() + + if len(cataloggedNames)>0: + returnNamesDict[name]=cataloggedNames + else: + returnNamesDict[name]=[] + + logging.error("id: %s"%repr(returnNamesDict)) + return returnNamesDict + def editMPIWGProject(self,RESPONSE=None,fromEdit=None): """edit the project and archive the old version""" self.copyObjectToArchive() # archive the object - + self.ZCacheable_invalidate() for x in definedFields: if self.REQUEST.has_key(x): setattr(self,x,[self.REQUEST[x].decode('utf-8')]) + + + completedAt = self.REQUEST.get('completedAt') + if not self.setCompletedAt(completedAt): + RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong') + + startedAt = self.REQUEST.get('startedAt') + if not self.setStartedAt(startedAt): + RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong') + if self.REQUEST.has_key('historicalNames'): self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n")) @@ -2407,9 +1362,30 @@ class MPIWGProject(CatalogAware,Folder): self.setActiveFlag(True) else: self.setActiveFlag(False) + + self.responsibleScientistsList=[] # setze die Liste der verantwortlichen Wissenschaftler zurueck + + names={} + keys={} + tmpList=[] + for key in self.REQUEST.keys(): #gehe durch das Formular + splitted=key.split("_") + if splitted[0]=="responsibleScientist": #wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt + nr=splitted[2] + if splitted[1]=="name": + names[nr]=self.REQUEST[key] + elif splitted[1]=="key": + keys[nr]=self.REQUEST[key] + + + for nr in names.keys():#schreibe keys und namen in die Liste, stelle ausserdem sicher, dass name unicode + tmpList.append((unicodify(names[nr]),unicodify(keys.get(nr,"")))) + + self.responsibleScientistsList=tmpList if fromEdit and (RESPONSE is not None): - RESPONSE.redirect('./editMPIWGBasisEditor') - + #RESPONSE.redirect('./editMPIWGBasisEditor') + return self.editMPIWGBasisEditor(identifiedNames=self.identifyNames(self.decode(self.REQUEST.get('xdata_01','')))) + else: if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -2435,19 +1411,19 @@ class MPIWGProject(CatalogAware,Folder): if type(disciplines) is StringType: self.xdata_09=disciplines else: - self.xdata_09=string.join(disciplines,";") + self.xdata_09=";".join(disciplines) else: self.xdata_09="" if themes: if type(themes) is StringType: self.xdata_10=themes else: - self.xdata_10=string.join(themes,";") + self.xdata_10=";".join(themes) else: self.xdata_10="" if fromEdit and (RESPONSE is not None): - RESPONSE.redirect('./editMPIWGDisciplinesThemesEditor') + self.redirect(RESPONSE,'./editMPIWGDisciplinesThemesEditor') else: if RESPONSE is not None: @@ -2472,10 +1448,16 @@ class MPIWGProject(CatalogAware,Folder): return 0 security.declareProtected('View management screens','editMPIWGBasisEditor') - def editMPIWGBasisEditor(self): + def editMPIWGBasisEditor(self, identifiedNames=None): + """editform""" + if not identifiedNames: + identifiedNames=self.identifyNames(self.getContent('xdata_01')) + # identifiedNames=self.getFullNameEntries() + + logging.error("IdentifiedNames: %s"% repr(identifiedNames)) pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self) - return pt() + return pt(identifiedNames=identifiedNames) security.declareProtected('View management screens','editMPIWGBasisForm') def editMPIWGBasisForm(self):
%s%s%s