--- MPIWGWeb/MPIWGProjects.py 2006/07/27 09:01:00 1.47.2.55 +++ MPIWGWeb/MPIWGProjects.py 2008/06/24 07:55:05 1.47.2.83 @@ -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 = "" @@ -47,6 +54,30 @@ def getTextFromNode(nodename): rc = rc + node.data return rc + +def sortStopWordsF(self,xo,yo): + if not hasattr(self,'_v_stopWords'): + self._v_stopWords=self.stopwords_en.data.split("\n") + + x=str(xo[1]) + y=str(yo[1]) + + strx=x.split(" ") + stry=y.split(" ") + + for tmp in strx: + if tmp.lower() in self._v_stopWords: + del strx[strx.index(tmp)] + + for tmp in stry: + if tmp.lower() in self._v_stopWords: + del stry[stry.index(tmp)] + + return cmp(" ".join(strx)," ".join(stry)) + +def sortStopWords(self): + return lambda x,y : sortStopWordsF(self,x,y) + def sortF(x,y): try: return cmp(x[1],y[1]) @@ -79,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""" @@ -118,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): @@ -142,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) @@ -214,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] @@ -257,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', @@ -270,19 +330,96 @@ class MPIWGRoot(ZSQLExtendFolder): folders=['MPIWGProject','Folder','ECHO_Navigation'] meta_type='MPIWGRoot' + def transformProjectsToId(self): + """trnasformiere zu ID, Hilfsfunktion die die alten Templates analysiert und mit der neuen Liste + verantwortlicher Personen versieht""" + projects=self.getTree() + ret="" + for project in projects: + proj=project[3] + persons=proj.identifyNames(proj.getContent('xdata_01')) + if not hasattr(proj,'responsibleScientistsList'): + proj.responsibleScientistsList=[] + + for person in persons.items(): + logging.info("XXXX"+repr(person)) + if len(person[1]) >1: #nicht eindeutig + ret+="nicht eindeutig --- %s: %s\n"%(proj.getId(),person[0]) + + elif len(person[1]) ==0: #kein eintrage + ret+="kein eintrag--- %s: %s\n"%(proj.getId(),person[0]) + proj.responsibleScientistsList.append((person[0],"")) + else: + proj.responsibleScientistsList.append((person[0],person[1][0].getObject().getKey())) + + return ret + + def harvestProjects(self): + """harvest""" + folder="/tmp" + try: + os.mkdir("/tmp/harvest_MPIWG") + except: + pass + founds=self.ZopeFind(self.aq_parent.projects,obj_metatypes=['MPIWGProject'],search_sub=1) + for found in founds: + txt=found[1].harvest_page() + + if txt and (txt != ""): + name=found[0].replace("/","_") + fh=file("/tmp/harvest_MPIWG/"+name,"w") + fh.write(txt) + fh.close() + def decode(self,str): """decoder""" if not str: return "" if type(str) is StringType: - try: - return str.decode('utf-8') - except: - return str.decode('latin-1') + 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""" @@ -353,7 +490,23 @@ class MPIWGRoot(ZSQLExtendFolder): return True else: return False - + + def subNavStatic(self,obj): + """subnav" von self""" + def sortWeight(x,y): + x1=int(getattr(x[1],'weight','0')) + y1=int(getattr(y[1],'weight','0')) + return cmp(x1,y1) + + subs=self.ZopeFind(obj,obj_metatypes=['MPIWGTemplate','MPIWGLink']) + subret=[] + + for x in subs: + if not(x[1].title==""): + subret.append(x) + subret.sort(sortWeight) + return subret + def subNav(self,obj): """return subnav elemente""" def sortWeight(x,y): @@ -368,12 +521,14 @@ class MPIWGRoot(ZSQLExtendFolder): #suche die zweite ebene + if not obj.aq_parent.getId() in ['de','en']: obj=obj.aq_parent - + while not self.ZopeFind(self,obj_ids=[obj.getId()]): obj=obj.aq_parent + if hasattr(self,obj.getId()): subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink']) @@ -394,14 +549,40 @@ class MPIWGRoot(ZSQLExtendFolder): return True return False + def getSection(self): + """returns the current section name""" + root = self.absolute_url() + url = self.REQUEST['URL'] + if not url: + return None + path = string.replace(url, root, '') + paths = path.split('/') + if len(paths) > 0: + 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): @@ -423,8 +604,12 @@ class MPIWGRoot(ZSQLExtendFolder): def isActual(self,project): """checke if project is actual""" actualTime=time.localtime() - obj= project.getObject() + if hasattr(project,'getObject'): #obj ist aus einer catalogTrefferList + obj=project.getObject() + else: + obj=project + if getattr(obj,'archiveTime',actualTime)< actualTime: return False else: @@ -502,6 +687,22 @@ class MPIWGRoot(ZSQLExtendFolder): self.id=id self.title=title + def removeStopWords(self,xo): + """remove stop words from xo""" + if not hasattr(self,'_v_stopWords'): + self._v_stopWords=self.stopwords_en.data.split("\n") + + x=str(xo) + + strx=x.split(" ") + + for tmp in strx: + + if tmp.lower() in self._v_stopWords: + del strx[strx.index(tmp)] + + return " ".join(strx) + def urlQuote(self,str): """quote""" return urllib.quote(str) @@ -510,89 +711,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]) @@ -633,19 +755,7 @@ class MPIWGRoot(ZSQLExtendFolder): if RESPONSE is not None: RESPONSE.redirect('manage_main') - def getDisciplineList(self): - """get disciplines as list""" - list= self.disciplineList.split("\n") - return [x.rstrip().lstrip() for x in list] - - def getThemeList(self): - """get themes as list""" - list= self.themesList.split("\n") - return [x.rstrip().lstrip() for x in list] - - def test(self): - """test""" - return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url + def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True): """childs alle childs, alle parents""" @@ -700,6 +810,10 @@ class MPIWGRoot(ZSQLExtendFolder): if sort=="int": ret.sort(sortI) + elif sort=="stopWords": + + ret.sort(sortStopWords(self)) + else: ret.sort(sortF) @@ -716,47 +830,21 @@ class MPIWGRoot(ZSQLExtendFolder): manage_options = Folder.manage_options+( - {'label':'Update personal homepages','action':'updateHomepages'}, + {'label':'Update personal homepages','action':'updatePersonalwww_html'}, {'label':'Reindex catalogs','action':'reindexCatalogs'}, {'label':'Main config','action':'changeMPIWGRootForm'}, + {'label':'add e-mails','action':'showNewDBEntries'}, + {'label':'update the institutsbibliography','action':'updateInstitutsbiliography'}, #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, #{'label':'Store Historical Persons','action':'storeHistoricalPersons'}, ) - def importNamesForm(self): - """Form""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGNamesForm.zpt')).__of__(self) - return pt() - - def importNames(self,fileupload,folderName,RESPONSE=None): - """import komma-sep list email,lastName,firstName""" - project=getattr(self,folderName) - load=fileupload.read() - - for line in load.split('\r'): - - - splitted=line.split(",") - # print splitted - - if not (splitted[0]==""): - newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2]) - - try: - project._setObject(splitted[0],newObj) - #print "done:",splitted[0] - except: - zLOG.LOG("MPIWG Web (importNames)",zLOG.INFO,"cannot import: %s"%splitted[0]) - - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') def updatePublicationDB(self,personId=None): - """updates the publication db, i.e. copy year into the main table""" + """updates the publication db, i.e. copy year and type into the main table""" if personId: - founds = self.ZSQLInlineSearch(_table="publications",id_main=personId) + founds = self.ZSQLInlineSearch(_table="publications",key_main=personId) else: founds = self.ZSQLInlineSearch(_table="publications") @@ -774,136 +862,220 @@ class MPIWGRoot(ZSQLExtendFolder): self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type) return True + + def showNewDBEntries(self): + """zeige neue Eintraege in der Datenbank ohne e-mail adressen bzw. fuer die noch kein Object angelegt wurde""" - def updateHomepages(self,RESPONSE=None): - """ update""" - - RESPONSE.setHeader('Content-type', 'text/html') - RESPONSE.write("\n") - RESPONSE.write("Update Institutsbibliography\n") - ret=self.upDateSQL('personalwww.xml') - RESPONSE.write("done Insitutsbibliography:%s\n"%ret) - url="http://itgroup.mpiwg-berlin.mpg.de:8050/FMPro?-db=personal-www&-format=-dso_xml&-lay=sql_export&-max=20000&-findall" - dom = NonvalidatingReader.parseUri(url) - #fh=urllib.urlopen(url) - #dom=xml.dom.minidom.parse(fh) - - RESPONSE.write("got_xml_File\n") + qstr="select * from personal_www where web_object_created='no' and not key=''" + res=self.ZSQLQuery(qstr) + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','showNewDBEntries.zpt')).__of__(self) + return pt(newEntries=res) + + def createNewStaffObjects(self,RESPONSE): + """create new staff object""" memberFolder=getattr(self,'members') - members=memberFolder.ZopeFind(memberFolder,obj_metatypes=["MPIWGStaff"]) + args=self.REQUEST.form + arg_k=args.keys() + arg_k.remove("submit") + ret="" + for key in arg_k: + k=self.urlUnQuote(key) + + qstr="select * from personal_www where key=%s"%self.ZSQLQuote(k) + res=self.ZSQLQuery(qstr)[0] + if args[key]!="": #email-adresse wurde eingetragen + #create the object + e_mail=args[key] + try: + newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name,res.first_name,k) + memberFolder._setObject(e_mail,newObj) + obj=getattr(memberFolder,e_mail) + obj.reindex_object() + ret+="Created %s \n"%e_mail + created=True + except: + msg="Cannot create new user %s (%s %s)"%(e_mail,sys.exc_info()[0],sys.exc_info()[1]) + logging.error(msg) + ret+=msg+"\n" + created=False + + if created: + qstr="update personal_www set web_object_created='yes',e_mail='%s@mpiwg-berlin.mpg.de' where key=%s"%(e_mail,self.ZSQLQuote(k)) + self.ZSQLQuery(qstr) - memberList=[x[0] for x in members] - #print dom - #ctx=Context(dom,processorNss={EMPTY_NAMESPACE:'http://www.filemaker.com/fmpdsoresult'}) - # Evaluate(u".//dn:ROW",contextNode=dom,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}) - #print dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}) - for row in dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}): - - username=getTextFromNode(row.xpath('./dn:username',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - id=getTextFromNode(row.xpath('./dn:ID',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - name=getTextFromNode(row.xpath('./dn:Name',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - vorname=getTextFromNode(row.xpath('./dn:Vorname',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - title=getTextFromNode(row.xpath('./dn:Title',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - position=getTextFromNode(row.xpath('./dn:Position',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - e_mail=getTextFromNode(row.xpath('./dn:e_mail',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - e_mail_p=getTextFromNode(row.xpath('./dn:e_mail_p',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - date_from=getTextFromNode(row.xpath('./dn:Date_from',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - date_to=getTextFromNode(row.xpath('./dn:Date_to',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - abteilung=getTextFromNode(row.xpath('./dn:Abteilung',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - heimat_inst=getTextFromNode(row.xpath('./dn:heimat_inst',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - funded_by=getTextFromNode(row.xpath('./dn:funded_by',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - e_mail2=getTextFromNode(row.xpath('./dn:e_mail2',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - publish_the_data=getTextFromNode(row.xpath('./dn:publish_the_data',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - stay_at_mpiwg=getTextFromNode(row.xpath('./dn:stay_at_mpiwg',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]) - #cwNode=row.xpath('./dn:current_work.current',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0] - cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}) - if cw: - txt=getTextFromNode(cw[0]) - else: - txt="" - - #cwNode=row.xpath('.//dn:current_work.publish',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0] - cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}) + return ret + + + def generateNewPersonEntry(self,data): + """generate a new person entry for data, neue personen werden zunaechst nur in der datenbank angelegt """ + + #memberFolder=getattr(self,'members') + #create the object + +# try: +# newObj=MPIWGStaff.MPIWGStaff(urllib.quote(data['key']),data['last_name'].encode('utf-8'),data['first_name'].encode('utf-8')) +# memberFolder._setObject(urllib.quote(data['key']),newObj) +# except: +# return False, "Cannot create new user %s (%s %s)"%(data['key'],sys.exc_info()[0],sys.exc_info()[1]) +# + + #create the new entry in the database + + + result,msg=MPIWGStaff.createNewDBEntry(self,data['publish_the_data'],data['key'],data['last_name'], + data['first_name'],data['title'],data['status'],"", + "",data['date_from'],data['date_to'], + data['department'],data['home_inst'],data['funded_by'], + data['e_mail2'],data['current_work'],"yes",data['date_stay_at_mpiwg'],data['group'],"no",data['current_work']) + + return result,msg + + def updatePersonEntry(self,data,ignoreEntries=[]): + """update an person entry from data. but ignore all fields in ignore Entries""" + + ignoreEntries.append('current_work') # TODO:updatecurrent work + + if data['date_to']=="": # wenn date_to leer + data['date_to']="date_none" + + if data['date_from']=="": # wenn date_fromleer + data['date_from']="date_none" + msg="" + + + #eintragen + + columns=data.keys() + for x in ignoreEntries: + logging.info("ign rem: %s"%x) + try: #falls in ignore entries felder sind, die nicht in columns sind, fange den fehler ab + columns.remove(x) + except: + pass - if cw: - txt_p=getTextFromNode(cw[0]) + + insert=[] + for key in columns: + if data[key]=="date_none": # date_none eintrag wird zu null uebersetzt + insert.append('%s=null'%key) else: - txt_p="" - - project=getattr(self,'members') + insert.append(""" "%s"=%s"""%(key,self.ZSQLQuote(data[key]))) - if not (username in memberList):#neuer eintrag - - try: - newObj=MPIWGStaff.MPIWGStaff(str(username),name.encode('utf-8'),vorname.encode('utf-8')) - memberFolder._setObject(str(username),newObj) - RESPONSE.write("

new:%s

\n"%username.encode('utf-8')) - obj=getattr(memberFolder,username) - ret=obj.createNewDBEntry(publish_the_data,id,name, - vorname,username,title,position,e_mail, - e_mail_p,date_from,date_to, - abteilung,heimat_inst,funded_by, - e_mail2,txt,txt_p,stay_at_mpiwg) - RESPONSE.write("""

%s

"""%ret[1].encode('utf-8')) - except: - RESPONSE.write("

ERROR:%s %s %s

\n"%(username.encode('utf-8'),name.encode('utf-8'),vorname.encode('utf-8'))) - RESPONSE.write("

: %s %s"%sys.exc_info()[:2]) - else: - RESPONSE.write("

update:%s

\n"%username.encode('utf-8')) + insertStr=",".join(insert) + queryStr="update personal_www SET %s where key='%s'"%(insertStr,data['key']) + self.ZSQLQuery("SET DATESTYLE TO 'German'") + self.ZSQLQuery(queryStr) + + #currentwork + #if not (txt==""): + # queryStr="INSERT INTO current_work (id_main,current,publish) VALUES ('%s','%s','%s')"%(id,txt,txt_p) + # + # self.ZSQLQuery(queryStr) + + return True,msg + + + def updatePersonalwww_doIt(self): + """do the update""" + args=self.REQUEST.form + resultSet=self.REQUEST.SESSION['personal_www']['resultSet'] + news=self.REQUEST.SESSION['personal_www']['news'] + conflicts=self.REQUEST.SESSION['personal_www']['conflicts'] + ret="" + # generate the new entry + + if news and (len(news)>0): + ret+="

Hinzugefügt

" + ret+="

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

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

Änderung des Benutzers übernehmen

" + ret+="

Wenn nötig in Filemaker-db ändern:

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

%s

"%conflict.encode('utf-8') + + ret+="" + for iE in displayIgnored: + ret+=""%(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+"" + + + def updateInstitutsbiliography(self): + """update the Institutsbibliogrpahy""" + self.upDateSQL('personalwww.xml') + return "DONE" - 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) + 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() + - #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]) @@ -914,72 +1086,21 @@ class MPIWGRoot(ZSQLExtendFolder): - def updateHomepages_old(self,RESPONSE): - """lege members an, alte version vollstaendige kopie aller fm-dateien per fm.jar""" - self.upDateSQL('personalwww.xml') - founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes') - project=getattr(self,'members') - for found in founds: - - if not (found.e_mail==""): - newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname) - - try: - project._setObject(found.username,newObj) - RESPONSE.write("

new:%s

\n"%found.username) - except: - RESPONSE.write("

old:%s (%s,%s)

\n"%(found.username,found.name,found.vorname)) - - - - #delete non existing - - - foundUserNames=[x.username for x in founds] - for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1): - - if member[1].getId() not in foundUserNames: - member[1].aq_parent.manage_delObjects(ids=[member[1].getId()]) - RESPONSE.write("

deleted:%s

\n"%member[1].getId()) - try: - self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) - except: - pass - self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) - - self.updatePublicationDB() - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - -# def getAllMembers(self,reset=None): -# """give list of all members""" -# ret=[] -# -# -# if reset or (getattr(self,'_v_membersList',None) is None): -# for member in self.members._objects: -# if member['meta_type']=='MPIWGStaff': -# memberObj=getattr(self.members,member['id']) -# if memberObj.isPublished(): -# ret.append(memberObj.title.decode('utf-8')) -# -# ret.sort() -# self._v_membersList=ret[0:] -# print ret -# -# return self._v_membersList def getAllMembers(self): #ret=[] + def sorter(x,y): + return cmp(x[0],y[0]) + results=self.MembersCatalog({'isPublished':True}) - ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results] + ret=[(", ".join([proj.lastName, proj.firstName]).decode('utf-8'),proj.getKey) for proj in results] - ret.sort() + ret.sort(sorter) return ret + + def printAllMembers(self): """print""" members=self.getAllMembers() @@ -997,10 +1118,21 @@ class MPIWGRoot(ZSQLExtendFolder): return entry - def getTree(self,date=None,onlyActive=None): - """generate Tree from project list""" + def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0): + """generate Tree from project list + als Liste, jeder Eintrag ist ein Tupel ,(Tiefe, ProjektNummer,ProjektObject + onlyActive = 0 : alle Projekte + onlyActive = 1 : nur active Projekte + onlyActive = 2: nur inactive Projekte + + onlyArchived=0: alle Projekte + onlyArchived= 1 : nur aktuelle Projekte + onlyArchived = 2: nur archivierte Projekte + """ + returnListTmp=[] returnList=[] + for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05 for idNr in project[1].split(";"): # more than one number @@ -1012,87 +1144,31 @@ class MPIWGRoot(ZSQLExtendFolder): title=[project[0].getContent('WEB_title')] #print title - if idNr[0]=="x": # kompatibilitŠt mit alter Konvention, x vor der Nummer macht project inactive + if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive project[0].setActiveFlag(False) - if 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""" + if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen. + + if (onlyActive==0): + returnListTmp.append((depth,nr,title,project[0])) + elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte + returnListTmp.append((depth,nr,title,project[0])) + elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte + returnListTmp.append((depth,nr,title,project[0])) + + + #filter jetzt die Liste nach Archived oder nicht + for entry in returnListTmp: + if (onlyArchived==0): + returnList.append(entry) + elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte + returnList.append(entry) + elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte + returnList.append(entry) + - actualDepth=0 - ret="" - for element in elements: - if (element[0]>actualDepth): - #fuege soviele ul ein wie unterschied in tiefe - if element[0]==1: - ret+="""
\n
\n""" - if department==4: #hack - department=3 - - ret+="""
-
\n
%s%s%s