--- MPIWGWeb/MPIWGProjects.py 2005/10/10 08:42:49 1.47.2.25
+++ MPIWGWeb/MPIWGProjects.py 2006/01/16 13:46:21 1.47.2.46
@@ -2,6 +2,10 @@
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: 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
+
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.PageTemplate import PageTemplate
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
@@ -23,12 +27,25 @@ from Products.ZSQLMethods.SQL import SQL
from AccessControl import ClassSecurityInfo
from bibliography import *
import time
+import xml.dom.minidom
+import sys
+from Ft.Xml.XPath import Evaluate
+from Ft.Xml.XPath.Context import Context
+from Ft.Xml.Domlette import NonvalidatingReader,PrettyPrint, Print
+from Ft.Xml import EMPTY_NAMESPACE
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']
+def getTextFromNode(nodename):
+ nodelist=nodename.childNodes
+ rc = ""
+ for node in nodelist:
+ if node.nodeType == node.TEXT_NODE:
+ rc = rc + node.data
+ return rc
def sortF(x,y):
try:
@@ -269,6 +286,25 @@ class MPIWGRoot(ZSQLExtendFolder):
txt="""
Auf dieser Seite finden Sie die Projekte mit Stand vom %s
"""%str(date)
return ""
+
+ def createOrUpdateId_raw(self):
+ """create sequence to create ids for bibliography"""
+ debug=None
+ #suche groesste existierende id
+ founds=self.ZSQLQuery("select id from bibliography")
+
+ if founds:
+ ids=[int(x.id[1:]) for x in founds]
+ maximum=max(ids)
+
+ id_raw=self.ZSQLQuery("select nextval('id_raw')",debug=debug)
+
+ if id_raw:
+ self.ZSQLQuery("drop sequence id_raw",debug=debug)
+
+ self.ZSQLQuery("create sequence id_raw start %i"%(maximum+1),debug=debug)
+
+
def queryLink(self,link):
"""append querystring to the link"""
return "%s?%s"%(link,self.REQUEST.get('QUERY_STRING',''))
@@ -501,7 +537,7 @@ class MPIWGRoot(ZSQLExtendFolder):
list[urllib.quote(personNormal)]=(personNormal,[project[1]])
except:
- zLOG.LOG("MPIWG Web (harvestHistoricalPerson)",zLOG.ERROR,"cannot annalyize: %s"%repr(project))
+ zLOG.LOG("MPIWG Web (harvestHistoricalPerson)",zLOG.ERROR,"cannot analyize: %s"%repr(project))
return list
@@ -665,10 +701,11 @@ class MPIWGRoot(ZSQLExtendFolder):
manage_options = Folder.manage_options+(
- {'label':'Update Personal Homepages','action':'updateHomepages'},
+ {'label':'Update personal homepages','action':'updateHomepages'},
+ {'label':'Reindex catalogs','action':'reindexCatalogs'},
{'label':'Main config','action':'changeMPIWGRootForm'},
- {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'},
- {'label':'Store Historical Persons','action':'storeHistoricalPersons'},
+ #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'},
+ #{'label':'Store Historical Persons','action':'storeHistoricalPersons'},
)
def importNamesForm(self):
@@ -700,9 +737,165 @@ class MPIWGRoot(ZSQLExtendFolder):
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
- def updateHomepages(self,RESPONSE):
- """lege members an"""
+ def updatePublicationDB(self,personId=None):
+ """updates the publication db, i.e. copy year into the main table"""
+ if personId:
+ founds = self.ZSQLInlineSearch(_table="publications",id_main=personId)
+ else:
+ founds = self.ZSQLInlineSearch(_table="publications")
+
+ for found in founds:
+
+ if found.id_institutsbibliographie and (not found.id_institutsbibliographie =="") and (not found.id_institutsbibliographie =="0"):
+
+ entries = self.ZSQLInlineSearch(_table="institutsbiblio",id=found.id_institutsbibliographie)
+ for entry in entries:
+ self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type)
+
+ if found.id_gen_bib and (not found.id_gen_bib ==""):
+ entries = self.ZSQLInlineSearch(_table="bibliography",id=found.id_gen_bib)
+ for entry in entries:
+ self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type)
+
+ return True
+
+ def updateHomepages(self,RESPONSE=None):
+ """ update"""
+
+ RESPONSE.setHeader('Content-type', 'text/html')
+ RESPONSE.write("\n")
+ 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")
+
+
+ memberFolder=getattr(self,'members')
+ members=memberFolder.ZopeFind(memberFolder,obj_metatypes=["MPIWGStaff"])
+
+ 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'})
+
+ if cw:
+ txt_p=getTextFromNode(cw[0])
+ else:
+ txt_p=""
+
+ project=getattr(self,'members')
+
+ 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'))
+
+ 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)
+ 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]:
+
+ RESPONSE.write("Error: %s
\n"%repr(ret[1]))
+ else:
+ RESPONSE.write("New: %s
\n"%repr(ret[1]))
+
+ #TODO: reindexCatlogs and updatePublications wieder einbaue
+ #self.reindexCatalogs(RESPONSE)
+
+ #self.updatePublicationDB()
+
+ #self.ZSQLResetConnection()
+ RESPONSE.write("Done
")
+
+ return True
+
+ 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])
+
+
+
+
+ if RESPONSE:
+ RESPONSE.redirect('manage_main')
+
+
+
+ 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')
@@ -717,6 +910,7 @@ class MPIWGRoot(ZSQLExtendFolder):
except:
RESPONSE.write("old:%s (%s,%s)
\n"%(found.username,found.name,found.vorname))
+
#delete non existing
@@ -733,7 +927,8 @@ class MPIWGRoot(ZSQLExtendFolder):
pass
self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
-
+ self.updatePublicationDB()
+
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
@@ -747,6 +942,7 @@ class MPIWGRoot(ZSQLExtendFolder):
# ret.append(x.title.decode('utf-8'))
for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']):
+ if x[1].isPublished():
ret.append(x[1].title.decode('utf-8'))
ret.sort()
@@ -834,7 +1030,7 @@ class MPIWGRoot(ZSQLExtendFolder):
ret+="""\n"""
if actualDepth==1:
- departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group'}
+ departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group','6':'Research Network'}
department=element[3].getContent('xdata_05')
ret+="""
%s: """%(department,departmentName[department])
@@ -852,6 +1048,8 @@ class MPIWGRoot(ZSQLExtendFolder):
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'))
@@ -974,7 +1172,7 @@ class MPIWGRoot(ZSQLExtendFolder):
except:
proj=None
- if proj:
+ 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')))
@@ -1119,9 +1317,6 @@ class MPIWGRoot(ZSQLExtendFolder):
return (fieldname in checkFields)
-
-
-
def manage_addMPIWGRootForm(self):
"""form for adding the root"""
@@ -1218,6 +1413,7 @@ class MPIWGProject(CatalogAware,Folder):
def copyImageToMargin(self,RESPONSE=None):
+ #TODO: copy more than one image
"""copy inline images to marginal images"""
self.getContent('WEB_project_description',filter='yes')
@@ -1230,8 +1426,17 @@ class MPIWGProject(CatalogAware,Folder):
self.addImage(None,self.imagecap,filename=filename)
#hole die bilddaten aus der url
- data=urllib.urlopen(self.absolute_url()+"/"+self.imageURL).read()
-
+ url=self.absolute_url()+"/"+self.imageURL
+ #url=self.absolute_url()+"/"+filename
+
+ try:#relative url
+ data=urllib.urlopen(url).read()
+ except:
+ try:#absolute
+ data=urllib.urlopen(self.imageURL).read()
+ except:
+ zLOG.LOG("MPIWG Project",zLOG.ERROR,"can't open: %s"%url)
+
obj=getattr(self,filename)
obj.update_data(data)
@@ -1716,7 +1921,7 @@ class MPIWGProject(CatalogAware,Folder):
start=kupu.find("")
end=kupu.find("")
newcontent= kupu[start+6:end]
-
+
if preview:
return self.preview(newcontent)
@@ -1728,7 +1933,7 @@ class MPIWGProject(CatalogAware,Folder):
return True
- security.declareProtected('View managment screens','edit')
+ security.declareProtected('View management screens','edit')
def edit(self,western=None):
"""Edit pages"""
if western:
@@ -1737,6 +1942,16 @@ class MPIWGProject(CatalogAware,Folder):
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProjectNeu.zpt')).__of__(self)
return pt()
+
+ edit_MPIWGProject_main = PageTemplateFile('zpt/edit_MPIWGProject_main', globals())
+
+ def getPathStyle(self, path, selected, style=""):
+ """returns a string with the given style + 'sel' if path == selected."""
+
+ if path == selected:
+ return style + 'sel'
+ else:
+ return style
def preview(self,description):
"""preview"""
@@ -1747,7 +1962,7 @@ class MPIWGProject(CatalogAware,Folder):
for field in definedFields:
setattr(tmpPro,field,getattr(self,field))
tmpPro.WEB_project_description=description[0:]
-
+ tmpPro.invisible=True
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self)
return pt()
@@ -1855,6 +2070,7 @@ class MPIWGProject(CatalogAware,Folder):
splitted=[y.rstrip().lstrip() for y in splitted]
for x in splitted:
+ x=re.sub(r"[^A-z ]","",x)
if (not x==u'') and x in wert:
return 1
return 0
@@ -1865,13 +2081,13 @@ class MPIWGProject(CatalogAware,Folder):
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)
return pt()
-
+ security.declareProtected('View management screens','editMPIWGBasisForm')
def editMPIWGBasisForm(self):
"""editform"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasis.zpt')).__of__(self)
return pt()
-
+ security.declareProtected('View management screens','editMPIWGRelatedPublicationsForm')
def editMPIWGRelatedPublicationsForm(self):
"""Edit related Publications"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGRelatedPublications.zpt')).__of__(self)