source: waeup_product/trunk/Extensions/install.py @ 148

Last change on this file since 148 was 143, checked in by Henrik Bettermann, 19 years ago

table_view veraendert

  • Property svn:keywords set to Id
File size: 23.6 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: install.py 143 2005-11-03 06:30:05Z henrik $
3from Products.ExternalMethod.ExternalMethod import ExternalMethod
4from Products.CPSInstaller.CPSInstaller import CPSInstaller
5from Products.CMFCore.CMFCorePermissions import View, ModifyPortalContent,AccessContentsInformation
6from Products.WAeUP.WAeUPPermissions import UniversityManage, StudentManage,FacultyManage,\
7                                            DepartmentManage,CourseManage
8try:
9  from Products.CPSSubscriptions.permissions import CanNotifyContent
10  CPSSubscriptions = True
11except ImportError:
12  CPSSubscriptions = False
13try:
14  from Products.CPSForum.CPSForumPermissions import ForumManageComments
15  CPSForum = True
16except ImportError:
17  CPSForum = False
18
19from Products.WAeUP.Students import addStudentsFolder
20
21SRPP_ID = "demouni"
22SRPP_TITLE = "Demo University"
23
24class WAeUPInstaller(CPSInstaller):
25    """
26    WAeUP Installer
27    """
28    product_name = "WAeUP"
29
30    def install(self,portal):
31        "install"
32        log = []
33        prlog = log.append
34
35        def pr(msg, prlog=prlog):
36            prlog('%s<br>' % msg)
37
38        product_name = self.product_name
39        pr("Starting %(product_name)s install" % vars() )
40
41        # Roles and Permissions ###(
42        #
43        self.verifyRoles((
44            # A role that can manage the University.
45            'UniversityManager',
46            # A role that can manage the StudentsRecords.
47            'StudentManager',
48            # A role that can manage a Faculty.
49            'FacultyManager',
50            # A role that can manage a department.
51            'DepartmentManager',
52            # A role that can manage a Course.
53            'CourseManager',
54            # The Student Role
55            'Student',
56        ))
57        waeup_perms = {
58            UniversityManage:
59                ('Manager', 'SectionManager','UniversityManager',
60                 ),
61            StudentManage:
62                ('Manager', 'SectionManager','UniversityManager', 'StudentManager'
63                 ),
64            FacultyManage:
65                ('Manager', 'SectionManager','UniversityManager', 'FacultyManager'
66                 ),
67            DepartmentManage:
68                ('Manager', 'SectionManager','UniversityManager', 'DepartmentManager'
69                 ),
70            CourseManage:
71                ('Manager', 'SectionManager','UniversityManager', 'CourseManager'
72                 ),
73        }
74        self.setupPortalPermissions(waeup_perms)
75        ###)
76
77        # external methods ###(
78        #
79        ext_methods = ( { 'id': 'waeup_migrate',
80                          'title': 'WAeUP (migrate from an earlier version)',
81                          'script': 'WAeUP.install',
82                          'method': 'migrate',
83                          'protected': 1,
84                        },
85                      )
86        portal_objectIds = portal.objectIds()
87        for meth in ext_methods:
88            method = meth['id']
89            if method in portal_objectIds:
90                portal._delObject(method)
91            pr('Creating %s External Method' % method)
92            ext_method = ExternalMethod(method,
93                                        meth['title'],
94                                        meth['script'],
95                                        meth['method'])
96            portal._setObject(method, ext_method)
97            if method in portal_objectIds:
98                manage_perms = portal[method].manage_permission
99                if meth['protected']:
100                    pr("Protecting %s" % method)
101                    manage_perms(View, roles=['Manager'], acquire=0)
102                    manage_perms(AccessContentsInformation, roles=['Manager'], acquire=0)
103                else:
104                    manage_perms(View, roles=['Manager'], acquire=1)
105        ###)
106
107        ##########################################
108        # Actions
109        ##########################################
110        waeup_ptypes = "'University','StudentsFolder','Student','Jamb','Faculty','Department','Course'"
111        waeup_ptypes += ",'AccoFolder','Accommodation','StudentPersonal','AcademicsFolder'"
112        if CPSSubscriptions: ###(
113
114            ptypes = "('Portal', 'CPSMailAccess Message', 'CPSMailAccess Box', 'CPSMailAccess Folder',"\
115                     + waeup_ptypes + ")"
116            condition = "object.portal_type not in %s" % ptypes
117
118            action = {'id' : 'notify_content',
119                      'name' : 'action_notify_content',
120                      'action' : 'string:${object_url}/content_notify_email_form',
121                      'condition' : 'python:%s' % condition,
122                      'permission' :  (CanNotifyContent,),
123                      'category' : 'object',
124                      }
125            self.deleteActions({'portal_subscriptions': ['notify_content',]})
126            self.verifyAction('portal_subscriptions', **action)
127        if CPSForum:
128            condition = "object.portal_type not in (%s)" % waeup_ptypes
129
130            action = {'id' : 'activate_comments',
131                      'name': 'action_activate_comments',
132                      'action': 'string:${object/absolute_url}/set_comment_mode?mode=1',
133                      'condition' : 'python:%s' % condition,
134                      'permission': (ForumManageComments,),
135                      'category' : 'object',
136                      }
137            self.deleteActions({'portal_subscriptions': ['activate_comments',]})
138            self.verifyAction('portal_subscriptions', **action)
139            # now portal_discussion
140            self.deleteActions({'portal_discussion': ['comment',
141                                                      'activate_comments',
142                                                      'deactivate_comments',
143                                                      'manage_comments']})
144            action = {'id' : 'comment',
145                      'name': 'action_comment',
146                      'action': "string:${object/absolute_url}/post_comment",
147                      'condition' : "python:getattr(object.getContent(), 'allow_discussion' , None) and object.hasCommentAction()",
148                      'permission': (View,),
149                      'category' : 'object',
150                      }
151            self.verifyAction('portal_discussion', **action)
152            action = {'id' : 'activate_comments',
153                      'name': 'action_activate_comments',
154                      'action': "string:${object/absolute_url}/set_comment_mode?mode=1",
155                      'condition' : "python:getattr(object.getTypeInfo(),'cps_proxy_type','') in ('document', 'folderishdocument') and getattr(object.getContent(), 'allow_discussion' , None) == 1",
156                      'permission': (ForumManageComments,),
157                      'category' : 'object',
158                      }
159            self.verifyAction('portal_discussion', **action)
160            action = {'id' : 'deactivate_comments',
161                      'name': 'action_deactivate_comments',
162                      'action': "string:${object/absolute_url}/set_comment_mode?mode=0",
163                      'condition' : "python:getattr(object.getTypeInfo(),'cps_proxy_type','') in ('document', 'folderishdocument') and getattr(object.getContent(), 'allow_discussion' , None) == 1",
164                      'permission': (ForumManageComments,),
165                      'category' : 'object',
166                      }
167            self.verifyAction('portal_discussion', **action)
168            action = {'id' : 'manage_comments',
169                      'name': 'action_manage_comments',
170                      'action': "string:${object/absolute_url}/manage_comment",
171                      'condition' : "python:getattr(object.getTypeInfo(),'cps_proxy_type','') in ('document', 'folderishdocument') and getattr(object.getContent(), 'allow_discussion' , None) == 1",
172                      'permission': (ForumManageComments,),
173                      'category' : 'object',
174                      }
175            self.verifyAction('portal_discussion', **action)
176
177###)
178
179        ##########################################
180        # main_tab actions ###(
181        ##########################################
182        path = "/sections/%(SRPP_ID)s" % globals()
183        actions = ( { 'tool'      : 'portal_actions',
184                        'id'        : 'student_administration',
185                        'name'      : 'Students',
186                        'action'    : 'string:${portal_url}/students',
187                        #'action'    : 'string:$portal_url%(path)s/students' % vars(),
188                        'permission': (View, ),
189                        'category'  : 'main_tabs',
190                        'visible'   : 1,
191                      },
192                      { 'tool'      : 'portal_actions',
193                        'id'        : 'Academics',
194                        'name'      : 'Academics',
195                        #'action'    : 'string:$portal_url%(path)s/academics' % vars(),
196                        #'action'    : 'string:${portal_url}/sections/unidemo',
197                        'action'    : 'string:${portal_url}/academics',
198                        'permission': (View ),
199                        'category'  : 'main_tabs',
200                        'visible'   : 1,
201                      },
202                      { 'tool'      : 'portal_actions',
203                        'id'        : 'accomodation',
204                        'name'      : 'Accommodation',
205                        #'action'    : 'string:$portal_url%(path)s/accommodation' % vars(),
206                        #'action'    : 'string:${portal_url}/sections/waeup/accommodation/accommodation_index_html',
207                        'action'    : 'string:${portal_url}/accommodation',
208                        'permissions': (View),
209                        #'permissions': (ModifyPortalContent,UniversityManage,StudentManage),
210                        'category'  : 'main_tabs',
211                        'visible'   : 1,
212                      },
213##                      { 'tool'      : 'portal_actions',
214##                        'id'        : 'add_jamb',
215##                        'name'      : 'Add Student JAMB',
216##                        'action'    : 'string:${object/absolute_url}/create_jamb',
217##                        'permission': (),
218##                        'condition' : 'python: member and here.portal_type in ("StudentsFolder",) and "StudentManager" in member.getGroups()',
219##                        'category'  : 'student',
220##                        'visible'   : 1,
221##                      },
222##                      { 'tool'      : 'portal_actions',
223##                        'id'        : 'add_faculty',
224##                        'name'      : 'Add New Faculty',
225##                        'action'    : 'string:${object/absolute_url}/addFaculty',
226##                        'permission': (),
227##                        'condition' : 'python: member and here.portal_type in ("University",) and "StudentManager" in member.getGroups()',
228##                        'category'  : 'student',
229##                        'visible'   : 1,
230##                      },
231##                      { 'tool'      : 'portal_actions',
232##                        'id'        : 'add_department',
233##                        'name'      : 'Add New Department',
234##                        'action'    : 'string:${object/absolute_url}/addDepartment',
235##                        'permission': (),
236##                        'condition' : 'python: member and here.portal_type in ("Faculty",) and "StudentManager" in member.getGroups()',
237##                        'category'  : 'student',
238##                        'visible'   : 1,
239##                      },
240##                      { 'tool'      : 'portal_actions',
241##                        'id'        : 'add_course',
242##                        'name'      : 'Add New Course',
243##                        'action'    : 'string:${object/absolute_url}/addCourse',
244##                        'permission': (),
245##                        'condition' : 'python: member and here.portal_type in ("Department",) and "StudentManager" in member.getGroups()',
246##                        'category'  : 'student',
247##                        'visible'   : 1,
248##                      },
249##                      { 'tool'      : 'portal_actions',
250##                        'id'        : 'add_personal',
251##                        'name'      : 'Add personal Data',
252##                        'action'    : 'string:${object/absolute_url}/create_personal_form',
253##                        'permission': (),
254##                        'condition' : 'python: 0 and member and not here.portal_type in ("Jamb","StudentsFolder") and not "StudentManager" in member.getGroups()',
255##                        'category'  : 'student',
256##                        'visible'   : 1,
257##                      },
258##                      { 'tool'      : 'portal_actions',
259##                        'id'        : 'edit_jamb',
260##                        'name'      : 'Edit Jamb Data',
261##                        'action'    : 'cpsdocument_edit_form',
262##                        'permission': ( ),
263##                        'condition' : 'python: member and here.portal_type in ("Student",) and "StudentManager" in member.getGroups()',
264##                        'category'  : 'student',
265##                        'visible'   : 1,
266##                      },
267                    )
268        self.verifyActions(actions)
269        ##########################################
270###)
271
272        # skins
273        ##########################################
274        pr("Verifying %(product_name)s skinss" % vars())
275        wskins = { 'waeup_default' : 'Products/WAeUP/skins/waeup_default',
276                   'waeup_faculty' : 'Products/WAeUP/skins/waeup_faculty',
277                   'waeup_student' : 'Products/WAeUP/skins/waeup_student',
278                 }
279        self.verifySkins(wskins)
280        self.resetSkinCache()
281
282        # Themes ###(
283        #
284        # Importing portal themes
285##        theme_container = getattr(portal, 'portal_themes')
286##            # the first theme in each category is the default theme.
287##        themes_list = {'WAeUP':    ({'id': 'waeup_plain_theme',
288##                                  'file': 'waeup_plain_theme.zexp',
289##                                  },
290##                                  {'id': 'waeup_management_theme',
291##                                   'file': 'waeup_management_theme.zexp',
292##                                  },
293##                                 ),
294##                      }
295##
296##
297##        theme_ids = theme_container.objectIds()
298##        theme_container.manage_delObjects(theme_ids)
299##        target_themes = themes_list[Target]
300##        for theme in target_themes:
301##            pr(" Importing %s theme" % theme['id'])
302##            zexppath = os.path.join(zexpdir, theme['file'])
303##            try:
304##                theme_container._importObjectFromFile(zexppath)
305##            except:
306##                pr("    Could not import theme  %s" % theme['id'])
307##
308##        # set the first theme in the list as the default one.
309##        theme_container.setDefaultTheme(target_themes[0]['id'])
310###)
311
312
313        ##########################################
314        # portal types
315        ##########################################
316        dtypes = portal.getWAeUPTypes()
317        self.verifyFlexibleTypes(dtypes)
318        self.allowContentTypes('University', ('Workspace','Section',))
319        ##########################################
320        # Schemas
321        ##########################################
322        pr("Verifying %(product_name)s schemas" % vars())
323        self.verifySchemas(portal.getWAeUPSchemas())
324        ##########################################
325        # widgets
326        ##########################################
327        pr("Verifying %(product_name)s widgets" % vars())
328        self.verifyWidgets(portal.getWAeUPWidgets())
329        ##########################################
330        # layouts
331        ##########################################
332        pr("Verifying %(product_name)s layouts" % vars())
333        self.verifyLayouts(portal.getWAeUPLayouts())
334        ##########################################
335        # Vocabularies
336        ##########################################
337        pr("Verifying %(product_name)s vocabularies" % vars())
338        self.verifyVocabularies(portal.getWAeUPVocabularies())
339        ##########################################
340        # Groups
341        ##########################################
342
343        self.installCustomWorkflows()
344        self.verifyWorkflowAssociation()
345
346        pr("End of specific %(product_name)s install" % vars())
347        #return '\n'.join(log)
348        self.finalize()
349
350
351    def installCustomWorkflows(self):
352        """Installs custom workflows
353        """
354        from Products.WAeUP.Workflows.WAeUPWorkflow import \
355             waeupWorkflowsInstall
356
357        waeupWorkflowsInstall(self.context)
358
359
360    def verifyWorkflowAssociation(self):
361        """Verify workflow association
362        """
363        ws_chains = {
364                      'Student': 'waeup_workspace_wf',
365                      'Jamb': 'waeup_workspace_wf',
366                      }
367
368        se_chains = { 'University': 'waeup_section_wf',
369                      'AcademicsFolder': 'waeup_section_wf',
370                      'StudentsFolder': 'waeup_section_wf',
371                      'Student': 'waeup_section_wf',
372                      'StudentPersonal': 'waeup_section_wf',
373                      'Jamb': 'waeup_section_wf',
374                      'ScratchCard': 'waeup_section_wf',
375                      'Faculty': 'waeup_section_wf',
376                      'Department': 'waeup_section_wf',
377                      'Course': 'waeup_section_wf',
378                      'AccoFolder': 'waeup_section_wf',
379                      'Accommodation': 'waeup_section_wf',
380                      }
381
382        self.verifyLocalWorkflowChains(self.portal['workspaces'],
383                                       ws_chains,
384                                       destructive=1)
385        self.verifyLocalWorkflowChains(self.portal['sections'],
386                                       se_chains,
387                                       destructive=1)
388
389
390def install(self):
391    installer = WAeUPInstaller(self)
392    installer.install(self)
393    dirtool = getattr(self,'portal_directories')
394    groups = dirtool.groups
395    for delEntry in ('StudentManager',):
396        if delEntry in groups.listEntryIds():
397            groups.deleteEntry(delEntry)
398    for newEntry in ('Students',):
399        if newEntry not in groups.listEntryIds():
400            groups.createEntry({'group': newEntry,
401                                'members': []})
402    #groups.manage_setLocalGroupRoles(groupid = 'StudentManager',roles=('Manager',))
403    #groups.manage_setLocalGroupRoles(groupid = 'Students',roles=('Contributor',))
404    sections = getattr(self,'sections')
405    waeup = getattr(sections,SRPP_ID,None)
406    if not waeup:
407        sections.invokeFactory('University',SRPP_ID)
408        waeup = getattr(sections,SRPP_ID)
409        waeup.getContent().edit(mapping={'Title':SRPP_TITLE})
410        waeup.folder_localrole_add(member_ids=('group:Students',),
411                                            member_role='SectionReviewer',
412                                            )
413        waeup.invokeFactory('StudentsFolder','students')
414        students = getattr(waeup,'students').getContent()
415        students.edit(mapping={'Title':'Students'})
416        waeup.folder_localrole_add(member_ids=('group:Students',),
417                                            member_role='SectionReviewer',
418                                            )
419##        waeup.content_create(type_name='AcademicsFolder',title='academics')
420##        sections.waeup.folder_localrole_add(member_ids=('group:StudentManager',),
421##                                            member_role='SectionManager',
422##                                            )
423        waeup.students.manage_setLocalGroupRoles(groupid = 'Students',roles=('Contributor',))
424        waeup.invokeFactory('AcademicsFolder','academics', title='Academics')
425        academics = getattr(waeup,'academics').getContent()
426        academics.edit(mapping={'Title':'Academics'})
427        waeup.invokeFactory('AccoFolder','accommodation', title='Accommodation')
428        accommodation = getattr(waeup,'accommodation').getContent()
429        accommodation.edit(mapping={'Title':'Accommodation'})
430    if not hasattr(waeup,'academics'):
431        waeup.invokeFactory('AcademicsFolder','academics')
432        academics = getattr(waeup,'academics').getContent()
433        academics.edit(mapping={'Title':'Academics'})
434    if not hasattr(waeup,'accommodation'):
435        waeup.invokeFactory('AccoFolder','accommodation')
436        accommodation = getattr(waeup,'accommodation').getContent()
437        accommodation.edit(mapping={'Title':'Accommodation'})
438    waeup.manage_setLocalGroupRoles(groupid = 'role:Anonymous',roles=('SectionReader',))
439    # portlets ###(
440    #
441    portlets = (
442##              {'identifier': 'waeup_main_tabs',
443##              'type': 'Custom Portlet',
444##              'slot': 'main_tabs',
445##              'order': 0,
446##              'render_method': 'portlet_main_navigation',
447##              'Title': 'main tabs',
448##              },
449              {'identifier': 'waeup_breadcrumbs',
450              'type': 'Breadcrumbs Portlet',
451              'slot': 'waeup_breadcrumbs',
452              'first_item': 2,
453              'display_site_root': 0,
454              'Title': 'waeup_breadcrumbs',
455              'display': 'horizontal_trail',
456              'display_hidden_folders': 0,
457              'order': 0,
458              },
459              {'identifier': 'waeup_main_tab_actions',
460              'type': 'Actions Portlet',
461              'slot': 'main_tabs',
462              'order': 0,
463              'categories': ['main_tabs',],
464              'Title': 'waep_main_tab_actions',
465              },
466              {'identifier': 'waeup_object_actions',
467              'type': 'Actions Portlet',
468              'slot': 'waeup_object_actions',
469              'order': 0,
470              'categories': ['object',],
471              'Title': 'waep_manager_actions',
472              },
473              {'identifier': 'waeup_left_top',
474              'type': 'Custom Portlet',
475              'slot': 'left_top',
476              'order': 0,
477              'render_method': 'portlet_session_info',
478              'Title': 'Session Info',
479              },
480            )
481    installer.verifyPortletContainer(waeup)
482    installer.verifyPortlets(portlets,waeup)
483
484###)
485
486    return installer.logResult()
487
488def migrate(self):
489    "update data"
490    log = []
491    prlog = log.append
492
493    def pr(msg, prlog=prlog):
494        prlog('%s' % msg)
495
496    sections = getattr(self,'sections')
497    waeup = getattr(sections,SRPP_ID,None)
498    pr( "Start migrate")
499    pr("migrating courses")
500    academics = getattr(waeup,'academics')
501    for fac in [getattr(academics,f.id) for f in academics.contentValues(filter={'portal_type': ('Faculty',)})]:
502        pr("Faculty: %s" % fac.title_or_id())
503        for dep in [getattr(fac,d.id) for d in fac.contentValues(filter={'portal_type': ('Department',)})]:
504            pr("Department: %s" % dep.title_or_id())
505            for course in [getattr(dep,c.id) for c in dep.contentValues(filter={'portal_type': ('Course',)})]:
506                pr("Course: %s" % course.title_or_id())
507                content = course.getContent()
508                heading = getattr(content,'heading',course.id)
509                pr("heading = %(heading)s" % vars())
510                content.edit(mapping={'Title': heading})
511    pr("migrating halls")
512    for ac in [getattr(waeup,a.id) for a in waeup.contentValues(filter={'portal_type': ('AccoFolder',)})]:
513        for hall in [getattr(ac,h.id) for h in ac.contentValues(filter={'portal_type': ('Accommodation',)})]:
514            pr("Hall: %s" % hall.title_or_id())
515            content = hall.getContent()
516            heading = getattr(content,'heading',hall.id)
517            pr("heading = %(heading)s" % vars())
518            content.edit(mapping={'Title': heading})
519    return '\n'.join(log)
520               
Note: See TracBrowser for help on using the repository browser.