diff MPIWGStaff.py @ 186:3ea224968f95

fix traversal to MPIWGStaffMember objects.
author casties
date Fri, 14 Jun 2013 15:29:57 +0200
parents a8d5ba6729f3
children 71c2d76f09b5
line wrap: on
line diff
--- a/MPIWGStaff.py	Fri Jun 14 15:04:35 2013 +0200
+++ b/MPIWGStaff.py	Fri Jun 14 15:29:57 2013 +0200
@@ -5,6 +5,10 @@
 from OFS.Folder import Folder
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
 
+from zope.interface import implements
+from zope.publisher.interfaces import IPublishTraverse
+from ZPublisher.BaseRequest import DefaultPublishTraverse
+
 from AccessControl import ClassSecurityInfo
 from App.class_init import InitializeClass
 from App.ImageFile import ImageFile
@@ -37,6 +41,7 @@
     
 class MPIWGStaffFolder(ZDBInterfaceFolder):
     """Folder of staff objects"""
+    implements(IPublishTraverse)
 
     meta_type="MPIWGStaffFolder"
     security=ClassSecurityInfo()
@@ -52,63 +57,24 @@
     # 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)))
+    def publishTraverse(self, request, name):
+        """change the traversal"""
+        # get stored path
+        logging.debug("publishtraverse: name=%s"%(name))
         
-        # TODO: should we do more checks?
-        if stack and len(stack) > 0:
-            try:
-                # id is the first path component
-                id = stack[-1]
-                logging.debug(id)
-               
-                member = self.getMember(username=id)
-                if member is not None:
-                    member = member.__of__(self)
-                    request.set('MPIWGStaffMember', member)
-                    stack.pop(-1)
+        # try name as username
+        member = self.getMember(username=name)
+        if member is not None:
+            # traverse to MPIWGStaffMember object
+            member = member.__of__(self)
+            return member
+        
+        # use default traverser
+        tr = DefaultPublishTraverse(self, request)
+        ob = tr.publishTraverse(request, name)
+        return ob
+        
 
-                    #weitere parameter
-                    if len(stack)> 0:
-                        mode = stack[-1]
-                        request.set('MPIWGStaffMode', mode)
-                        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)
-        mode = REQUEST.get('MPIWGStaffMode', None)
-        if member is not None:
-            if mode is not None:
-                return member.execute(mode,REQUEST);
-            
-            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
@@ -287,6 +253,17 @@
         self.folder = folder
         self.content = dbresult
             
+
+    def index_html(self, REQUEST, RESPONSE):
+        """show homepage"""
+        # get template /template/member_index_html (with acquisition)
+        pt = getattr(self.template, 'member_index_html', None)
+        if pt is not None:
+            return pt(member=self)
+        
+        return "No template /template/member_index_html"
+
+            
     def isValid(self):
         """returns if this member exists"""
         return len(self.content) > 0
@@ -433,9 +410,6 @@
     security.declareProtected('View management screens','edit')    
     def edit(self,REQUEST=None):
         """Edit the  basic information"""
-      
-
-        
         if REQUEST:
             argv=REQUEST.form
             
@@ -901,4 +875,6 @@
         
         return ret
            
+# initialize security
+InitializeClass(MPIWGStaffFolder) 
 InitializeClass(MPIWGStaffMember)