[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