--- MPIWGWeb/MPIWGProjects.py 2006/11/08 14:47:13 1.47.2.64
+++ MPIWGWeb/MPIWGProjects.py 2008/06/24 07:55:05 1.47.2.83
@@ -19,7 +19,7 @@ import string
import re
import os
from types import *
-import zLOG
+import logging
import xmlhelper # Methoden zur Verwaltung der projekt xml
from OFS.SimpleItem import SimpleItem
from OFS.Folder import Folder
@@ -34,12 +34,18 @@ 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 = ""
@@ -104,6 +110,29 @@ def sortI(x,y):
except:
return cmp(x[1],y[1])
+
+def unicodify(str):
+ """decode str (utf-8 or latin-1 representation) into unicode object"""
+ 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 utf8ify(str):
+ """encode unicode object or string into byte string in utf-8 representation"""
+ if not str:
+ return ""
+ if type(str) is StringType:
+ return str
+ else:
+ return str.encode('utf-8')
+
+
class MPIWGLink(SimpleItem):
"""create a symbolic link to another page"""
@@ -143,7 +172,7 @@ class MPIWGLink(SimpleItem):
return obj
def getWeight(self):
- if self.linkWeight and linkWeight!="":
+ if self.linkWeight and self.linkWeight!="":
return self.linkWeight
else:
return self.getObj().weight
@@ -167,12 +196,18 @@ class MPIWGLink(SimpleItem):
if RESPONSE is not None:
RESPONSE.redirect('manage')
- def index_html(self):
+ def index_html(self,**argv):
"""index"""
-
- return self.getObj().pt_render(extra_context={'here':self})
+
+
+
+ try:
+ return self.getObj().pt_render(extra_context={'here':self})
+ except:
+ self.REQUEST.RESPONSE.redirect(self.getObj().absolute_url())
+
def manage_addMPIWGLinkForm(self):
"""Form for adding link"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGLink.zpt')).__of__(self)
@@ -239,7 +274,7 @@ def manage_addMPIWGTemplateForm(self):
from urllib import quote
-def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,weight=0,REQUEST=None):
+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]
@@ -282,7 +317,7 @@ def manage_addMPIWGTemplate(self, MPIWGT
class MPIWGRoot(ZSQLExtendFolder):
- """Stammordner für den Web-Server"""
+ """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',
@@ -295,6 +330,30 @@ class MPIWGRoot(ZSQLExtendFolder):
folders=['MPIWGProject','Folder','ECHO_Navigation']
meta_type='MPIWGRoot'
+ def transformProjectsToId(self):
+ """trnasformiere zu ID, Hilfsfunktion die die alten Templates analysiert und mit der neuen Liste
+ verantwortlicher Personen versieht"""
+ projects=self.getTree()
+ ret=""
+ for project in projects:
+ proj=project[3]
+ persons=proj.identifyNames(proj.getContent('xdata_01'))
+ if not hasattr(proj,'responsibleScientistsList'):
+ proj.responsibleScientistsList=[]
+
+ for person in persons.items():
+ logging.info("XXXX"+repr(person))
+ if len(person[1]) >1: #nicht eindeutig
+ ret+="nicht eindeutig --- %s: %s\n"%(proj.getId(),person[0])
+
+ elif len(person[1]) ==0: #kein eintrage
+ ret+="kein eintrag--- %s: %s\n"%(proj.getId(),person[0])
+ proj.responsibleScientistsList.append((person[0],""))
+ else:
+ proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey()))
+
+ return ret
+
def harvestProjects(self):
"""harvest"""
folder="/tmp"
@@ -317,15 +376,22 @@ class MPIWGRoot(ZSQLExtendFolder):
if not str:
return ""
if type(str) is StringType:
- try:
- return str.decode('utf-8')
- except:
- return str.decode('latin-1')
+ 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 = {}
@@ -487,6 +553,8 @@ class MPIWGRoot(ZSQLExtendFolder):
"""returns the current section name"""
root = self.absolute_url()
url = self.REQUEST['URL']
+ if not url:
+ return None
path = string.replace(url, root, '')
paths = path.split('/')
if len(paths) > 0:
@@ -512,9 +580,9 @@ class MPIWGRoot(ZSQLExtendFolder):
"""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)
- zLOG.LOG("MPIWG Web",zLOG.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath))
+ 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()
- zLOG.LOG("MPIWG Web",zLOG.INFO,"result convert: %s"%ret)
+ logger("MPIWG Web",logging.INFO,"result convert: %s"%ret)
return 1
def patchProjects(self,RESPONSE):
@@ -536,8 +604,12 @@ class MPIWGRoot(ZSQLExtendFolder):
def isActual(self,project):
"""checke if project is actual"""
actualTime=time.localtime()
- obj= project.getObject()
+ if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList
+ obj=project.getObject()
+ else:
+ obj=project
+
if getattr(obj,'archiveTime',actualTime)< actualTime:
return False
else:
@@ -642,7 +714,7 @@ class MPIWGRoot(ZSQLExtendFolder):
def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None):
- """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents"""
+ """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])
@@ -683,19 +755,7 @@ class MPIWGRoot(ZSQLExtendFolder):
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
- def getDisciplineList(self):
- """get disciplines as list"""
- list= self.disciplineList.split("\n")
- return [x.rstrip().lstrip() for x in list]
-
- def getThemeList(self):
- """get themes as list"""
- list= self.themesList.split("\n")
- return [x.rstrip().lstrip() for x in list]
-
- def test(self):
- """test"""
- return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
+
def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True):
"""childs alle childs, alle parents"""
@@ -770,47 +830,21 @@ class MPIWGRoot(ZSQLExtendFolder):
manage_options = Folder.manage_options+(
- {'label':'Update personal homepages','action':'updateHomepages'},
+ {'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 importNamesForm(self):
- """Form"""
- pt=PageTemplateFile(os.path.join(package_home(globals()),'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:
- zLOG.LOG("MPIWG Web (importNames)",zLOG.INFO,"cannot import: %s"%splitted[0])
-
-
- if RESPONSE is not None:
- RESPONSE.redirect('manage_main')
def updatePublicationDB(self,personId=None):
- """updates the publication db, i.e. copy year into the main table"""
+ """updates the publication db, i.e. copy year and type into the main table"""
if personId:
- founds = self.ZSQLInlineSearch(_table="publications",id_main=personId)
+ founds = self.ZSQLInlineSearch(_table="publications",key_main=personId)
else:
founds = self.ZSQLInlineSearch(_table="publications")
@@ -828,136 +862,220 @@ class MPIWGRoot(ZSQLExtendFolder):
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"""
- def updateHomepages(self,RESPONSE=None):
- """ update"""
-
- RESPONSE.setHeader('Content-type', 'text/html')
- RESPONSE.write("
\n")
- RESPONSE.write("Update Institutsbibliography\n")
- ret=self.upDateSQL('personalwww.xml')
- RESPONSE.write("done Insitutsbibliography:%s\n"%ret)
- url="http://itgroup.mpiwg-berlin.mpg.de:8050/FMPro?-db=personal-www&-format=-dso_xml&-lay=sql_export&-max=20000&-findall"
- dom = NonvalidatingReader.parseUri(url)
- #fh=urllib.urlopen(url)
- #dom=xml.dom.minidom.parse(fh)
-
- RESPONSE.write("got_xml_File\n")
+ 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')
- members=memberFolder.ZopeFind(memberFolder,obj_metatypes=["MPIWGStaff"])
+ 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)
- memberList=[x[0] for x in members]
- #print dom
- #ctx=Context(dom,processorNss={EMPTY_NAMESPACE:'http://www.filemaker.com/fmpdsoresult'})
- # Evaluate(u".//dn:ROW",contextNode=dom,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
- #print dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
- for row in dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}):
-
- username=getTextFromNode(row.xpath('./dn:username',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- id=getTextFromNode(row.xpath('./dn:ID',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- name=getTextFromNode(row.xpath('./dn:Name',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- vorname=getTextFromNode(row.xpath('./dn:Vorname',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- title=getTextFromNode(row.xpath('./dn:Title',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- position=getTextFromNode(row.xpath('./dn:Position',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- e_mail=getTextFromNode(row.xpath('./dn:e_mail',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- e_mail_p=getTextFromNode(row.xpath('./dn:e_mail_p',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- date_from=getTextFromNode(row.xpath('./dn:Date_from',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- date_to=getTextFromNode(row.xpath('./dn:Date_to',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- abteilung=getTextFromNode(row.xpath('./dn:Abteilung',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- heimat_inst=getTextFromNode(row.xpath('./dn:heimat_inst',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- funded_by=getTextFromNode(row.xpath('./dn:funded_by',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- e_mail2=getTextFromNode(row.xpath('./dn:e_mail2',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- publish_the_data=getTextFromNode(row.xpath('./dn:publish_the_data',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- stay_at_mpiwg=getTextFromNode(row.xpath('./dn:stay_at_mpiwg',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
- #cwNode=row.xpath('./dn:current_work.current',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]
- cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
- if cw:
- txt=getTextFromNode(cw[0])
- else:
- txt=""
-
- #cwNode=row.xpath('.//dn:current_work.publish',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]
- cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
+ 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
- if cw:
- txt_p=getTextFromNode(cw[0])
+
+ insert=[]
+ for key in columns:
+ if data[key]=="date_none": # date_none eintrag wird zu null uebersetzt
+ insert.append('%s=null'%key)
else:
- txt_p=""
-
- project=getattr(self,'members')
+ insert.append(""" "%s"=%s"""%(key,self.ZSQLQuote(data[key])))
- if not (username in memberList):#neuer eintrag
-
- try:
- newObj=MPIWGStaff.MPIWGStaff(str(username),name.encode('utf-8'),vorname.encode('utf-8'))
- memberFolder._setObject(str(username),newObj)
- RESPONSE.write("new:%s
\n"%username.encode('utf-8'))
- obj=getattr(memberFolder,username)
- ret=obj.createNewDBEntry(publish_the_data,id,name,
- vorname,username,title,position,e_mail,
- e_mail_p,date_from,date_to,
- abteilung,heimat_inst,funded_by,
- e_mail2,txt,txt_p,stay_at_mpiwg)
- RESPONSE.write("""%s
"""%ret[1].encode('utf-8'))
- except:
- RESPONSE.write("ERROR:%s %s %s
\n"%(username.encode('utf-8'),name.encode('utf-8'),vorname.encode('utf-8')))
- RESPONSE.write(" : %s %s"%sys.exc_info()[:2])
- else:
- RESPONSE.write("
update:%s
\n"%username.encode('utf-8'))
+ 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+="%s | %s | %s | "%(iE[0].encode('utf-8'),iE[1].encode('utf-8'),iE[2].encode('utf-8'))
+ ret+=""
- xquery=".//dn:ROW[dn:username='%s']"%username
- results=dom.xpath(xquery,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
- if len(results)>1:
- RESPONSE.write("WARNING (update): username %s not unique
\n"%username.encode('utf-8'))
- xquery=".//dn:ROW[dn:publish_the_data='yes' and dn:username='%s']"%username
- rd=dom.xpath(xquery,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
- if len(rd)>1:#mehrere published
- RESPONSE.write("ERROR (update): username %s not unique and more then one date set to be published
\n"%username.encode('utf-8'))
-# elif len(rd)==1:#nur einer published, kein published dann mache nichts
-# publish_the_data=getTextFromNode(rd[0].xpath('./dn:publish_the_data',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
-# date_from=getTextFromNode(rd[0].xpath('./dn:Date_from',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
-# date_to=getTextFromNode(rd[0].xpath('./dn:Date_to',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
-#
-
- obj=getattr(memberFolder,username)
-
- done= obj.updateDBEntry(DBid=id,publish_the_data=publish_the_data,
- date_from=date_from,
- date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position,abteilung=abteilung)
- if not done and (publish_the_data=='yes'):
-
- ret=obj.createNewDBEntry(publish_the_data,id,name,
- vorname,username,title,position,e_mail,
- e_mail_p,date_from,date_to,
- abteilung,heimat_inst,funded_by,
- e_mail2,txt,txt_p,stay_at_mpiwg)
- if not ret[0]:
+ 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+""
+
- RESPONSE.write("Error: %s
\n"%repr(ret[1]))
- else:
- RESPONSE.write("New: %s
\n"%repr(ret[1]))
+ 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()
- #TODO: reindexCatlogs and updatePublications wieder einbaue
- #self.reindexCatalogs(RESPONSE)
- #self.updatePublicationDB()
-
- #self.ZSQLResetConnection()
- RESPONSE.write("Done
")
-
- return True
+ 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
+
+ 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"""
try:
- self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
+
self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
except:
- zLOG.LOG("MPIWG Root (updatehomepage)",zLOG.WARNING," %s %s"%sys.exc_info()[:2])
+ logger("MPIWG Root (updatehomepage)",logging.WARNING," %s %s"%sys.exc_info()[:2])
@@ -968,72 +1086,21 @@ class MPIWGRoot(ZSQLExtendFolder):
- def updateHomepages_old(self,RESPONSE):
- """lege members an, alte version vollstaendige kopie aller fm-dateien per fm.jar"""
- self.upDateSQL('personalwww.xml')
- founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes')
- project=getattr(self,'members')
- for found in founds:
-
- if not (found.e_mail==""):
- newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname)
-
- try:
- project._setObject(found.username,newObj)
- RESPONSE.write("new:%s
\n"%found.username)
- except:
- RESPONSE.write("old:%s (%s,%s)
\n"%(found.username,found.name,found.vorname))
-
-
-
- #delete non existing
-
-
- foundUserNames=[x.username for x in founds]
- for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1):
-
- if member[1].getId() not in foundUserNames:
- member[1].aq_parent.manage_delObjects(ids=[member[1].getId()])
- RESPONSE.write("deleted:%s
\n"%member[1].getId())
- try:
- self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
- except:
- pass
- self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
-
- self.updatePublicationDB()
-
- if RESPONSE is not None:
- RESPONSE.redirect('manage_main')
-
-
-# def getAllMembers(self,reset=None):
-# """give list of all members"""
-# ret=[]
-#
-#
-# if reset or (getattr(self,'_v_membersList',None) is None):
-# for member in self.members._objects:
-# if member['meta_type']=='MPIWGStaff':
-# memberObj=getattr(self.members,member['id'])
-# if memberObj.isPublished():
-# ret.append(memberObj.title.decode('utf-8'))
-#
-# ret.sort()
-# self._v_membersList=ret[0:]
-# print ret
-#
-# return self._v_membersList
def getAllMembers(self):
#ret=[]
+ def sorter(x,y):
+ return cmp(x[0],y[0])
+
results=self.MembersCatalog({'isPublished':True})
- ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results]
+ ret=[(", ".join([proj.lastName, proj.firstName]).decode('utf-8'),proj.getKey) for proj in results]
- ret.sort()
+ ret.sort(sorter)
return ret
+
+
def printAllMembers(self):
"""print"""
members=self.getAllMembers()
@@ -1051,10 +1118,21 @@ class MPIWGRoot(ZSQLExtendFolder):
return entry
- def getTree(self,dep=None,date=None,onlyActive=None):
- """generate Tree from project list"""
+ def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0):
+ """generate Tree from project list
+ als Liste, jeder Eintrag ist ein Tupel ,(Tiefe, ProjektNummer,ProjektObject
+ onlyActive = 0 : alle Projekte
+ onlyActive = 1 : nur active Projekte
+ onlyActive = 2: nur inactive Projekte
+
+ onlyArchived=0: alle Projekte
+ onlyArchived= 1 : nur aktuelle Projekte
+ onlyArchived = 2: nur archivierte Projekte
+ """
+ returnListTmp=[]
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
@@ -1066,89 +1144,31 @@ class MPIWGRoot(ZSQLExtendFolder):
title=[project[0].getContent('WEB_title')]
#print title
- if idNr[0]=="x": # kompatibilitŠt mit alter Konvention, x vor der Nummer macht project inactive
+ 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 hinzufŸgen.
- 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 formatElementsAsList(self,elements,onlyOneDept=False):
- """formatiere tree als liste"""
+ if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
+
+ if (onlyActive==0):
+ returnListTmp.append((depth,nr,title,project[0]))
+ elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte
+ returnListTmp.append((depth,nr,title,project[0]))
+ elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte
+ returnListTmp.append((depth,nr,title,project[0]))
+
+
+ #filter jetzt die Liste nach Archived oder nicht
+ for entry in returnListTmp:
+ if (onlyArchived==0):
+ returnList.append(entry)
+ elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte
+ returnList.append(entry)
+ elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte
+ returnList.append(entry)
+
- actualDepth=0
- ret=""
- for element in elements:
- if (element[0]>actualDepth):
- #fuege soviele ul ein wie unterschied in tiefe
- if element[0]==1:
- ret+="""\n
\n"""
- else:
- for i in range(element[0]-actualDepth):
- if i>0:
- ret+="- "
- ret+="""
\n"""
-
- actualDepth=element[0]
-
- elif (element[0]
\n"
-
- #ret+="
\n\n\n\n"
-
-
- if element[0]==1:
- department=int(element[3].getContent('xdata_05'))-1
-
- ret+="""
\n"""
- if department==4: #hack
- department=3
-
- ret+="""
- \n
\n
- """%department
-
- actualDepth=element[0]
- else:
- ret+="""\n\n"""
- ret+="""- \n"""
-
- if actualDepth==1:
- departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group','6':'Ind. Research Group','7':'Research Network'}
- department=element[3].getContent('xdata_05')
- if not onlyOneDept:
- ret+="""
%s: """%(department,departmentName[department])
-
- if self.REQUEST.has_key('date'):
- ret+="""%s"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",self.REQUEST['date'],element[3].getContent('WEB_title'))
- else:
- ret+="""%s"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",element[3].getContent('WEB_title'))
- return ret
-
- def formatElementForOverview(self,element):
- """format the element for output in overview"""
- if element[0]==1: #department
- #print element[3].getContent('xdata_05')
- if element[3].getContent('xdata_05') == "4":
- return """"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
- if element[3].getContent('xdata_05') == "5":
- return """"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
- if element[3].getContent('xdata_05') == "6":
- return """"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
-
- return """"""%(element[3].absolute_url()+"/index.html",element[3].getContent('xdata_05'),element[3].getContent('WEB_title'))
-
- elif element[0]==2: #mainprojects
- return """"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
+ return returnList
- elif element[0]==3:
- return """
%s
"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
def changePosition(self,treeId,select,RESPONSE=None):
@@ -1187,24 +1207,49 @@ class MPIWGRoot(ZSQLExtendFolder):
"""change the complete tree"""
form=self.REQUEST.form
hashList={}
- fields=self.getTree()
-
+ onlyArchived=int(form.get("onlyArchived",0))
+ onlyActive=int(form.get("onlyActive",0))
+
+
+ fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive)
- for idNr in form.keys():
+ logging.info("GOT TREE!----------------------------------------------------")
+ for field in form.keys():
- splitted=idNr.split('_')
+ splitted=field.split('_')
+ if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber
- 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)
+
+ nr=int(splitted[0]) # nummer des Datensatzes
+ currentEntry = fields[nr]
+
+ if form.has_key(str(nr)+'_active'): # active flag is set
+ fields[nr][3].setActiveFlag(True)
else:
-
- fields[int(splitted[0])][3].setActiveFlag(False)
+ fields[nr][3].setActiveFlag(False)
+
+ #nummer hat sich geŠndert
+
+ entryChanged = False;
+
+
+ if not (fields[nr][3].xdata_05==form[str(nr)+'_number']):
+ logging.info("Changed!Number+++++++++++++++++++++++++++++++++")
+ fields[nr][3].xdata_05=form[str(nr)+'_number']
+ entryChanged = True
+
+ #completed har sich geaendert
+
+ if not (fields[nr][3].getCompletedAt()==fields[nr][3].transformDate(form[str(nr)+'_completed'])):
+ fields[nr][3].setCompletedAt(form[str(nr)+'_completed'])
+ logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
+ entryChanged = True
+
+
+ if entryChanged:
+ logging.info("Changed!+++++++++++++++++++++++++++++++++")
+ fields[nr][3].copyObjectToArchive()
+
if RESPONSE is not None:
RESPONSE.redirect('showTree')
@@ -1250,43 +1295,89 @@ class MPIWGRoot(ZSQLExtendFolder):
ret.append("%s"%person)
return string.join(ret,";")
-
- def getUrlFromPerson(self,list):
- """get urls to person list"""
- ret=[]
- persons=list.split(";")
- for person in persons:
-
- if len(person)>1: #nicht nur Trennzeichen
- splitted=person.split(",")
- if len(splitted)==1:
- splitted=person.lstrip().rstrip().split(" ")
- splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
- if splittedNew[0]=='':
- del splittedNew[0]
- search=string.join(splittedNew,' AND ')
-
- if not search=='':
-
- try:
- proj=self.MembersCatalog({'title':search})
- except:
- proj=None
+ def getMemberIdFromKey(self,key):
+ """gibt die ensprechende id im members Ordner zum key"""
+
+ if key=="":
+ return ""
+ catalogged=self.MembersCatalog({'getKey':key})
+ if len(catalogged)==0:
+ return ""
+ else:
+ return catalogged[0].getObject().getId()
+
- 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 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:
+# logging.error("search publ %s:"%member[0].getObject().isPublished())
+# 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=[]
@@ -1294,62 +1385,78 @@ class MPIWGRoot(ZSQLExtendFolder):
#return str(members)
for x in members:
-
- ret+=self.getProjectsOfMember(name=x,date=date)
+ projects=self.getProjectsOfMember(key=x[1],date=date)
+ if len(projects)>0:
+ ret.append((x[0],projects))
return ret
- def getProjectsOfMember(self,name=None,email=None,date=None):
- """get project of a member"""
+ def getProjectsOfMember(self,key=None,date=None,onlyArchived=1,onlyActive=1):
+ """get projects of a member
+
+ @param key: (optional) Key zur Idenfikation des Benutzer
+ @param date: (optional) Version die zum Zeitpunkt date gueltig war
+ @param onlyArchived:
+ onlyArchived=0: alle Projekte
+ onlyArchived= 1 : nur aktuelle Projekte
+ onlyArchived = 2: nur archivierte Projekte
+ """
+ # 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=[]
- splitNeu=[]
- if email:
-
- members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
- name = members[0][1].title.decode('utf-8')
-
- y=name
- splitted=y.split(",")
- #XXXX
- splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
-
- #for s in splitted:
- # splitNeu.append("\""+s+"\"")
- search=string.join(splitNeu,' AND ')
+ ret=[]
+ if key:
+ proj=self.ProjectCatalog({'getPersonKeyList':key})
+ else:
+ return ret # key muss definiert sein
- proj=self.ProjectCatalog({'xdata_01':search})
-
+
if proj:
proj2=[]
for x in proj:
- if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
- if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
- proj2.append(x)
+ if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
+ proj2.append(x)
else:
proj2=[]
- proj=self.ProjectCatalog({'xdata_08':search})
- if proj:
- names=[x.WEB_title for x in proj]
- for x in proj:
-
- if (not x.WEB_title in names) and (getattr(x.getObject(),'archiveTime','')==''):
- proj2.append(x)
-
-
+
+
proj2.sort(sortP)
- if len(proj2)>0:
- ret.append((y,proj2))
-
- return ret
+ projectListe=[]
+
+ for proj in proj2:
+ obj=proj.getObject()
+ add=False
+ if onlyArchived==1: #nur aktuell projecte
+ if not obj.isArchivedProject():
+ add=True
+ elif onlyArchived==2: #nur archivierte
+ if obj.isArchivedProject():
+ add=True
+ else: #alle
+ add=True
+
+ if onlyActive==1: #nur active projecte
+ if obj.isActiveProject():
+ add=add & True
+ else:
+ add=add & False
+
+ elif onlyArchived==2: #nur nicht aktvive
+ if not obj.isActiveProject():
+ add=add & True
+ else: #alle
+ add=add & True
+
+ if add:
+ projectListe.append(obj)
+
+
+ return projectListe
def givePersonList(self,name):
"""check if person is in personfolder and return list of person objects"""
@@ -1393,7 +1500,7 @@ class MPIWGRoot(ZSQLExtendFolder):
## objs.append((obj,lastName+", "+firstName))
- return objs
+## return objs
def personCheck(self,names):
@@ -1476,7 +1583,7 @@ class MPIWGRoot(ZSQLExtendFolder):
results[id]=[]
objId=found.getObject().getId()
if not (objId in results[id]):
- print "added %s for %s"%(id,objId)
+ print "d %s for %s"%(id,objId)
results[id].append(objId)
self.nameIndex=results
return results
@@ -1508,10 +1615,13 @@ class MPIWGRoot(ZSQLExtendFolder):
dh=getattr(self,'deletedHistoricalNames',{})
+
+ if type(dh) is ListType:
+ dh={}
if not dh.has_key(name):
- dh=occurrances.split("\n")
+ dh[name]=occurrances.split("\n")
else:
- dh+=occurrances.split("\n")
+ dh[name]+=occurrances.split("\n")
self.deletedHistoricalNames=dh
@@ -1541,39 +1651,7 @@ class MPIWGRoot(ZSQLExtendFolder):
self.nameIndexEdited=self.nameIndex
return "done"
- def changeHistoricalNames(self,projId,nameListTmp):
- """add resp change nameIndexEdited b
- y adding/changing names menitionen in project projId"""
-
- #clear namelist from blanks
- nameList=[x.lstrip().rstrip() for x in nameListTmp]
-
- nI=self.nameIndexEdited
- for name in nameList:
- if not nI.has_key(name): #neuer Name
- nI[name]=[projId]
-
- for name in nI.keys():
-
- if name in nameList: #checke if name in name List
-
- if not(projId in nI[name]): #nicht in listt -> hinzufuegen
-
- nI[name].append(projId)
-
- """loesche falls projekt in nI list aber der name nicht mehr
- in der namensliste des projectes auftaucht
- """
-
- for pr in nI[name]:
-
- if (pr==projId) and (not name in nameList):
-
- nI[name].remove(pr)
- self.nameIndexEdited=nI
-
-
def manage_addMPIWGRootForm(self):
"""form for adding the root"""
@@ -1642,6 +1720,9 @@ class MPIWGProject(CatalogAware,Folder):
meta_type='MPIWGProject'
default_catalog='ProjectCatalog'
+ def decode(self,str):
+ """return unicode object"""
+ return unicodify(str)
def sortedByPlace(self,metatype):
"""find metatype and sort by place"""
@@ -1685,10 +1766,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:
imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
+ except:
+ imageURLs.append("")
split2="".join(tmp[1:])
@@ -1703,13 +1789,8 @@ class MPIWGProject(CatalogAware,Folder):
#keine caption
imageCaptions.append("")
-
-
-
-
-
-
-
+
+
#eintragen:
for imageURL in imageURLs:
filename=imageURL.split("/")[-1]
@@ -1730,7 +1811,7 @@ class MPIWGProject(CatalogAware,Folder):
try:#absolute
data=urllib.urlopen(self.imageURL).read()
except:
- zLOG.LOG("MPIWG Project",zLOG.ERROR,"can't open: %s"%url)
+ logger("MPIWG Project",logging.ERROR,"can't open: %s"%url)
obj=getattr(self,filename)
obj.update_data(data)
@@ -1831,16 +1912,26 @@ 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:
+ RESPONSE.redirect('managePublications')
+
def getImages(self):
"""get all Images"""
+
def sort_images(x,y):
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=''
+
images=self.ZopeFind(self,obj_metatypes=['MPIWGProject_image'])
images.sort(sort_images)
@@ -1861,7 +1952,7 @@ class MPIWGProject(CatalogAware,Folder):
RESPONSE.redirect('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)
@@ -1870,6 +1961,7 @@ class MPIWGProject(CatalogAware,Folder):
return True
else:
return False
+
def addImage(self,fileHd,caption,RESPONSE=None,filename=None):
"""add an MPIWG_Project_image"""
@@ -1887,7 +1979,8 @@ class MPIWGProject(CatalogAware,Folder):
obj.caption=caption[0:]
obj.enabled=True;
obj.place=self.getLastImageNumber()+1
-
+ obj.id=filename
+
if RESPONSE is not None:
RESPONSE.redirect('manageImages')
@@ -2008,7 +2101,7 @@ class MPIWGProject(CatalogAware,Folder):
def generateTemplate(self,RESPONSE=None):
- """Erzeuge Template für defined fields not_used"""
+ """Erzeuge Template fuer defined fields not_used"""
id="index_html"
title=id
@@ -2029,6 +2122,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:
@@ -2053,11 +2147,94 @@ 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=getattr(self,'completedAt',0)
+
+ #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 getCompletedAt(self):
+ """gibt das transformierte Datum zurŸck"""
+ date=getattr(self,'completedAt','')
+ 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))
+ 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 angebebenn Werte
+ werden auf 0 gesetzt, es wird null zurŸckgegeben falls das Datum ungueltig ist"""
+
+ if (date=="" ) :
+ return "";
+
+ if (date==None):
+ return None;
+
+ 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"""
@@ -2100,24 +2277,24 @@ class MPIWGProject(CatalogAware,Folder):
return pt()
def getGetNeighbourhood(self,wordStr, length=100,tagging=True):
- """finde umgebung um die worte in wordStr, zurŸckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte
+ """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 grš§e der Umgebung
+ @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 spŠter zurŸckgegeben wird
+ 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 zurŸck,
+ """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 geprŸft werden soll
- @param length: LŠnge des Wortes das geprŸft werden soll
+ @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)):
@@ -2158,7 +2335,7 @@ class MPIWGProject(CatalogAware,Folder):
#is word already in one of the results
nr=isInRanges(pos,len(word))
- if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergrš§ere diese
+ 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)
@@ -2168,7 +2345,7 @@ class MPIWGProject(CatalogAware,Folder):
ranges[nr]=(x,y) # neue Position der Umgebung
ret[nr]=str # neue Umgebung
- else: # andernfalls neue Umgebung hinzufŸgen
+ else: # andernfalls neue Umgebung hinzufuegen
ranges.append((x,y))
ret.append(str)
@@ -2279,8 +2456,11 @@ class MPIWGProject(CatalogAware,Folder):
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=""
+
split2="".join(tmp[1:])
text3=splitted[0]+split2
@@ -2302,15 +2482,21 @@ class MPIWGProject(CatalogAware,Folder):
else:
text5=text2
- #teste ob WEB_project_description und keine führenden p tags
+ #teste ob WEB_project_description und keine fuehrenden p tags
if (len(text5)>4) and (not text5[0:3]=='') and (field=='WEB_project_description'):
text5= "
"+text5+"
"
#filter image
+ text5=text5.lstrip().rstrip() #loescher leerzeichen und einzelndes br
+ if (text5=="
") 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"""
@@ -2417,7 +2603,64 @@ 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 = [x[1] for x in getattr(self,"responsibleScientistsList",[])]
+
+ if key in keys:
+ return True
+ else:
+ return False
+
+ def getPersonKeyList(self):
+ """gibt die key Lister der beteiligten Personen zurŸck"""
+ return [x[1] for x in getattr(self,'responsibleScientistsList',[])]
+
+
+
+
+ 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
+ """
+ nameList=nameList.replace(";",",") # falls ; als Trenner ersetze
+ names=nameList.split(",")
+
+ 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
+ logging.info("Search: %s %s %s"%(name,firstname,lastname))
+ cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname)
+
+ #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]=[]
+
+ return returnNamesDict
+
def editMPIWGProject(self,RESPONSE=None,fromEdit=None):
"""edit the project and archive the old version"""
@@ -2429,15 +2672,44 @@ class MPIWGProject(CatalogAware,Folder):
setattr(self,x,[self.REQUEST[x].decode('utf-8')])
- self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
+
+
+
+ completedAt = self.REQUEST.get('completedAt')
+ if not self.setCompletedAt(completedAt):
+ RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong')
+
+ if self.REQUEST.has_key('historicalNames'):
+ self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
if self.REQUEST.has_key('active'):
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():
+ tmpList.append((names[nr],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.REQUEST.get('xdata_01','')))
+
else:
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
@@ -2500,10 +2772,15 @@ 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()
+
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):