comparison MPIWGStaff.py @ 186:3ea224968f95

fix traversal to MPIWGStaffMember objects.
author casties
date Fri, 14 Jun 2013 15:29:57 +0200
parents a8d5ba6729f3
children 71c2d76f09b5
comparison
equal deleted inserted replaced
185:a8d5ba6729f3 186:3ea224968f95
2 2
3 from zExceptions import Redirect 3 from zExceptions import Redirect
4 4
5 from OFS.Folder import Folder 5 from OFS.Folder import Folder
6 from Products.PageTemplates.PageTemplateFile import PageTemplateFile 6 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
7
8 from zope.interface import implements
9 from zope.publisher.interfaces import IPublishTraverse
10 from ZPublisher.BaseRequest import DefaultPublishTraverse
7 11
8 from AccessControl import ClassSecurityInfo 12 from AccessControl import ClassSecurityInfo
9 from App.class_init import InitializeClass 13 from App.class_init import InitializeClass
10 from App.ImageFile import ImageFile 14 from App.ImageFile import ImageFile
11 from Products.PythonScripts.standard import sql_quote 15 from Products.PythonScripts.standard import sql_quote
35 39
36 40
37 41
38 class MPIWGStaffFolder(ZDBInterfaceFolder): 42 class MPIWGStaffFolder(ZDBInterfaceFolder):
39 """Folder of staff objects""" 43 """Folder of staff objects"""
44 implements(IPublishTraverse)
40 45
41 meta_type="MPIWGStaffFolder" 46 meta_type="MPIWGStaffFolder"
42 security=ClassSecurityInfo() 47 security=ClassSecurityInfo()
43 48
44 # 49 #
50 55
51 # 56 #
52 # hook into traversal to create folder of virtual staff objects 57 # hook into traversal to create folder of virtual staff objects
53 # like /members/$username/index_html 58 # like /members/$username/index_html
54 # 59 #
55 def __before_publishing_traverse__(self, object, request): 60 def publishTraverse(self, request, name):
56 stack = request.TraversalRequestNameStack 61 """change the traversal"""
57 logging.debug("MPIWGStaffFolder: traverse stack=%s self=%s"%(repr(stack),repr(self))) 62 # get stored path
58 63 logging.debug("publishtraverse: name=%s"%(name))
59 # TODO: should we do more checks? 64
60 if stack and len(stack) > 0: 65 # try name as username
61 try: 66 member = self.getMember(username=name)
62 # id is the first path component
63 id = stack[-1]
64 logging.debug(id)
65
66 member = self.getMember(username=id)
67 if member is not None:
68 member = member.__of__(self)
69 request.set('MPIWGStaffMember', member)
70 stack.pop(-1)
71
72 #weitere parameter
73 if len(stack)> 0:
74 mode = stack[-1]
75 request.set('MPIWGStaffMode', mode)
76 stack.pop(-1)
77
78
79 except (IndexError, ValueError):
80 # missing context or not an integer id; perhaps some URL hacking going on?
81 logging.error("error traversing user id!")
82 raise Redirect(self.absolute_url()) # redirects to `/members`, adjust as needed
83
84
85
86
87 def index_html(self,REQUEST,RESPONSE):
88 """show homepage"""
89 logging.debug("MPIWGStaffFolder: index_html!")
90 member = REQUEST.get('MPIWGStaffMember', None)
91 mode = REQUEST.get('MPIWGStaffMode', None)
92 if member is not None: 67 if member is not None:
93 if mode is not None: 68 # traverse to MPIWGStaffMember object
94 return member.execute(mode,REQUEST); 69 member = member.__of__(self)
95 70 return member
96 logging.debug("member: key=%s"%(member.getKey())) 71
97 pt = None 72 # use default traverser
98 try: 73 tr = DefaultPublishTraverse(self, request)
99 # get template /template/member_index_html 74 ob = tr.publishTraverse(request, name)
100 pt = getattr(self.template, 'member_index_html', None) 75 return ob
101 except: 76
102 logging.error("No template /template/member_index_html") 77
103 # TODO: error page?
104 return "No template /template/member_index_html"
105
106 if pt is not None:
107 return pt(member=member)
108
109 return REQUEST
110
111
112 def getMember(self, username=None, key=None): 78 def getMember(self, username=None, key=None):
113 """returns a MPIWGStaffMember object if the username exists""" 79 """returns a MPIWGStaffMember object if the username exists"""
114 member = None 80 member = None
115 if username is not None: 81 if username is not None:
116 # TODO: we should have a username column 82 # TODO: we should have a username column
285 def __init__(self, folder, dbresult): 251 def __init__(self, folder, dbresult):
286 """constructor: takes parent MPIWGStaffFolder and content (DB row)""" 252 """constructor: takes parent MPIWGStaffFolder and content (DB row)"""
287 self.folder = folder 253 self.folder = folder
288 self.content = dbresult 254 self.content = dbresult
289 255
256
257 def index_html(self, REQUEST, RESPONSE):
258 """show homepage"""
259 # get template /template/member_index_html (with acquisition)
260 pt = getattr(self.template, 'member_index_html', None)
261 if pt is not None:
262 return pt(member=self)
263
264 return "No template /template/member_index_html"
265
266
290 def isValid(self): 267 def isValid(self):
291 """returns if this member exists""" 268 """returns if this member exists"""
292 return len(self.content) > 0 269 return len(self.content) > 0
293 270
294 def isActive(self): 271 def isActive(self):
431 408
432 409
433 security.declareProtected('View management screens','edit') 410 security.declareProtected('View management screens','edit')
434 def edit(self,REQUEST=None): 411 def edit(self,REQUEST=None):
435 """Edit the basic information""" 412 """Edit the basic information"""
436
437
438
439 if REQUEST: 413 if REQUEST:
440 argv=REQUEST.form 414 argv=REQUEST.form
441 415
442 if argv.has_key('last_name'): #got data to change 416 if argv.has_key('last_name'): #got data to change
443 self.invalidate_cache() 417 self.invalidate_cache()
899 ret+="<p class=\"bio_section_header\">Curriculum Vitae: </p><br/>" 873 ret+="<p class=\"bio_section_header\">Curriculum Vitae: </p><br/>"
900 ret+=self.formatAscii(self.content.cv) 874 ret+=self.formatAscii(self.content.cv)
901 875
902 return ret 876 return ret
903 877
878 # initialize security
879 InitializeClass(MPIWGStaffFolder)
904 InitializeClass(MPIWGStaffMember) 880 InitializeClass(MPIWGStaffMember)