[Checkins] SVN: z3ext.product/trunk/ Fixed bug with enclosed sites

Nikolay Kim fafhrd at datacom.kz
Mon Sep 29 16:05:19 EDT 2008


Log message for revision 91627:
  Fixed bug with enclosed sites

Changed:
  U   z3ext.product/trunk/CHANGES.txt
  U   z3ext.product/trunk/src/z3ext/product/README.txt
  A   z3ext.product/trunk/src/z3ext/product/enclosed.txt
  U   z3ext.product/trunk/src/z3ext/product/product.py
  U   z3ext.product/trunk/src/z3ext/product/tests.py

-=-
Modified: z3ext.product/trunk/CHANGES.txt
===================================================================
--- z3ext.product/trunk/CHANGES.txt	2008-09-29 19:59:30 UTC (rev 91626)
+++ z3ext.product/trunk/CHANGES.txt	2008-09-29 20:05:18 UTC (rev 91627)
@@ -3,6 +3,12 @@
 =======
 
 
+1.2.1 (2008-09-30)
+------------------
+
+- Fixed bug with enclosed sites.
+
+
 1.2.0 (2008-09-04)
 ------------------
 

Modified: z3ext.product/trunk/src/z3ext/product/README.txt
===================================================================
--- z3ext.product/trunk/src/z3ext/product/README.txt	2008-09-29 19:59:30 UTC (rev 91626)
+++ z3ext.product/trunk/src/z3ext/product/README.txt	2008-09-29 20:05:18 UTC (rev 91627)
@@ -31,7 +31,7 @@
   ...
   ... </configure>""")
 
-  >>> from zope import component
+  >>> from zope import component, interface
   >>> from z3ext.controlpanel.interfaces import IConfiglet
 
   >>> installer = component.getUtility(IConfiglet, 'product')

Added: z3ext.product/trunk/src/z3ext/product/enclosed.txt
===================================================================
--- z3ext.product/trunk/src/z3ext/product/enclosed.txt	                        (rev 0)
+++ z3ext.product/trunk/src/z3ext/product/enclosed.txt	2008-09-29 20:05:18 UTC (rev 91627)
@@ -0,0 +1,127 @@
+===========================
+Products for enclosed sites
+===========================
+
+Loading zcml configuration
+
+  >>> import z3ext.product
+  >>> from zope.configuration import xmlconfig
+  >>> context = xmlconfig.string("""
+  ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext"
+  ...    xmlns="http://namespaces.zope.org/zope" i18n_domain="z3ext">
+  ...    <include package="z3ext.controlpanel" file="meta.zcml" />
+  ...    <include package="z3ext.product" file="meta.zcml" />
+  ...    <include package="zope.security" file="meta.zcml" />
+  ...    <include package="z3c.baseregistry" file="meta.zcml" />
+  ...    
+  ...    <permission
+  ...      id="z3ext.ManageProducts"
+  ...      title="Manage products" />
+  ...      
+  ...    <z3ext:configlet
+  ...      name="product"
+  ...      schema="z3ext.product.interfaces.IProductInstaller"
+  ...      title="Products management"
+  ...      description="This is the Add-on Products install section."
+  ...      class="z3ext.product.installer.ProductsInstaller"
+  ...      permission="z3ext.ManageProducts" />
+  ...
+  ... </configure>""")
+
+
+Product
+
+  >>> from zope import schema, component, interface
+
+  >>> class IMyProduct(interface.Interface):
+  ...     """ Basic product """
+
+  >>> context = xmlconfig.string('''
+  ... <configure
+  ...    xmlns:z3ext="http://namespaces.zope.org/z3ext" i18n_domain="test">
+  ... 
+  ...   <z3ext:product
+  ...     name="my-product"
+  ...     title="My product"
+  ...     configurable="true"
+  ...     schema="z3ext.product.README.IMyProduct" />
+  ...
+  ... </configure>''', context)
+
+  >>> from z3ext import product
+  >>> from z3ext.product.interfaces import IProduct
+
+  >>> productRegistry = z3ext.product.registries['my-product']
+
+  >>> class IMyUtility(interface.Interface):
+  ...     """ """
+
+  >>> class MyUtility(object):
+  ...     interface.implements(IMyUtility)
+
+  >>> utility = MyUtility()
+  >>> productRegistry.registerUtility(utility, name='myUtility')
+
+  >>> from zope.app.folder.folder import Folder
+  >>> from zope.app.component.site import LocalSiteManager
+  >>> from zope.app.component.hooks import getSite, setSite
+
+  >>> site = getSite()
+  >>> site1 = Folder()
+  >>> site['site1'] = site1
+  >>> sm = LocalSiteManager(site1)
+  >>> site1.setSiteManager(sm)
+
+  >>> site.getSiteManager().queryUtility(IMyUtility, name='myUtility') is None
+  True
+
+  >>> site1.getSiteManager().queryUtility(IMyUtility, name='myUtility') is None
+  True
+
+Install product
+
+  >>> product = component.getUtility(IMyProduct)
+  >>> product.isInstalled()
+  False
+  >>> product.install()
+
+  >>> site.getSiteManager().queryUtility(IMyUtility, name='myUtility')
+  <z3ext.product.README.MyUtility object at ...>
+
+  >>> site1.getSiteManager().queryUtility(IMyUtility, name='myUtility')
+  <z3ext.product.README.MyUtility object at ...>
+
+  >>> product.isInstalled()
+  True
+  >>> product.isUninstallable()
+  True
+
+Installation status in subsite
+
+  >>> setSite(site1)
+  >>> product = component.getUtility(IMyProduct)
+  >>> product.isInstalled()
+  True
+  >>> product.isUninstallable()
+  False
+
+  >>> setSite(site)
+  >>> product = component.getUtility(IMyProduct)
+  >>> product.uninstall()
+
+  >>> setSite(site1)
+  >>> product = component.getUtility(IMyProduct)
+  >>> product.isInstalled()
+  False
+  >>> product.install()
+  
+  >>> site1.getSiteManager().queryUtility(IMyUtility, name='myUtility')
+  <z3ext.product.README.MyUtility object at ...>
+
+  >>> setSite(site)
+  >>> product = component.getUtility(IMyProduct)
+  >>> product.isInstalled()
+  False
+
+  >>> site.getSiteManager().queryUtility(IMyUtility, name='myUtility') is None
+  True

Modified: z3ext.product/trunk/src/z3ext/product/product.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/product.py	2008-09-29 19:59:30 UTC (rev 91626)
+++ z3ext.product/trunk/src/z3ext/product/product.py	2008-09-29 20:05:18 UTC (rev 91627)
@@ -20,6 +20,7 @@
 from zope import interface, event
 from zope.component import getSiteManager
 from zope.component import getUtility, queryUtility, getUtilitiesFor
+from zope.app.component.interfaces import ILocalSiteManager
 
 from z3c.configurator import configure
 
@@ -73,6 +74,10 @@
         registry = getattr(z3ext.product, self.__product_name__)
         sm.__bases__ = (registry,) + sm.__bases__
 
+        if ILocalSiteManager.providedBy(sm):
+            for subsm in sm.subs:
+                subsm.__bases__ = subsm.__bases__
+
         event.notify(interfaces.ProductInstalledEvent(self.__product_name__, self))
 
         self.update()
@@ -104,6 +109,10 @@
         bases.remove(registry)
         sm.__bases__ = tuple(bases)
 
+        if ILocalSiteManager.providedBy(sm):
+            for subsm in sm.subs:
+                subsm.__bases__ = subsm.__bases__
+
         event.notify(
             interfaces.ProductUninstalledEvent(self.__product_name__, self))
 

Modified: z3ext.product/trunk/src/z3ext/product/tests.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/tests.py	2008-09-29 19:59:30 UTC (rev 91626)
+++ z3ext.product/trunk/src/z3ext/product/tests.py	2008-09-29 20:05:18 UTC (rev 91627)
@@ -35,4 +35,8 @@
             'README.txt',
             setUp=setUp, tearDown=tearDown,
             optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        doctest.DocFileSuite(
+            'enclosed.txt',
+            setUp=setUp, tearDown=tearDown,
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
         ))



More information about the Checkins mailing list