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)