# HG changeset patch # User casties # Date 1368545070 -7200 # Node ID ab836d3f96dc504eef852cd310e759086d644ce7 # Parent 271cf05a864851552d6b6b6a5f1d86d7a831e963 styles for staff list. diff -r 271cf05a8648 -r ab836d3f96dc MPIWGStaff.py --- a/MPIWGStaff.py Tue May 14 10:36:48 2013 +0200 +++ b/MPIWGStaff.py Tue May 14 17:24:30 2013 +0200 @@ -1,1010 +1,39 @@ """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 zExceptions import Redirect from OFS.Folder import Folder 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 -from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder - -from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder from AccessControl import ClassSecurityInfo from App.class_init import InitializeClass from Products.ExtFile.ExtFile import * +from Globals import package_home +from Products.PythonScripts.standard import sql_quote +from Products.ExtFile import ExtFile import os import logging import email -from Globals import package_home -from Products.PythonScripts.standard import sql_quote -from types import * -import time -import logging import re -from OFS.Cache import Cacheable -import urllib2 -import transaction + +from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder from SrvTxtUtils import getHttpData, getAt, getInt, unicodify, utf8ify -import bibliography - -from MPIWGHelper import * -#ersetzt logging -def logger(txt,method,txt2): - """logging""" - logging.info(txt+ txt2) - -departmentList="Renn\nRheinberger\nDaston\nKlein\nSibum\nIT\nInstitut\nBibliothek" -coneService="http://127.0.0.1:8280/MetaDataManagerRestlet/cone/" # kann in MPIWGRoot konfiguriert werden. - - - -def createNewDBEntry(self,publish_the_data,key,name,vorname,titles_new,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,titles_new,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,titles_new,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 - #_v_cone=None; - security=ClassSecurityInfo() - - 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 - - # compat TODO: remove this - def getat(self, array, idx, default=None): - """returns always an int (0 in case of problems)""" - return getAt(array, idx, default) - - # compat TODO: remove this - def decode(self, s): - """TODO: remove this""" - return unicodify(s) - - 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""" - logging.debug("KEY - MPIWGStaff 1:"+self.getKey()) - logging.debug("KEY - MPIWGStaff 2 :"+utf8ify(self.getKey())) - - return utf8ify(self.getKey()) - - def setKey(self,key): - """set key""" - self.key=key - - def rmKey(self): - """rm""" - self.key=None - return "" - - def getKey(self): - """get database key""" - - - if getattr(self,'key',None): - logging.debug("KEY - MPIWGStaff 4:"+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)""" - try: - root = self.getMPIWGRoot() - return root.getConnectionObj() - except: - return self.en.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) +import MPIWGHelper - - 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,publishImage,file=None,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) +# +# compatibility +# TODO: should be removed when done +import MPIWGStaff_old - def getPersonID(self): - """gibt den ID fuer die Person zurueck" - im Moment ist personID = id, i.e. e-mail - """ - return self.id - - def getConeUrl(self): - """gibt coneURL zurueck""" - - self.coneService=getattr(self, "coneServiceURL",coneService) - logging.debug("coneservice:"+self.coneService) - - if getattr(self,'_v_cone',None)==None: - try: - - self._v_cone=getHttpData(self.coneService+self.getPersonID()) - #cone = urllib2.urlopen(self.coneService+self.getPersonID()) - #self._v_cone=cone.read() - if self._v_cone==None: - self._v_cone="" - except: - self._v_cone="" - return "" - - return self._v_cone - - - - - 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,mode="normal"): - """harvest""" - logging.debug("AAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") - if not self.isPublished(): - return - st = getattr(self.en.staff.members,self.getId()).index_html(mode) - - templates = self.en.getHarvestCache() - #templates = getattr(self,'getHarvestCache',self.en.getHarvestCache)() - rendered = st - templates[self.absolute_url()]=rendered - transaction.commit() - return rendered - - - - def index_html(self,mode="normal"): - """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 - - # look for individual page - if self.hasObject("index.html"): - pt = getattr(self, "index.html") - # else use template - else: - if mode=="slim": - pt = getTemplate(self, "members_main_slim") - else: - 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() +createNewDBEntry = MPIWGStaff_old.createNewDBEntry - 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.debug("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.getKeyUTF8()) - 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.getKeyUTF8()) - founds=self.ZSQLInlineSearch(_table='research_interest',key_main=person.key) - if founds: - ret="Research interests:
Current work:
Curriculum Vitae: