--- MPIWGWeb/MPIWGProjects.py 2006/08/15 13:28:29 1.47.2.58
+++ MPIWGWeb/MPIWGProjects.py 2007/10/18 12:00:17 1.47.2.79
@@ -2,7 +2,7 @@
for organizing and maintaining the different project pages
"""
-#TODO: mechanismus fur links to personen ueberarbeiten, da jetzt alle e_mails als members auftauchen unabhaengig vom status publish_the_data
+#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
@@ -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
@@ -33,12 +33,19 @@ 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 = ""
@@ -103,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"""
@@ -142,14 +172,14 @@ 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
- manage_options=SimpleItem.manage_options+(
+ manage_options=(
{'label':'main config','action':'changeLinkForm'},
- )
+ )+SimpleItem.manage_options
def changeLinkForm(self):
@@ -166,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)
@@ -238,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]
@@ -281,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',
@@ -294,6 +330,7 @@ class MPIWGRoot(ZSQLExtendFolder):
folders=['MPIWGProject','Folder','ECHO_Navigation']
meta_type='MPIWGRoot'
+
def harvestProjects(self):
"""harvest"""
folder="/tmp"
@@ -316,14 +353,50 @@ 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 = {}
+ 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"""
@@ -453,14 +526,38 @@ class MPIWGRoot(ZSQLExtendFolder):
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)
- 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):
@@ -585,89 +682,10 @@ class MPIWGRoot(ZSQLExtendFolder):
"""quote"""
return urllib.unquote(str)
- def harvestHistoricalPersons(self):
- """erstelle liste aller erwaehnten actors"""
-
- def normalize(str):
- """loesche fuhrendes space"""
- if (len(str)>1) and (str[0]==" "):
- ret=str[1:]
- else:
- ret=str
- return ret
-
- list={}
- projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
-
- for project in projects:
- lg=len(project[1].xdata_03[0])-1
-
- if (lg>1) and (project[1].xdata_03[0][lg]==";"):
- project[1].xdata_03[0]=project[1].xdata_03[0][0:lg]
-
-
-
-
- try:
- if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ;
- for person in project[1].xdata_03[0].split(";"):
- personNormal=normalize(person)
- if personNormal in list.keys():
- list[urllib.quote(personNormal)][1].append(project[1])
- else:
- list[urllib.quote(personNormal)]=(personNormal,[project[1]])
- else: #guess , is sepeator
- for person in project[1].xdata_03[0].split(","):
- personNormal=normalize(person)
- if urllib.quote(personNormal) in list.keys():
- list[urllib.quote(personNormal)][1].append(project[1])
- else:
- list[urllib.quote(personNormal)]=(personNormal,[project[1]])
-
- except:
- zLOG.LOG("MPIWG Web (harvestHistoricalPerson)",zLOG.ERROR,"cannot analyize: %s"%repr(project))
-
-
- return list
-
- def storeHistoricalPersons(self,RESPONSE=None):
- """store persons"""
- self.personDict={}
- personDict=self.harvestHistoricalPersons()
- for person in personDict.keys():
- for project in personDict[person][1]:
- if person in self.personDict.keys():
- self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0]))
- else:
- self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])])
-
- if RESPONSE is not None:
- RESPONSE.redirect("showHistoricalPersons")
-
-
- def getPersonDict(self,name):
- """name von dict"""
-
- try:
- return self.personDict[name][0].encode('utf-8')
- except:
- return self.personDict[name][0]
- return self.personDict[name][0].decode('latin-1').encode('utf-8')
-
-
- def showHistoricalPersons(self):
- """show persons"""
- pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','showHistoricalPersons')).__of__(self)
- return pt()
-
- def editHistoricalPersonsForm(self):
- """edit historical persons for consistency"""
- pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editHistoricalPersonsForm')).__of__(self)
- return pt()
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])
@@ -708,19 +726,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"""
@@ -795,47 +801,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")
@@ -853,136 +833,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])
@@ -993,62 +1057,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=[]
@@ -1076,7 +1084,7 @@ class MPIWGRoot(ZSQLExtendFolder):
return entry
- def getTree(self,date=None,onlyActive=None):
+ def getTree(self,dep=None,date=None,onlyActive=None):
"""generate Tree from project list"""
returnList=[]
@@ -1091,87 +1099,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 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]))
+ 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):
- """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')
- 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):
@@ -1274,6 +1211,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=[]
@@ -1300,7 +1267,11 @@ class MPIWGRoot(ZSQLExtendFolder):
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')))
- ret.append("%s"%(proj[0].absolute_url+"/index.html",person))
+ 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)
@@ -1318,8 +1289,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
@@ -1327,14 +1303,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]+"\'"]
@@ -1343,12 +1327,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:
@@ -1366,7 +1351,7 @@ class MPIWGRoot(ZSQLExtendFolder):
proj2.sort(sortP)
if len(proj2)>0:
- ret.append((y,proj2))
+ ret.append((name,proj2))
return ret
@@ -1412,7 +1397,7 @@ class MPIWGRoot(ZSQLExtendFolder):
## objs.append((obj,lastName+", "+firstName))
- return objs
+## return objs
def personCheck(self,names):
@@ -1444,7 +1429,127 @@ class MPIWGRoot(ZSQLExtendFolder):
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)
@@ -1512,6 +1617,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"""
@@ -1555,10 +1663,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:])
@@ -1573,13 +1686,8 @@ class MPIWGProject(CatalogAware,Folder):
#keine caption
imageCaptions.append("")
-
-
-
-
-
-
-
+
+
#eintragen:
for imageURL in imageURLs:
filename=imageURL.split("/")[-1]
@@ -1600,7 +1708,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)
@@ -1701,16 +1809,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)
@@ -1730,7 +1848,7 @@ class MPIWGProject(CatalogAware,Folder):
if RESPONSE:
RESPONSE.redirect('manageImages')
-
+
def hasChildren(self,date=None,onlyActive=True):
"""check if project has children"""
ct=self.getContexts(childs=self.getContent('xdata_05'),
@@ -1740,6 +1858,7 @@ class MPIWGProject(CatalogAware,Folder):
return True
else:
return False
+
def addImage(self,fileHd,caption,RESPONSE=None,filename=None):
"""add an MPIWG_Project_image"""
@@ -1757,7 +1876,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')
@@ -1878,7 +1998,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
@@ -1969,24 +2089,25 @@ class MPIWGProject(CatalogAware,Folder):
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self)
return pt()
- def getGetNeighbourhood(self,wordStr, length=100):
- """finde umgebung um die worte in wordStr, zurŸckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte
+ 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 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)):
@@ -2008,7 +2129,8 @@ class MPIWGProject(CatalogAware,Folder):
# 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 " "
@@ -2026,7 +2148,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)
@@ -2036,7 +2158,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)
@@ -2046,10 +2168,11 @@ class MPIWGProject(CatalogAware,Folder):
break;
# now highlight everything
- 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])
+ 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
@@ -2146,8 +2269,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
@@ -2169,15 +2295,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"""
@@ -2296,6 +2428,10 @@ class MPIWGProject(CatalogAware,Folder):
setattr(self,x,[self.REQUEST[x].decode('utf-8')])
+
+ 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:
@@ -2436,4 +2572,4 @@ def manage_addMPIWGProject(self,id,RESPO
if RESPONSE is not None:
- RESPONSE.redirect('manage_main')
\ No newline at end of file
+ RESPONSE.redirect('manage_main')