"""This file contains the classes for the organization of the staff""" # TODO: pruefe ob die id der einzelnen tabellen, wie id in publications noch benutzt werden # TODO: pruefe ob die bibliographischen felder in publications noch benutzt werden # TODO: wird username gebraucht? from OFS.Folder import Folder from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate from Products.ZCatalog.CatalogPathAwareness import CatalogAware from Products.versionedFile.extVersionedFile import extVersionedFileFolder from AccessControl import getSecurityManager import os import logging import bibliography import email from Globals import package_home from Products.PythonScripts.standard import sql_quote from types import * from AccessControl import ClassSecurityInfo import time import logging import email import re from OFS.Cache import Cacheable from MPIWGHelper import * #ersetzt logging def logger(txt,method,txt2): """logging""" logging.info(txt+ txt2) departmentList="Renn\nRheinberger\nDaston\nKlein\nSibum\nIT\nInstitut\nBibliothek" def createNewDBEntry(self,publish_the_data,key,name,vorname,title,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by="",e_mail2="",txt="",txt_p="no",stay_at_mpiwg="",group="",web_object_created="no",current_work=""): """lege person in der datenbank an""" if date_to=="": # wenn date_to leer date_to="date_none" if date_from=="": # wenn date_fromleer date_from="date_none" msg="" #test ob id schon existiert if self.ZSQLQuery("select key from personal_www where key='%s'"%id): return False,"ERROR:key%s already exists"%key #eintragen columnlist="""publish_the_data,key,last_name,first_name,title,status,e_mail,e_mail_p,date_from,date_to,department,home_inst,funded_by,e_mail2,date_stay_at_mpiwg,web_object_created,"group",current_work,current_work_p """ insertTuple=(publish_the_data,key,name,vorname,title,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by,e_mail2,stay_at_mpiwg,web_object_created,group,current_work,"yes") insert=[] for element in insertTuple: if element=="date_none": # date_none eintrag wird zu null uebersetzt insert.append('null') else: insert.append("%s"%self.ZSQLQuote(element)) insertStr=",".join(insert) queryStr="INSERT INTO personal_www (%s) VALUES (%s)"%(columnlist,insertStr) self.ZSQLQuery("SET DATESTYLE TO 'German'") self.ZSQLQuery(queryStr) logging.info("QQQQ %s:"%queryStr) #currentwork #if not (current_work==""): # queryStr="INSERT INTO current_work (key_main,current,publish) VALUES ('%s',%s,'%s')"%(key,self.ZSQLQuote(current_work),"yes") # self.ZSQLQuery(queryStr) return True,msg class MPIWGStaff(CatalogAware,ZSQLExtendFolder,Cacheable): """Staff""" meta_type="MPIWGStaff" default_catalog='MembersCatalog' departmentList=departmentList security=ClassSecurityInfo() def redirect(self,RESPONSE,url): """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" timeStamp=time.time() if url.find("?")>-1: #giebt es schon parameter addStr="&time=%s" else: addStr="?time=%s" RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') logging.error(email.Utils.formatdate()+' GMT') RESPONSE.redirect(url+addStr%timeStamp) def getKeyUTF8(self): """get db_key utf8""" return utf8ify(self.getKey()) def getKey(self): """get database key""" if hasattr(self,'key'): #logging.error("SAVED KEY:%s"%self.key) return unicodify(self.key.lower()) #return self.key.lower() #fuer alt faelle ohne key #logging.error("NEW KEY:%s"%(self.firstName+'_'+self.lastName).lower().replace(' ','')) return (self.firstName+'_'+self.lastName).lower().replace(' ','') def getConnectionObj(self): """returns connection id (from root)""" root = self.getMPIWGRoot() return root.getConnectionObj() def isPublished(self): """gib publications status aus der datenbank aus""" key=self.getKey() query="select count(publish_the_data) from personal_www where lower(key)='%s' and publish_the_data='yes'"%key res = self.ZSQLQuery(query) if res and res[0].count>0: return True else: return False def updateDBEntry(self,publish_the_data,date_from,date_to,DBid=None,stay_at_mpiwg="",position="",abteilung=""): """zpddatedb""" if not DBid: DBid=self.getDBId() self.ZSQLQuery("SET DATESTYLE TO 'German'") test=self.ZSQLQuery("select id from personal_www where id='%s' "%DBid) if test and (len(test)>0): #dataset exists logger("MPIWG Web",logging.INFO,'UPDATE: _table="personal_www",_identify="id=%s"'%DBid+',publish_the_data=%s'%publish_the_data+',date_from=%s'%date_from+',date_to=%s'%date_to+',stay_at_mpiwg=%s'%stay_at_mpiwg+',position=%s'%position) self.ZSQLChange(_table="personal_www",_identify="id=%s"%DBid,publish_the_data=publish_the_data, date_from=date_from, date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position,abteilung=abteilung) return True else: return False def getPublicationSelectionMode(self): """get publication selection mode, default 'priority'""" return getattr(self,'publicationSelectionMode','priority') def changePublicationSelectionMode(self,publicationSelectionMode,RESPONSE=None): """change PublicationSelectionMode""" self.publicationSelectionMode=publicationSelectionMode self.ZCacheable_invalidate() if RESPONSE: self.redirect(RESPONSE,"editPublications") def downloadCV(self,RESPONSE): """download cv file""" ob=self._getOb("downloadableFiles")._getOb("cv.pdf") RESPONSE.redirect(ob.absolute_url()+"/download") def getLastUpdateCV(self): """getDate of Last Update""" try: ob=self._getOb("downloadableFiles")._getOb("cv.pdf") return ob.getLastChangeDate() except: return "No file yet!" def getLastUpdatePublications(self): """getDate of Last Update""" try: ob=self._getOb("downloadableFiles")._getOb("publications.pdf") return ob.getLastChangeDate() except: return "No file yet!" def downloadPublications(self,RESPONSE): """download publications""" ob=self._getOb("downloadableFiles")._getOb("publications.pdf") RESPONSE.redirect(ob.absolute_url()+"/download") def changeDownloads(self,cv_pdf=None,cv_publish=None,publications_pdf=None,publications_publish=None,RESPONSE=None): """"change the downloadable files""" self.ZCacheable_invalidate() if not hasattr(self,'downloadableFiles'): extFolder = extVersionedFileFolder() extFolder.id = "downloadableFiles" self._setObject(extFolder.id,extFolder) ob = self._getOb("downloadableFiles") if cv_publish: self.cv_publish=cv_publish if publications_publish: self.publications_publish=publications_publish if cv_pdf: if not hasattr(ob,"cv.pdf"): ob.addFile("",cv_pdf,newName="cv.pdf") else: cvFile = getattr(ob,"cv.pdf") cvFile.addContentObject("","",file=cv_pdf) if publications_pdf: if not hasattr(ob,"publications.pdf"): ob.addFile("",cv_pdf,newName="publications.pdf") else: cvFile = getattr(ob,"publications.pdf") cvFile.addContentObject("","",file=publications_pdf) if RESPONSE: self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER']) def getPublishImage(self): """publish the image??, default no""" return getattr(self,'publishImage','no') def updateImage(self,file,publishImage,rename=None,RESPONSE=None): """update image""" if file and not(file.filename==""): if self.getImageObj(): self.getImageObj().updateImage(file,_rename=None,RESPONSE=None) else: # create new image object xp = file.filename.rfind('.') if xp > 0: ext = file.filename[xp:] #fn = self.getId()+ext fn = self.getId() logger("MPWIG STAFF", logging.INFO, "new filename: %s"%fn) self.getImageFolder().addImage2(file,fileName=fn) else: logger("MPWIG STAFF", logging.ERROR, "uploaded filename %s has no extension!"%file.filename) self.publishImage=publishImage if RESPONSE: self.redirect(RESPONSE,"edit") def getImageFolder(self): """getImageFolder""" #TODO: make place of staff image folder configurable try: return self.getPhysicalRoot().www_neu.images.staff_images except: logger("MPWIG STAFF", logging.ERROR, "image folder not found: has to be add /www_neu/staff_images") return None def getImageObj(self): """getImage""" imageFolder=self.getImageFolder() if not imageFolder: return None image=getattr(imageFolder,self.getId(),None) if not image: for suffix in ['jpg','tif']: image=getattr(imageFolder,self.getId()+"."+suffix,None) if image: break return image def getImageUrl(self): """getImageUrl""" image=self.getImageObj() if not image: return None else: return self.getImageObj().absolute_url()+"/image" def PrincipiaSearchSource(self): """Return cataloguable key for ourselves.""" return str(self) manage_options = Folder.manage_options+( {'label':'Edit','action':'changeMPIWGStaffForm'}, {'label':'Change Publications Special','action':'changePublications_specialForm'}, ) + Cacheable.manage_options __manager_id = "ramCache" def __init__(self,id, lastName,firstName,key): """init""" self.id=id self.title=key self.lastName=lastName self.firstName=firstName self.key=key def getPersonID(self): """gibt den ID fuer die Person zurueck" im Moment ist personID = id, i.e. e-mail """ return self.id def harvest_page_old(self,context=None): """geharvestete seite = verschlankte version von members_main""" #pt = getTemplate(self, "harvest_members_main") if not self.isPublished(): return "" if not context: context=self ext=getattr(self,"harvest_members_main",None) if ext: return getattr(self,ext.getId())() pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_members_main')).__of__(context) return pt() def harvest_page(self): """harvest""" if not self.isPublished(): return "" return getattr(self.en.staff.members,self.getId()).index_html() def index_html(self): """show homepage""" bound_names={} request = self.REQUEST if request is not None: response = request.response if not response.headers.has_key('content-type'): response.setHeader('content-type', 'text/html') security = getSecurityManager() bound_names['user'] = security.getUser() # Retrieve the value from the cache. keyset = None if self.ZCacheable_isCachingEnabled(): # Prepare a cache key. keyset = {'here': self} result = self.ZCacheable_get(keywords=keyset) if result is not None: # Got a cached value. return result pt = getTemplate(self, "members_main") # Execute the template in a new security context. security.addContext(self) try: result = pt.pt_render(extra_context=bound_names) if keyset is not None: # Store the result in the cache. self.ZCacheable_set(result, keywords=keyset) return result finally: security.removeContext(self) def changePublications_specialForm(self): """Priority publications manual field""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changePublications_special.zpt')).__of__(self) return pt() def changePublications_special(self,usePublicationsSpecial=None,specialPublicationsField=None,RESPONSE=None): """change publications special params""" self.ZCacheable_invalidate() if usePublicationsSpecial: self.usePublicationsSpecial=True else: self.usePublicationsSpecial=False self.specialPublicationsField=specialPublicationsField[0:] if RESPONSE is not None: self.redirect(RESPONSE,'manage_main') def publications_full(self): """show publication""" pt=getTemplate(self, "publications_full_main") return pt() def talks_full(self): """show talks""" pt=getTemplate(self, 'talks_full_main') return pt() def teaching_full(self): """show talks""" pt=getTemplate(self, 'teaching_full_main') return pt() def changeMPIWGStaffForm(self): """change form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGStaff.zpt')).__of__(self) return pt() security.declareProtected('View management screens','changeMPIWGStaff') def changeMPIWGStaff(self,lastName,firstName,key=None,RESPONSE=None): """change it""" self.ZCacheable_invalidate() self.title="%s, %s"%(lastName,firstName) self.lastName=lastName self.firstName=firstName if key: self.key = key if RESPONSE is not None: self.redirect(RESPONSE,'manage_main') security.declareProtected('View management screens','edit') def edit(self): """Edit the pages""" #TODO: zusammenspiel mit apache, redirect auf 18080 rausnehmen bzw. zumindest verallgemeinern #if self.REQUEST['SERVER_URL']=="http://www.mpiwg-berlin.mpg.de": # redURL="http://xserve04.mpiwg-berlin.mpg.de:18080/www_neu/de/mitarbeiter/members/%s/edit"%self.getId() # # self.REQUEST.RESPONSE.redirect(redURL) pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff.zpt')).__of__(self) logging.error("XX:"+email.Utils.formatdate().split("-")[0]+'GMT') return pt() mainEditFile=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff_main.zpt')) addPublicationsBib=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addPublicationsBib.zpt')) 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 getLabel(self): """returns a label for this object""" return self.title def getBreadcrumbs(self): """return list of breadcrumbs from here to the root""" crumbs = [] # skip direct parent Folder /members/ parent = self.aq_parent.aq_parent # get parents breadcrumbs logging.debug("getbreadcrumbs-: title=%s self=%s parent=%s"%(self.title, repr(self), repr(parent))) if hasattr(parent, 'getBreadcrumbs'): logging.debug("getbreadcrumbs: recurse to %s"%parent) crumbs = parent.getBreadcrumbs() # try to get acquisition URL from parent if hasattr(parent, 'absolute_url'): baseUrl = "%s/%s/"%(parent.absolute_url(), 'members') else: baseUrl = "/en/staff/members/" # add this crumbs.append((self.getLabel(), baseUrl+self.getId(), self)) return crumbs def changeCurrentWork(self,current_work,key,publish="yes",RESPONSE=None): """change current work""" query="UPDATE personal_www SET current_work =%s WHERE key='%s'" self.ZSQLQuery(query%(self.ZSQLQuote(current_work),key)) query="UPDATE personal_www SET current_work_p =%s WHERE key='%s'" self.ZSQLQuery(query%(self.ZSQLQuote(publish),key)) self.ZCacheable_invalidate() if RESPONSE: self.redirect(RESPONSE,"edit") security.declareProtected('View management screens','changeResearch') def changeResearch(self,noredirect=None,RESPONSE=None): """change the research entries""" self.ZCacheable_invalidate() newEntries={} key_main=self.REQUEST.form['key_main'] mainfieldL=self.REQUEST.form['main_fields'].split(",") mainfield={} for x in mainfieldL: tmp=x.split('__') mainfield[tmp[0]]=tmp[1] for field in self.REQUEST.form.keys(): splittedField=field.split("__") if len(splittedField)<3: pass #kein datenbank eintrag elif splittedField[2]=='new': # store new entries if not newEntries.has_key(splittedField[0]): newEntries[splittedField[0]]={} newEntries[splittedField[0]][splittedField[1]]=self.REQUEST.form[field] else: query="UPDATE %s "%splittedField[0] query+="SET %s = '%s' "%(splittedField[1],sql_quote(self.REQUEST.form[field])) query+="WHERE oid = '%s' "%sql_quote(splittedField[2]) self.ZSQLQuery(query) #new entries for newEntry in newEntries.keys(): query="INSERT INTO %s "%newEntry keys=['key_main'] values=["'"+sql_quote(key_main)+"'"] for key in newEntries[newEntry].keys(): keys.append(key) values.append("'"+sql_quote(newEntries[newEntry][key])+"'") keystring=",".join(keys) valuestring=",".join(values) query+=" (%s) "%keystring query+="VALUES (%s)"%valuestring if not (newEntries[newEntry][mainfield[newEntry]].lstrip().rstrip()==""): self.ZSQLQuery(query) if not noredirect: self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER']) security.declareProtected('View management screens','editCV') def editCV(self,cv=None,oid=None,RESPONSE=None): """edit Cv""" if (not oid): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editCV.zpt')).__of__(self) return pt() query="UPDATE personal_www SET cv =%s WHERE oid='%s'" self.ZCacheable_invalidate() self.ZSQLQuery(query%(self.ZSQLQuote(cv),oid)) if RESPONSE: self.redirect(RESPONSE,"editCV") def getProfile(self): """get the profile""" self.REQUEST.RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') founds=self.ZSQLInlineSearchU(_table='personal_www',key=self.getKey()) html="""
%s""" if founds.profile and founds.profile != "": return html%founds.profile else: return html%self.generateProfileForPerson(founds) def editProfile(self,oid=None,RESPONSE=None, kupu=None, preview=None): """edit Profile, new entry replaces CD, current work and research interests""" if (not oid): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editProfile.zpt')).__of__(self) return pt() self.ZCacheable_invalidate() if preview: pass #TODO: not supported yet #kupu=preview # find content of body tags start=kupu.find("") end=kupu.find("") newcontent= kupu[start+6:end] if preview: #TODO: not supported yet if RESPONSE: self.redirect(RESPONSE,"editProfile") #return self.preview(newcontent) query="UPDATE personal_www SET profile=%s WHERE oid='%s'" self.ZSQLQuery(query%(self.ZSQLQuote(newcontent),oid)) logging.error("PROFILE:"+query%(self.ZSQLQuote(newcontent),oid)) if RESPONSE: self.redirect(RESPONSE,"editProfile") def generateProfileForPerson(self,person): """erzeugt ein automatisches Profil aus den alten Eintraegen CV, Current work, und research interests""" ret="" founds=self.ZSQLInlineSearch(_table='research_interest',key_main=person.key) if founds: ret="Research interests:
Current work:
Curriculum Vitae: