Add additional magic after invokeFactory call
[zope-bootstrap.git] / src / koehsel.policy / koehsel / policy / setuphandlers.py
index 22b3a87..71cd558 100644 (file)
@@ -1,6 +1,28 @@
 from Products.CMFCore.utils import getToolByName
+from Acquisition import aq_base
+from zope import event
+from Products.Archetypes.event import ObjectInitializedEvent
+
+INSTALL_PRODUCTS = [
+    'easyshop.core', 
+    'koehsel.theme',
+]
+
+SITE_OWNER = 'admin'
+
+def makePublicObject(container, type_name, id, **kw):
+    """Create an object in CONTAINER with type TYPE_NAME and id ID. Additional keyword args
+specify additional factory arguments. After creation, the object is published if needed."""
+    id = container.invokeFactory(id=id, type_name=type_name, **kw)
+    ob = getattr(container,id)
+    event.notify(ObjectInitializedEvent(ob))
+    ob.at_post_create_script()
+#    if hasattr(aq_base(ob), 'manage_afterPortalFactoryCreate'):
+#        ob.manage_afterPortalFactoryCreate()
+    wf = getToolByName(container, 'portal_workflow')
+    if wf.getInfoFor(ob,'review_state','') != 'published':
+        wf.doActionFor(ob,'publish',comment='site setup')
 
-INSTALL_PRODUCTS = ['easyshop.core']
 
 def siteSetup(context):
 
@@ -8,10 +30,11 @@ def siteSetup(context):
         return
 
     site = context.getSite()
+    qi = getToolByName(site, 'portal_quickinstaller')
+    wf = getToolByName(site, 'portal_workflow')    
 
     # Install EasyShop product
 
-    qi = getToolByName(site, 'portal_quickinstaller')
     for p in INSTALL_PRODUCTS:
         if not qi.isProductInstalled(p):
             qi.installProduct(p)
@@ -20,13 +43,8 @@ def siteSetup(context):
 
     try: site.shop
     except AttributeError:
-        site.invokeFactory(id='shop', type_name='EasyShop')
-        shop = site.shop
-        shop.title = 'Shop'
-        shop.shopOwner = 'admin'
-        wf = getToolByName(site, 'portal_workflow')    
-        if wf.getInfoFor(shop,'review_state','') != 'published':
-            wf.doActionFor(shop,'publish',comment='site setup')
+        makePublicObject(container=site, type_name='EasyShop', 
+                         id='shop', title='Shop', shopOwner='admin')
 
     # Hide Users, News and Events
 
@@ -36,9 +54,23 @@ def siteSetup(context):
             wf.doActionFor(ob,'retract',comment='site setup')
 
 
-# Called via hackery in __init__.py
+def contentSetup(app):
+    app.manage_addProduct['CMFPlone'].addPloneSite(id='site',
+                                                   extension_ids=['koehsel.policy:default'])
+
+
+# Called via hackery in __init__.py on every site start
 def appInit(app):
     try: app.site
     except AttributeError:
-        app.manage_addProduct['CMFPlone'].addPloneSite(id='site',
-                                                       extension_ids=['koehsel.policy:default'])
+
+        from Testing.makerequest import makerequest
+        from AccessControl.SecurityManagement import newSecurityManager
+        import transaction, AccessControl
+
+        # Call 'contentSetup' as SITE_OWNER user with a valid REQUEST
+        req = makerequest(app)
+        newSecurityManager(req.REQUEST, app.acl_users.getUser(SITE_OWNER).__of__(app.acl_users))
+        contentSetup(req)
+        transaction.commit()
+        newSecurityManager(None, AccessControl.User.system)