Mercurial > hg > MPIWGWeb
diff MPIWGStaff.py @ 3:ee3eb9a6665a
MPIWGStaffFolder shows members from db now.
author | casties |
---|---|
date | Fri, 08 Feb 2013 20:42:18 +0100 |
parents | ddf6c1a27a4b |
children | dd765003647b |
line wrap: on
line diff
--- a/MPIWGStaff.py Thu Feb 07 19:50:39 2013 +0100 +++ b/MPIWGStaff.py Fri Feb 08 20:42:18 2013 +0100 @@ -3,6 +3,8 @@ # 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 @@ -12,7 +14,10 @@ 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 import os import logging @@ -20,7 +25,6 @@ from Globals import package_home from Products.PythonScripts.standard import sql_quote from types import * -from AccessControl import ClassSecurityInfo import time import logging import re @@ -28,7 +32,7 @@ import urllib2 import transaction -import SrvTxtUtils +from SrvTxtUtils import getHttpData, getInt, unicodify, utf8ify import bibliography from MPIWGHelper import * @@ -78,6 +82,8 @@ # self.ZSQLQuery(queryStr) return True,msg + + class MPIWGStaff(CatalogAware,ZSQLExtendFolder,Cacheable): """Staff""" @@ -87,6 +93,20 @@ #_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 + def redirect(self,RESPONSE,url): """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" @@ -314,20 +334,6 @@ """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 @@ -343,7 +349,7 @@ if getattr(self,'_v_cone',None)==None: try: - self._v_cone=SrvTxtUtils.getHttpData(self.coneService+self.getPersonID()) + 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: @@ -911,18 +917,6 @@ # TODO: remove all occurences of getDBId and replaces it by getKey return self.getKey() -# search=self.ZSQLInlineSearch(_table='personal_www',key=self.getKey(),publish_the_data='yes') -# if search:#name existiert und published, dann nimm diesen falls es mehrereeventuell nich publizierte datensaetze gibt. -# return search[0].id -# else:#nicht publiziert dann nimm einen davon -# search2=self.ZSQLInlineSearch(_table='personal_www',username=self.getId()) -# if search2: -# return search2[0].id -# else: -# return None - - - formatBiblHelp=bibliography.formatBiblHelp def sortBibliography(self,list,sortingMode=None,max=None): @@ -1002,17 +996,83 @@ if RESPONSE is not None: self.redirect(RESPONSE,'manage_main') + class MPIWGStaffFolder(ZDBInterfaceFolder): """Folder of staff objects""" meta_type="MPIWGStaffFolder" security=ClassSecurityInfo() - + + # + # templates + # + member_index_html = PageTemplateFile('zpt/staff/member_index_html', globals()) + + + # + # hook into traversal to create folder of virtual staff objects + # like /members/$username/index_html + # + def __before_publishing_traverse__(self, object, request): + stack = request.TraversalRequestNameStack + logging.debug("MPIWGStaffFolder: traverse stack=%s self=%s"%(repr(stack),repr(self))) + + # TODO: should we do more checks? + if stack and len(stack) > 0: + try: + # id is the first path component + id = stack[-1] + member = self.getMember(id) + if member is not None: + request.set('MPIWGStaffMember', member) + stack.pop(-1) + + except (IndexError, ValueError): + # missing context or not an integer id; perhaps some URL hacking going on? + logging.error("error traversing user id!") + raise Redirect(self.absolute_url()) # redirects to `/members`, adjust as needed + + + def index_html(self,REQUEST,RESPONSE): """show homepage""" logging.debug("MPIWGStaffFolder: index_html!") + member = REQUEST.get('MPIWGStaffMember', None) + if member is not None: + logging.debug("member: key=%s"%(member.getKey())) + pt = None + try: + # get template /template/member_index_html + pt = getattr(self.template, 'member_index_html', None) + except: + logging.error("No template /template/member_index_html") + # TODO: error page? + return "No template /template/member_index_html" + + if pt is not None: + return pt(member=member) + return REQUEST + + + def getMember(self, username=None, key=None): + """returns a MPIWGStaffMember object if the username exists""" + member = None + if username is not None: + # TODO: we should have a username column + email = '%s@mpiwg-berlin.mpg.de'%username + content = self.executeZSQL("select * from personal_www where e_mail = %s", [email]) + if len(content) > 0: + member = MPIWGStaffMember(self, dbresult=content) + + elif key is not None: + content = folder.executeZSQL("select * from personal_www where key = %s", [key]) + if len(content) > 0: + member = MPIWGStaffMember(self, dbresult=content) + + return member + def manage_addMPIWGStaffFolderForm(self): """form for adding the project""" @@ -1028,3 +1088,60 @@ if RESPONSE is not None: RESPONSE.redirect('manage_main') + +class MPIWGStaffMember(): + """MPIWG staff member object from database""" + + security = ClassSecurityInfo() + + def __init__(self, folder, dbresult): + """constructor: takes parent MPIWGStaffFolder and content""" + self.folder = folder + self.content = dbresult[0] + + def isValid(self): + """returns if this member exists""" + return len(self.content) > 0 + + def getKey(self): + """returns the db key""" + return self.content.key + + def getUsername(self): + """returns the username""" + id = re.sub('@mpiwg-berlin\.mpg\.de', '', self.content.e_mail) + return id + + def getPublishedImageUrl(self): + """returns the URL to the image if it is published""" + if self.content.image_p == 'yes': + url = 'http://digilib.mpiwg-berlin.mpg.de/digitallibrary/Scaler?fn=permanent/mpiwg/staff/%s'%self.getUsername() + return url + + return None + + def getContent(self): + """returns the db content of this object""" + return self.content + + # TODO: ugly! + security.declarePublic('sortBibliography') + def sortBibliography(self,bib,sortingMode=None,max=None): + """sort bibliography""" + if not sortingMode: + sortingMode= "priority" + + l = [x for x in bib] + + if sortingMode == "year": + l.sort(key=lambda x: getInt(x.year)) + else: + l.sort(key=lambda x: getInt(x.priority)) + + if max: + return l[0:min(len(l),max)] + else: + return l + + +InitializeClass(MPIWGStaffMember)