--- MPIWGWeb/MPIWGProjects.py 2006/11/08 14:47:13 1.47.2.64
+++ MPIWGWeb/MPIWGProjects.py 2007/05/02 18:32:45 1.47.2.76
@@ -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 = ""
@@ -143,7 +149,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 +173,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 +251,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 +294,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 +307,7 @@ class MPIWGRoot(ZSQLExtendFolder):
folders=['MPIWGProject','Folder','ECHO_Navigation']
meta_type='MPIWGRoot'
+
def harvestProjects(self):
"""harvest"""
folder="/tmp"
@@ -317,15 +330,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 = {}
@@ -512,9 +532,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):
@@ -642,7 +662,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 +703,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 +778,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 +810,221 @@ 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"""
+
+ qstr="select * from personal_www where web_object_created='no' and not key=''"
+ res=self.ZSQLQuery(qstr)
- def updateHomepages(self,RESPONSE=None):
- """ update"""
+ 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"""
- 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)
+ 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:
- RESPONSE.write("got_xml_File\n")
+ 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' where key=%s"%(e_mail,self.ZSQLQuote(k))
+ self.ZSQLQuery(qstr)
+ return ret
+
- memberFolder=getattr(self,'members')
- members=memberFolder.ZopeFind(memberFolder,obj_metatypes=["MPIWGStaff"])
+ def generateNewPersonEntry(self,data):
+ """generate a new person entry for data, neue personen werden zunaechst nur in der datenbank angelegt """
- 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'})
+ #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,62 +1035,6 @@ 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=[]
@@ -1066,89 +1077,16 @@ 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 (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 formatElementsAsList(self,elements,onlyOneDept=False):
- """formatiere tree als liste"""
-
- actualDepth=0
- ret=""
- for element in elements:
- if (element[0]>actualDepth):
- #fuege soviele ul ein wie unterschied in tiefe
- if element[0]==1:
- ret+="""\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'))
-
- elif element[0]==3:
- return """
%s
"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
def changePosition(self,treeId,select,RESPONSE=None):
@@ -1251,6 +1189,36 @@ class MPIWGRoot(ZSQLExtendFolder):
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=[]
@@ -1280,7 +1248,7 @@ class MPIWGRoot(ZSQLExtendFolder):
if self.MPIWGrootURL().split("/")[-1]=='en':
tmpPath="/en/staff/members/"
else:
- tmpPath="/de/mitarbeiter/members/"
+ tmpPath="/de/mitarbeiter/members/"
ret.append("%s"%(tmpPath+proj[0].getObject().getId()+"/index.html",person))
else:
#ret.append("%s"%person.encode('utf-8'))
@@ -1299,8 +1267,13 @@ class MPIWGRoot(ZSQLExtendFolder):
return ret
- def getProjectsOfMember(self,name=None,email=None,date=None):
- """get project of a member"""
+ 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
@@ -1308,14 +1281,22 @@ class MPIWGRoot(ZSQLExtendFolder):
ret=[]
- splitNeu=[]
- if email:
+ logging.error("XXXXXXXXXXXXXXXXX")
+ if key:
- 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(",")
+ #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]+"\'"]
@@ -1324,12 +1305,13 @@ class MPIWGRoot(ZSQLExtendFolder):
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','')==''):
- if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
+ # 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:
@@ -1347,7 +1329,7 @@ class MPIWGRoot(ZSQLExtendFolder):
proj2.sort(sortP)
if len(proj2)>0:
- ret.append((y,proj2))
+ ret.append((name,proj2))
return ret
@@ -1393,7 +1375,7 @@ class MPIWGRoot(ZSQLExtendFolder):
## objs.append((obj,lastName+", "+firstName))
- return objs
+## return objs
def personCheck(self,names):
@@ -1476,7 +1458,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 +1490,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 +1526,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"""
@@ -1685,10 +1638,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 +1661,8 @@ class MPIWGProject(CatalogAware,Folder):
#keine caption
imageCaptions.append("")
-
-
-
-
-
-
-
+
+
#eintragen:
for imageURL in imageURLs:
filename=imageURL.split("/")[-1]
@@ -1730,7 +1683,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 +1784,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)
@@ -1870,6 +1833,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 +1851,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 +1973,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
@@ -2100,24 +2065,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 +2123,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 +2133,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 +2244,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,13 +2270,16 @@ 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=""
return text5.encode('utf-8')
@@ -2429,7 +2400,9 @@ class MPIWGProject(CatalogAware,Folder):
setattr(self,x,[self.REQUEST[x].decode('utf-8')])
- self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
+
+ 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)