source: products/SimpleBlog/trunk/Extensions/Install.py @ 1

Last change on this file since 1 was 1, checked in by myroslav, 18 years ago

Building directory structure

  • Property svn:eol-style set to native
File size: 8.5 KB
Line 
1from Products.Archetypes.public import listTypes
2from Products.Archetypes.Extensions.utils import installTypes, install_subskin
3from Products.CMFCore.utils import getToolByName
4from StringIO import StringIO
5from Products.CMFCore.CMFCorePermissions import setDefaultRoles
6from Products.CMFDynamicViewFTI.migrate import migrateFTIs
7from Products.SimpleBlog.config import *
8from Products.RPCAuth.RPCAuth import manage_addRPCAuth
9
10portlets=['here/portlet_simpleblog/macros/portletBlogFull_local', 
11          'here/portlet_simpleblog/macros/portletBlogFull_global',
12          'here/portlet_simpleblog/macros/portletBlogRecent_local',
13          'here/portlet_simpleblog/macros/portletBlogRecent_global']
14
15def addRPCAuth(self, out):
16    """ Add RPC Auth object to the root of the site.
17    """
18    portal = getToolByName(self, 'portal_url').getPortalObject()
19    rpcauth = getToolByName(portal, 'RPCAuth', None)
20    if rpcauth is None:
21        manage_addRPCAuth(portal,'RPCAuth')
22        print >>out, 'Installing RPC Auth'
23    else:
24        print >>out, 'RPC Auth already installed'
25
26
27def install(self):
28
29    out = StringIO()
30
31    installTypes(self, out,
32                 listTypes(PROJECTNAME),
33                 PROJECTNAME)
34
35    install_subskin(self, out, GLOBALS)
36
37    # Migrate FTI, to make sure we get the necessary infrastructure for the
38    # 'display' menu to work.
39    migrated = migrateFTIs(self, product=PROJECTNAME)
40    print >>out, "Switched to DynamicViewFTI: %s" % ', '.join(migrated)
41
42    # Enable portal_factory
43    factory = getToolByName(self, 'portal_factory')
44    types = factory.getFactoryTypes().keys()
45    if 'TrackBack' not in types:
46        types.append('TrackBack')
47        factory.manage_setPortalFactoryTypes(listOfTypeIds = types)
48    if 'BlogEntry' not in types:
49        types.append('BlogEntry')
50        factory.manage_setPortalFactoryTypes(listOfTypeIds = types)
51    if 'BlogFolder' not in types:
52        types.append('BlogFolder')
53        factory.manage_setPortalFactoryTypes(listOfTypeIds = types)
54    if 'Blog' not in types:
55        types.append('Blog')
56        factory.manage_setPortalFactoryTypes(listOfTypeIds = types)
57
58    portal = getToolByName(self,'portal_url').getPortalObject()
59
60    if not hasattr(self, 'simpleblog_tool'):
61        addTool = portal.manage_addProduct['SimpleBlog'].manage_addTool
62        addTool(type='SimpleBlog manager')   
63   
64    # register the css
65    # Install stylesheet
66    # Make it work for the entire portal because the portlets can
67    # be used everywhere
68    portal_css = getToolByName(self, 'portal_css')
69    portal_css.manage_addStylesheet(id = 'SimpleBlogCSS.css',
70                                    expression = '',
71                                    media = 'all',
72                                    title = 'SimpleBlog styles',
73                                    enabled = True)   
74   
75    #register the folderish items in portal_properties/site_properties for folder-contents views etc
76    site_props = getToolByName(self, 'portal_properties').site_properties
77   
78    use_folder_tabs = site_props.getProperty('use_folder_tabs')
79    if not 'Blog' in use_folder_tabs:
80        site_props._updateProperty('use_folder_tabs', tuple(use_folder_tabs) + ('Blog','BlogFolder'))
81
82    use_folder_contents = site_props.getProperty('use_folder_contents')
83    if not 'Blog' in use_folder_contents:
84        site_props._updateProperty('use_folder_contents', tuple(use_folder_contents) + ('Blog','BlogFolder'))
85
86    if ENTRY_IS_FOLDERISH:
87        if not 'BlogEntry' in use_folder_tabs:
88            site_props._updateProperty('use_folder_tabs', tuple(use_folder_tabs) + ('BlogEntry',))
89        if not 'BlogEntry' in use_folder_contents:
90            site_props._updateProperty('use_folder_contents', tuple(use_folder_contents) + ('BlogEntry',))
91       
92
93    #Make sure blog entries aren't shown in the navtree by default
94    nav_props = getToolByName(self, 'portal_properties').navtree_properties
95    metaTypesNotToList = nav_props.getProperty('metaTypesNotToList')
96    if not 'BlogEntry' in metaTypesNotToList:
97        nav_props._updateProperty('metaTypesNotToList', tuple(metaTypesNotToList) + ('BlogEntry',))
98       
99    # Add to default_page_types
100    # Allow people to have a Blog as the default page
101    propsTool = getToolByName(self, 'portal_properties')
102    siteProperties = getattr(propsTool, 'site_properties')   
103    defaultPageTypes = list(siteProperties.getProperty('default_page_types'))
104    if 'Blog' not in defaultPageTypes:
105        defaultPageTypes.append('Blog')
106    siteProperties.manage_changeProperties(default_page_types = defaultPageTypes)
107
108    if not portal.hasProperty('trackback_notification_email'):
109        portal.manage_addProperty('trackback_notification_email', '', 'string')
110
111    # discussion enabled by default for BlogEntries
112    getToolByName(self, 'portal_types').BlogEntry.allow_discussion=1
113
114    # register 2.0 control panel
115    try:
116        cp=self.portal_controlpanel
117        cp.addAction(id='SimpleBlogSetup',
118                     name='SimpleBlog Setup',
119                     action='string:${portal_url}/prefs_simpleblog_form',
120                     permission='Manage portal',
121                     category='Products',
122                     appId='SimpleBlog',
123                     imageUrl='simpleblog_icon.gif',
124                     description='Configure SimpleBlog global settings')
125    except:
126        pass
127
128    # install the workflow
129    from Products.SimpleBlog import SimpleBlogWorkflow, TrackbackWorkflow
130    reload(SimpleBlogWorkflow)
131    reload(TrackbackWorkflow)
132
133
134    # Remove workflows for BlogEntry and BlogFolder
135    wf_tool = getToolByName(self, 'portal_workflow')
136    wf_tool.setChainForPortalTypes( ('Blog', 'BlogEntry','BlogFolder'), []) 
137   
138    add_workflow(self, 'simpleblog_workflow', 'simpleblog_workflow (Workflow for Blog Entries)', ('BlogEntry',), out)
139    add_workflow(self, 'trackback_workflow', 'trackback_workflow (TrackBack Workflow)', ('TrackBack',), out)
140
141    wf_tool.setChainForPortalTypes(('Blog','BlogFolder'), 'folder_workflow')       
142
143    addRPCAuth(self, out)
144
145    print >> out, "Successfully installed %s." % PROJECTNAME
146    return out.getvalue()
147
148def add_workflow(self, wf_id, wf_factory_id, types, out):
149    """ add a workflow definition to the portal_workflow tool """
150    wf_tool = self.portal_workflow
151    try:
152        wf_tool.manage_delObjects([wf_id])
153        out.write('Removed existant workflow "%s"\n'%wf_id)
154    except:
155        pass
156    wf_tool.manage_addWorkflow(wf_factory_id, wf_id)
157    if types:
158        wf_tool.setChainForPortalTypes(types, wf_id)
159    out.write('Added workflow "%s"\n'%wf_id)
160
161
162def uninstall(self):
163    # remove the references in each folder to our portlet:
164   
165    # this gotta be effective some time
166    # someone's gotta test if this works like it should
167    # commented out for the time being:
168   
169    #portal = getToolByName(self,'portal_url').getPortalObject()
170    #processPortletOld(portal)
171    #processPortletNew(portal)
172    #removeReferences(portal)
173   
174    #remove configlet
175    try:
176        self.portal_controlpanel.unregisterApplication('SimpleBlog')
177    except:
178        pass
179                     
180def removeReferences(obj):
181    for o in obj.contentValues():
182        if o.isPrincipiaFolderish:
183            processPortletOld(o)
184            processPortletNew(o)
185            removeReferences(o)
186
187def processPortletOld(o):
188    if not o.portal_type in ['Blog', 'BlogFolder', 'BlogEntry']:
189        if hasattr(o.aq_base, 'left_slots') or hasattr(o.aq_base, 'right_slots'):
190            new=[]
191            if hasattr(o.aq_base,'left_slots'):
192                for l in o.aq_base.left_slots:
193                    if not l in portlets:
194                        new.append(l)
195                o.left_slots=new
196            new=[]
197            if hasattr(o.aq_base, 'right_slots'):
198                for l in o.aq_base.right_slots:
199                    if not l in portlets:
200                        new.append(l)
201                o.right_slots=new
202
203def processPortletNew(o):
204    if not o.portal_type in ['Blog', 'BlogFolder', 'BlogEntry']:   
205        if hasattr(o.aq_base, 'column_one_portlets') or hasattr(o.aq_base, 'column_two_portlets'):
206            new=[]
207            if hasattr(o.aq_base,'column_one_portlets'):
208                for l in o.aq_base.column_one_portlets:
209                    if not l in portlets:
210                        new.append(l)
211                o.column_one_portlets=new
212            new=[]
213            if hasattr(o.aq_base, 'column_two_portlets'):
214                for l in o.aq_base.column_two_portlets:
215                    if not l in portlets:
216                        new.append(l)
217                o.column_two_portlets=new
218       
219           
Note: See TracBrowser for help on using the repository browser.