Mercurial > hg > MPIWGWeb
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) |