[Checkins] SVN: z3ext.product/tags/1.3.0/ release tag
Nikolay Kim
fafhrd at datacom.kz
Fri Nov 21 06:17:26 EST 2008
Log message for revision 93237:
release tag
Changed:
A z3ext.product/tags/1.3.0/
D z3ext.product/tags/1.3.0/CHANGES.txt
A z3ext.product/tags/1.3.0/CHANGES.txt
D z3ext.product/tags/1.3.0/setup.py
A z3ext.product/tags/1.3.0/setup.py
D z3ext.product/tags/1.3.0/src/z3ext/product/README.txt
A z3ext.product/tags/1.3.0/src/z3ext/product/README.txt
D z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py
A z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py
D z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml
A z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml
D z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py
A z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py
D z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.mo
A z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.mo
D z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po
A z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po
D z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.mo
A z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.mo
D z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po
A z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po
D z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot
A z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot
D z3ext.product/tags/1.3.0/src/z3ext/product/product.py
A z3ext.product/tags/1.3.0/src/z3ext/product/product.py
D z3ext.product/tags/1.3.0/src/z3ext/product/utils.py
A z3ext.product/tags/1.3.0/src/z3ext/product/utils.py
D z3ext.product/tags/1.3.0/src/z3ext/product/view.pt
A z3ext.product/tags/1.3.0/src/z3ext/product/view.pt
D z3ext.product/tags/1.3.0/src/z3ext/product/view.py
A z3ext.product/tags/1.3.0/src/z3ext/product/view.py
D z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py
A z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py
-=-
Deleted: z3ext.product/tags/1.3.0/CHANGES.txt
===================================================================
--- z3ext.product/trunk/CHANGES.txt 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/CHANGES.txt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,90 +0,0 @@
-=======
-CHANGES
-=======
-
-
-1.2.2 (2008-10-28)
-------------------
-
-- Added translations: nl, ru
-
-
-1.2.1 (2008-09-30)
-------------------
-
-- Fixed bug with enclosed sites.
-
-
-1.2.0 (2008-09-04)
-------------------
-
-- Added product dependencies (require attribute)
-
-
-1.1.2 (2008-08-13)
-------------------
-
-- Calculate installed status
-
-
-1.1.0 (2008-08-05)
-------------------
-
-- Implemented product management for enclosed site objects
-
-
-1.0.2 (2008-05-26)
-------------------
-
-- During product instalation, first install CA registry, then call update
-
-
-1.0.1 (2008-05-15)
-------------------
-
-- Compatibility with z3ext.controlpanel >= 1.2.3
-
-
-1.0.0 (2008-03-26)
-------------------
-
-- Tests added
-
-- Code moved to svn.zope.org
-
-
-0.11.1 (2008-03-04)
--------------------
-
-- Added 'broken' base registry in case product not available.
-
-
-0.11 (2008-02-28)
------------------
-
-- Use z3c.baseregistry
-
-- Use z3c.autoinclude
-
-- Create components registry for each product.
- now it's possible to use <registerIn registry="z3ext.product.productName'/>
- for registering product adapters and utulities.
-
-
-0.10.2 (2008-02-18)
-------------------
-
-- Don't show 'Products Management' configlet
- if there are no installable products
-
-
-0.10.1 (2008-02-01)
-------------------
-
-- Removed `grant` directives
-
-
-0.10 (2008-02-01)
-------------------
-
-- Initial release
Copied: z3ext.product/tags/1.3.0/CHANGES.txt (from rev 93236, z3ext.product/trunk/CHANGES.txt)
===================================================================
--- z3ext.product/tags/1.3.0/CHANGES.txt (rev 0)
+++ z3ext.product/tags/1.3.0/CHANGES.txt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,97 @@
+=======
+CHANGES
+=======
+
+1.3.0 (2008-11-21)
+------------------
+
+- Install product registry after base registries
+
+- Removed product extension system
+
+
+1.2.2 (2008-10-28)
+------------------
+
+- Added translations: nl, ru
+
+
+1.2.1 (2008-09-30)
+------------------
+
+- Fixed bug with enclosed sites.
+
+
+1.2.0 (2008-09-04)
+------------------
+
+- Added product dependencies (require attribute)
+
+
+1.1.2 (2008-08-13)
+------------------
+
+- Calculate installed status
+
+
+1.1.0 (2008-08-05)
+------------------
+
+- Implemented product management for enclosed site objects
+
+
+1.0.2 (2008-05-26)
+------------------
+
+- During product instalation, first install CA registry, then call update
+
+
+1.0.1 (2008-05-15)
+------------------
+
+- Compatibility with z3ext.controlpanel >= 1.2.3
+
+
+1.0.0 (2008-03-26)
+------------------
+
+- Tests added
+
+- Code moved to svn.zope.org
+
+
+0.11.1 (2008-03-04)
+-------------------
+
+- Added 'broken' base registry in case product not available.
+
+
+0.11 (2008-02-28)
+-----------------
+
+- Use z3c.baseregistry
+
+- Use z3c.autoinclude
+
+- Create components registry for each product.
+ now it's possible to use <registerIn registry="z3ext.product.productName'/>
+ for registering product adapters and utulities.
+
+
+0.10.2 (2008-02-18)
+------------------
+
+- Don't show 'Products Management' configlet
+ if there are no installable products
+
+
+0.10.1 (2008-02-01)
+------------------
+
+- Removed `grant` directives
+
+
+0.10 (2008-02-01)
+------------------
+
+- Initial release
Deleted: z3ext.product/tags/1.3.0/setup.py
===================================================================
--- z3ext.product/trunk/setup.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/setup.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,77 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2008 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Setup for z3ext.product package
-
-$Id: setup.py 1842 2008-03-25 16:41:22Z fafhrd91 $
-"""
-import sys, os
-from setuptools import setup, find_packages
-
-def read(*rnames):
- return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-
-version = '1.2.3dev'
-
-
-setup(name='z3ext.product',
- version=version,
- description="Implementation of product (add-on) concept.",
- long_description=(
- 'Detailed Documentation\n' +
- '======================\n'
- + '\n\n' +
- read('src', 'z3ext', 'product', 'README.txt')
- + '\n\n' +
- read('CHANGES.txt')
- ),
- classifiers=[
- 'Development Status :: 5 - Production/Stable',
- 'Environment :: Web Environment',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: Zope Public License',
- 'Programming Language :: Python',
- 'Natural Language :: English',
- 'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- 'Framework :: Zope3'],
- author='Nikolay Kim',
- author_email='fafhrd91 at gmail.com',
- url='http://z3ext.net/',
- license='ZPL 2.1',
- packages=find_packages('src'),
- package_dir = {'':'src'},
- namespace_packages=['z3ext'],
- install_requires = ['setuptools',
- 'ZODB3',
- 'zope.schema',
- 'zope.component',
- 'zope.interface',
- 'zope.security',
- 'zope.i18n',
- 'zope.i18nmessageid',
- 'zope.lifecycleevent',
- 'zope.configuration',
- 'zope.app.component',
- 'z3c.autoinclude',
- 'z3c.baseregistry',
- 'z3ext.layout',
- 'z3ext.controlpanel',
- 'z3ext.statusmessage',
- ],
- extras_require = dict(test=['zope.app.testing',
- 'zope.testing',
- ]),
- include_package_data = True,
- zip_safe = False
- )
Copied: z3ext.product/tags/1.3.0/setup.py (from rev 93236, z3ext.product/trunk/setup.py)
===================================================================
--- z3ext.product/tags/1.3.0/setup.py (rev 0)
+++ z3ext.product/tags/1.3.0/setup.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,78 @@
+##############################################################################
+#
+# Copyright (c) 2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Setup for z3ext.product package
+
+$Id: setup.py 1842 2008-03-25 16:41:22Z fafhrd91 $
+"""
+import sys, os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+ return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+version = '1.3.0'
+
+
+setup(name='z3ext.product',
+ version=version,
+ description="Implementation of product (add-on) concept.",
+ long_description=(
+ 'Detailed Documentation\n' +
+ '======================\n'
+ + '\n\n' +
+ read('src', 'z3ext', 'product', 'README.txt')
+ + '\n\n' +
+ read('CHANGES.txt')
+ ),
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Web Environment',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Zope Public License',
+ 'Programming Language :: Python',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ 'Topic :: Internet :: WWW/HTTP',
+ 'Framework :: Zope3'],
+ author='Nikolay Kim',
+ author_email='fafhrd91 at gmail.com',
+ url='http://z3ext.net/',
+ license='ZPL 2.1',
+ packages=find_packages('src'),
+ package_dir = {'':'src'},
+ namespace_packages=['z3ext'],
+ install_requires = ['setuptools',
+ 'ZODB3',
+ 'zope.schema',
+ 'zope.component',
+ 'zope.interface',
+ 'zope.security',
+ 'zope.i18n',
+ 'zope.i18nmessageid',
+ 'zope.lifecycleevent',
+ 'zope.configuration',
+ 'zope.app.component',
+ 'z3c.autoinclude',
+ 'z3c.baseregistry',
+ 'z3c.configurator',
+ 'z3ext.layout',
+ 'z3ext.controlpanel',
+ 'z3ext.statusmessage',
+ ],
+ extras_require = dict(test=['zope.app.testing',
+ 'zope.testing',
+ ]),
+ include_package_data = True,
+ zip_safe = False
+ )
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/README.txt
===================================================================
--- z3ext.product/trunk/src/z3ext/product/README.txt 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/README.txt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,329 +0,0 @@
-=================
-Products (Add-on)
-=================
-
-Products system based on z3c.baseregistry package. This package
-simplify creating and managing registries.
-
-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>""")
-
- >>> from zope import component, interface
- >>> from z3ext.controlpanel.interfaces import IConfiglet
-
- >>> installer = component.getUtility(IConfiglet, 'product')
- >>> installer.keys()
- ()
-
- >>> installer.isAvailable()
- False
-
- >>> from zope import schema, interface
-
- >>> class IMyProduct(interface.Interface):
- ... """ Basic product """
- ...
- ... email = schema.TextLine(
- ... title=u"E-mail Address",
- ... description=u"E-mail Address used to send notifications")
-
- >>> 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)
-
-After registration we can get product declaration by it's schema.
-
- >>> from z3ext.product.interfaces import IProduct
-
- >>> product = component.getUtility(IMyProduct)
- >>> product
- <z3ext.controlpanel.configlettype.Configlet<product.my-product> ...>
-
- >>> product.__title__
- u'My product'
-
- >>> IMyProduct.providedBy(product)
- True
-
-Or we can get product by it's name
-
- >>> component.getUtility(IProduct, 'my-product') is product
- True
-
-But product is also is configlet, configlet name is 'product.' prefix
-and product name
-
- >>> configlet = component.getUtility(IConfiglet, 'product.my-product')
- >>> configlet
- <z3ext.controlpanel.configlettype.Configlet<product.my-product> ...>
-
- >>> configlet is product
- True
-
-
-Product manipulation
---------------------
-
-Instalation status
-
- >>> product.isInstalled()
- False
-
-or
-
- >>> product.__installed__
- False
-
-Instalation
-
- >>> product.install()
- >>> product.__installed__
- True
-
- >>> product.install()
- Traceback (most recent call last):
- ...
- ProductAlreadyInstalledError: Product already installed.
-
-
-Updateing product
-
- >>> product.update()
-
-uninstall
-
- >>> product.uninstall()
- >>> product.__installed__
- False
-
-we can't uninstall or update not installed product
-
- >>> product.uninstall()
- Traceback (most recent call last):
- ...
- ProductNotInstalledError: Product is not installed.
-
- >>> product.update()
- Traceback (most recent call last):
- ...
- ProductNotInstalledError: Product is not installed.
-
-
-Product extension
------------------
-
-We can create product extension
-
- >>> class IMyProductExtension(interface.Interface):
- ... """Basic User Preferences"""
-
- >>> context = xmlconfig.string('''
- ... <configure
- ... xmlns:z3ext="http://namespaces.zope.org/z3ext" i18n_domain="test">
- ...
- ... <z3ext:product
- ... name="my-product.ext"
- ... title="Product extension"
- ... schema="z3ext.product.README.IMyProductExtension" />
- ...
- ... </configure>''', context)
-
- >>> ext = component.getUtility(IMyProductExtension)
- >>> ext
- <z3ext.controlpanel.configlettype.Configlet<product.my-product.ext> ...>
-
- >>> ext.__installed__
- False
-
- >>> ext.isInstalled()
- False
-
- >>> component.getUtility(IProduct, 'my-product.ext') is ext
- True
-
- >>> component.getUtility(IConfiglet, 'product.my-product.ext') is ext
- True
-
-We have to install product first, then we can install product extension
-
- >>> ext.install()
- Traceback (most recent call last):
- ...
- ProductNotInstalledError: my-product
-
- >>> ext.update()
- Traceback (most recent call last):
- ...
- ProductNotInstalledError: my-product
-
- >>> product.install()
- >>> ext.install()
-
- >>> ext = component.getUtility(IMyProductExtension)
- >>> ext.__installed__
- True
-
- >>> ext.isInstalled()
- True
-
- >>> ext.update()
-
- >>> ext.uninstall()
- >>> ext.__installed__
- False
-
-If we uninstall product, extension will uninstall also
-
- >>> ext.install()
- >>> product.uninstall()
- >>> ext.__installed__
- False
-
- >>> product.listExtensions()
- [u'ext']
-
-
-Product dependencies
---------------------
-Product can depends on other products.
-
- >>> class IMyProduct2(interface.Interface):
- ... """ Product 2 """
- ...
- ... email = schema.TextLine(
- ... title=u"E-mail Address",
- ... description=u"E-mail Address used to send notifications")
-
- >>> context = xmlconfig.string('''
- ... <configure
- ... xmlns:z3ext="http://namespaces.zope.org/z3ext" i18n_domain="test">
- ...
- ... <z3ext:product
- ... name="my-product2"
- ... title="My product2"
- ... require="my-product"
- ... schema="z3ext.product.README.IMyProduct2" />
- ...
- ... </configure>''', context)
-
-'my-product2' is depends on 'my-product'
-
- >>> product = component.getUtility(IMyProduct)
- >>> product.__installed__
- False
-
- >>> product2 = component.getUtility(IMyProduct2)
- >>> product2.__require__
- [u'my-product']
-
-Let's install my-product2
-
- >>> product2.install()
-
-Now both products are installed
-
- >>> product.__installed__
- True
-
- >>> product2.__installed__
- True
-
-But on uninstall required products stay intalled
-
- >>> product2.uninstall()
-
- >>> product.__installed__
- True
-
- >>> product.uninstall()
-
-
-Component registry
-------------------
-
-When we register product, system automaticly creates component registry
-
- >>> registry = z3ext.product.registries['my-product']
-
- >>> print registry
- Product: My product
-
- >>> repr(registry)
- '<Product: My product>'
-
- >>> component.interfaces.IComponents.providedBy(registry)
- True
-
-When we install product, product's component registry automaticly
-added to current site manager bases.
-
- >>> component.getSiteManager().__bases__
- (<BaseGlobalComponents base>,)
-
- >>> product.install()
-
- >>> component.getSiteManager().__bases__
- (<Product: My product>, <BaseGlobalComponents base>)
-
- >>> product.uninstall()
- >>> component.getSiteManager().__bases__
- (<BaseGlobalComponents base>,)
-
-With z3c.baseregistry it's possible to use <registerIn />
-directive. For example:
-
-<registerIn registry="z3ext.product.my-product>
- ... various declarations
-</registerIn>
-
-
-Product configlet
------------------
-
- >>> installer = component.getUtility(IConfiglet, 'product')
- >>> installer.keys()
- (u'my-product', u'my-product2')
-
- >>> installer.isAvailable()
- True
-
- >>> installer['my-product'] is product
- True
-
- >>> product.isAvailable()
- False
-
- >>> product.install()
- >>> product.isAvailable()
- True
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/README.txt (from rev 93236, z3ext.product/trunk/src/z3ext/product/README.txt)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/README.txt (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/README.txt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,255 @@
+=================
+Products (Add-on)
+=================
+
+Products system based on z3c.baseregistry package. This package
+simplify creating and managing registries.
+
+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>""")
+
+ >>> from zope import component, interface
+ >>> from z3ext.controlpanel.interfaces import IConfiglet
+
+ >>> installer = component.getUtility(IConfiglet, 'product')
+ >>> installer.keys()
+ ()
+
+ >>> installer.isAvailable()
+ False
+
+ >>> from zope import schema, interface
+
+ >>> class IMyProduct(interface.Interface):
+ ... """ Basic product """
+ ...
+ ... email = schema.TextLine(
+ ... title=u"E-mail Address",
+ ... description=u"E-mail Address used to send notifications")
+
+ >>> 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)
+
+After registration we can get product declaration by it's schema.
+
+ >>> from z3ext.product.interfaces import IProduct
+
+ >>> product = component.getUtility(IMyProduct)
+ >>> product
+ <z3ext.controlpanel.configlettype.Configlet<product.my-product> ...>
+
+ >>> product.__title__
+ u'My product'
+
+ >>> IMyProduct.providedBy(product)
+ True
+
+Or we can get product by it's name
+
+ >>> component.getUtility(IProduct, 'my-product') is product
+ True
+
+But product is also is configlet, configlet name is 'product.' prefix
+and product name
+
+ >>> configlet = component.getUtility(IConfiglet, 'product.my-product')
+ >>> configlet
+ <z3ext.controlpanel.configlettype.Configlet<product.my-product> ...>
+
+ >>> configlet is product
+ True
+
+
+Product manipulation
+--------------------
+
+Instalation status
+
+ >>> product.isInstalled()
+ False
+
+or
+
+ >>> product.__installed__
+ False
+
+Instalation
+
+ >>> product.install()
+ >>> product.__installed__
+ True
+
+ >>> product.install()
+ Traceback (most recent call last):
+ ...
+ ProductAlreadyInstalledError: Product already installed.
+
+
+Updateing product
+
+ >>> product.update()
+
+uninstall
+
+ >>> product.uninstall()
+ >>> product.__installed__
+ False
+
+we can't uninstall or update not installed product
+
+ >>> product.uninstall()
+ Traceback (most recent call last):
+ ...
+ ProductNotInstalledError: Product is not installed.
+
+ >>> product.update()
+ Traceback (most recent call last):
+ ...
+ ProductNotInstalledError: Product is not installed.
+
+
+Product dependencies
+--------------------
+Product can depends on other products.
+
+ >>> class IMyProduct2(interface.Interface):
+ ... """ Product 2 """
+ ...
+ ... email = schema.TextLine(
+ ... title=u"E-mail Address",
+ ... description=u"E-mail Address used to send notifications")
+
+ >>> context = xmlconfig.string('''
+ ... <configure
+ ... xmlns:z3ext="http://namespaces.zope.org/z3ext" i18n_domain="test">
+ ...
+ ... <z3ext:product
+ ... name="my-product2"
+ ... title="My product2"
+ ... require="my-product"
+ ... schema="z3ext.product.README.IMyProduct2" />
+ ...
+ ... </configure>''', context)
+
+'my-product2' is depends on 'my-product'
+
+ >>> product = component.getUtility(IMyProduct)
+ >>> product.__installed__
+ False
+
+ >>> product2 = component.getUtility(IMyProduct2)
+ >>> product2.__require__
+ [u'my-product']
+
+Let's install my-product2
+
+ >>> product2.install()
+
+Now both products are installed
+
+ >>> product.__installed__
+ True
+
+ >>> product2.__installed__
+ True
+
+But on uninstall required products stay intalled
+
+ >>> product2.uninstall()
+
+ >>> product.__installed__
+ True
+
+ >>> product.uninstall()
+
+
+Component registry
+------------------
+
+When we register product, system automaticly creates component registry
+
+ >>> registry = z3ext.product.registries['my-product']
+
+ >>> print registry
+ Product: My product
+
+ >>> repr(registry)
+ '<Product: My product>'
+
+ >>> component.interfaces.IComponents.providedBy(registry)
+ True
+
+When we install product, product's component registry automaticly
+added to current site manager bases.
+
+ >>> component.getSiteManager().__bases__
+ (<BaseGlobalComponents base>,)
+
+ >>> product.install()
+
+ >>> component.getSiteManager().__bases__
+ (<Product: My product>, <BaseGlobalComponents base>)
+
+ >>> product.uninstall()
+ >>> component.getSiteManager().__bases__
+ (<BaseGlobalComponents base>,)
+
+With z3c.baseregistry it's possible to use <registerIn />
+directive. For example:
+
+<registerIn registry="z3ext.product.my-product>
+ ... various declarations
+</registerIn>
+
+
+Product configlet
+-----------------
+
+ >>> installer = component.getUtility(IConfiglet, 'product')
+ >>> installer.keys()
+ (u'my-product', u'my-product2')
+
+ >>> installer.isAvailable()
+ True
+
+ >>> installer['my-product'] is product
+ True
+
+ >>> product.isAvailable()
+ False
+
+ >>> product.install()
+ >>> product.isAvailable()
+ True
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/__init__.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,5 +0,0 @@
-# This file is necessary to make this directory a package.
-
-registries = {}
-
-from z3ext.product.product import Product, ProductExtension
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/__init__.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/__init__.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,5 @@
+# This file is necessary to make this directory a package.
+
+registries = {}
+
+from z3ext.product.product import Product
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml
===================================================================
--- z3ext.product/trunk/src/z3ext/product/browser.zcml 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,40 +0,0 @@
-<configure
- xmlns="http://namespaces.zope.org/zope"
- xmlns:z3ext="http://namespaces.zope.org/z3ext"
- xmlns:browser="http://namespaces.zope.org/browser"
- i18n_domain="z3ext.product">
-
- <browser:icon
- name="zmi_icon"
- title="Product"
- for=".interfaces.IProduct"
- file="product_icon.gif" />
-
- <browser:icon
- name="zmi_icon"
- title="Products management"
- for=".interfaces.IProductInstaller"
- file="product_icon.gif" />
-
- <browser:icon
- name="zmi_icon"
- title="Product extension"
- for=".interfaces.IProductExtension"
- file="product_icon.gif" />
-
- <z3ext:pagelet
- name="index.html"
- for=".interfaces.IProductInstaller"
- template="view.pt"
- class=".view.InstallerView"
- permission="z3ext.ManageProducts" />
-
- <browser:menuItem
- for=".interfaces.IProductInstaller"
- menu="zmi_views"
- title="Products management"
- action="@@index.html"
- permission="z3ext.ManageProducts"
- order="1" />
-
-</configure>
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml (from rev 93236, z3ext.product/trunk/src/z3ext/product/browser.zcml)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/browser.zcml 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,34 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ xmlns:z3ext="http://namespaces.zope.org/z3ext"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="z3ext.product">
+
+ <browser:icon
+ name="zmi_icon"
+ title="Product"
+ for=".interfaces.IProduct"
+ file="product_icon.gif" />
+
+ <browser:icon
+ name="zmi_icon"
+ title="Products management"
+ for=".interfaces.IProductInstaller"
+ file="product_icon.gif" />
+
+ <z3ext:pagelet
+ name="index.html"
+ for=".interfaces.IProductInstaller"
+ template="view.pt"
+ class=".view.InstallerView"
+ permission="z3ext.ManageProducts" />
+
+ <browser:menuItem
+ for=".interfaces.IProductInstaller"
+ menu="zmi_views"
+ title="Products management"
+ action="@@index.html"
+ permission="z3ext.ManageProducts"
+ order="1" />
+
+</configure>
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/interfaces.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,124 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" z3ext.product interfaces
-
-$Id: interfaces.py 1843 2008-03-25 18:39:00Z fafhrd91 $
-"""
-from zope import schema, interface
-from zope.i18nmessageid import MessageFactory
-
-_ = MessageFactory('z3ext.product')
-
-
-class ProductError(Exception):
- """ base error class for product management """
-
-
-class ProductNotInstalledError(ProductError):
- """ """
-
-
-class ProductAlreadyInstalledError(ProductError):
- """ """
-
-
-class InvalidProduct(ProductError):
- """ """
-
-
-class ProductWarningError(ProductError):
- """ dependencies error """
-
-
-class RequiredProductNotFound(ProductError):
- """ """
-
-
-class IProduct(interface.Interface):
- """ product information """
-
- __product_name__ = schema.TextLine(
- title = u'Product name',
- required = True)
-
- __require__ = interface.Attribute(u'Require products.')
-
- __installed__ = interface.Attribute(u'Is product installed.')
-
- def install():
- """ install and configure product """
-
- def uninstall():
- """ uninstall product """
-
- def update():
- """ update product """
-
- def isInstalled():
- """ is product installed """
-
- def listExtensions():
- """ list IProductExtension for this product """
-
- def isUninstallable():
- """ is product uninstallable """
-
-
-class IProductExtension(interface.Interface):
- """ product extension """
-
-
-class IProductInstaller(interface.Interface):
- """ installer for external products """
-
-
-class IAbstractProductEvent(interface.Interface):
- """ base event interface """
-
- id = schema.TextLine(
- title = u'Product id',
- required = True)
-
- product = interface.Attribute('IProduct object')
-
-
-class IProductInstalledEvent(IAbstractProductEvent):
- """ new product installed """
-
-
-class IProductUninstalledEvent(IAbstractProductEvent):
- """ product uninstalled """
-
-
-class IProductUpdatedEvent(IAbstractProductEvent):
- """ product updated """
-
-
-class AbstractProductEvent(object):
-
- def __init__(self, id, product):
- self.id = id
- self.product = product
-
-
-class ProductInstalledEvent(AbstractProductEvent):
- interface.implements(IProductInstalledEvent)
-
-
-class ProductUninstalledEvent(AbstractProductEvent):
- interface.implements(IProductUninstalledEvent)
-
-
-class ProductUpdatedEvent(AbstractProductEvent):
- interface.implements(IProductUpdatedEvent)
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/interfaces.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/interfaces.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,117 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" z3ext.product interfaces
+
+$Id: interfaces.py 1843 2008-03-25 18:39:00Z fafhrd91 $
+"""
+from zope import schema, interface
+from zope.i18nmessageid import MessageFactory
+
+_ = MessageFactory('z3ext.product')
+
+
+class ProductError(Exception):
+ """ base error class for product management """
+
+
+class ProductNotInstalledError(ProductError):
+ """ """
+
+
+class ProductAlreadyInstalledError(ProductError):
+ """ """
+
+
+class InvalidProduct(ProductError):
+ """ """
+
+
+class ProductWarningError(ProductError):
+ """ dependencies error """
+
+
+class RequiredProductNotFound(ProductError):
+ """ """
+
+
+class IProduct(interface.Interface):
+ """ product information """
+
+ __product_name__ = schema.TextLine(
+ title = u'Product name',
+ required = True)
+
+ __require__ = interface.Attribute(u'Require products.')
+
+ __installed__ = interface.Attribute(u'Is product installed.')
+
+ def install():
+ """ install and configure product """
+
+ def uninstall():
+ """ uninstall product """
+
+ def update():
+ """ update product """
+
+ def isInstalled():
+ """ is product installed """
+
+ def isUninstallable():
+ """ is product uninstallable """
+
+
+class IProductInstaller(interface.Interface):
+ """ installer for external products """
+
+
+class IAbstractProductEvent(interface.Interface):
+ """ base event interface """
+
+ id = schema.TextLine(
+ title = u'Product id',
+ required = True)
+
+ product = interface.Attribute('IProduct object')
+
+
+class IProductInstalledEvent(IAbstractProductEvent):
+ """ new product installed """
+
+
+class IProductUninstalledEvent(IAbstractProductEvent):
+ """ product uninstalled """
+
+
+class IProductUpdatedEvent(IAbstractProductEvent):
+ """ product updated """
+
+
+class AbstractProductEvent(object):
+
+ def __init__(self, id, product):
+ self.id = id
+ self.product = product
+
+
+class ProductInstalledEvent(AbstractProductEvent):
+ interface.implements(IProductInstalledEvent)
+
+
+class ProductUninstalledEvent(AbstractProductEvent):
+ interface.implements(IProductUninstalledEvent)
+
+
+class ProductUpdatedEvent(AbstractProductEvent):
+ interface.implements(IProductUpdatedEvent)
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.mo
===================================================================
(Binary files differ)
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.mo (from rev 93236, z3ext.product/trunk/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.mo)
===================================================================
(Binary files differ)
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po
===================================================================
--- z3ext.product/trunk/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,121 +0,0 @@
-# #############################################################################
-#
-# Copyright (c) 2003-2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-# #############################################################################
-msgid ""
-msgstr ""
-"Project-Id-Version: Development/Unknown\n"
-"POT-Creation-Date: Thu Oct 23 12:08:54 2008\n"
-"PO-Revision-Date: 2008-10-23 10:18+0100\n"
-"Last-Translator: F. Kooman <fkooman at tuxed.net>\n"
-"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: zope/app/locales/extract.py\n"
-
-#: src/z3ext/product/browser.zcml:19
-msgid "Product extension"
-msgstr "Productuitbreiding"
-
-#: src/z3ext/product/browser.zcml:7
-msgid "Product"
-msgstr "Product"
-
-#: src/z3ext/product/configure.zcml:13
-msgid "This is the Add-on Products install section."
-msgstr "Dit is de product installatiemodule."
-
-#: src/z3ext/product/configure.zcml:13
-#: src/z3ext/product/browser.zcml:13
-#: src/z3ext/product/browser.zcml:32
-msgid "Products management"
-msgstr "Productbeheer"
-
-#: src/z3ext/product/configure.zcml:9
-msgid "Manage products"
-msgstr "Beheer producten"
-
-#: src/z3ext/product/product.py:50
-#: src/z3ext/product/product.py:59
-msgid "Required product is not found."
-msgstr "Vereist product is niet gevonden."
-
-#: src/z3ext/product/product.py:70
-msgid "Product already installed."
-msgstr "Product is al geïnstalleerd."
-
-#: src/z3ext/product/product.py:88
-#: src/z3ext/product/product.py:103
-msgid "Product is not installed."
-msgstr "Product is niet geïnstalleerd."
-
-#: src/z3ext/product/registry.py:60
-msgid "Product: Broken product!!!"
-msgstr "Dit product is beschadigd!!!"
-
-#: src/z3ext/product/utils.py:33
-msgid "Can't create utility."
-msgstr "Kan utility niet aanmaken."
-
-#: src/z3ext/product/view.pt:3
-msgid "Installed Products"
-msgstr "Geïnstalleerde producten"
-
-#: src/z3ext/product/view.pt:38
-msgid "(Installed)"
-msgstr "(Geïnstalleerd)"
-
-#: src/z3ext/product/view.pt:43
-msgid "(Not installed)"
-msgstr "(Niet geïnstalleerd)"
-
-#: src/z3ext/product/view.pt:58
-msgid "Update"
-msgstr "Bijwerken"
-
-#: src/z3ext/product/view.pt:60
-msgid "Uninstall"
-msgstr "Verwijderen"
-
-#: src/z3ext/product/view.pt:68
-msgid "Products available for install"
-msgstr "Producten beschikbaar voor installatie"
-
-#: src/z3ext/product/view.pt:69
-msgid "This is the Add-on Products install section, you can add products in the lists below."
-msgstr "Dit is de product installatiemodule, u kunt producten selecteren in de onderstaande lijst."
-
-#: src/z3ext/product/view.pt:87
-msgid "Install"
-msgstr "Installeren"
-
-#: src/z3ext/product/view.py:102
-msgid "Select one or more products to update."
-msgstr "Selecteer één of meer producten om bij te werken."
-
-#: src/z3ext/product/view.py:117
-msgid "Select one or more products to uninstall."
-msgstr "Selecteer één of meer producten om te verwijderen."
-
-#: src/z3ext/product/view.py:124
-msgid "Selected products has been uninstalled."
-msgstr "Geselecteerde producten zijn verwijderd."
-
-#: src/z3ext/product/view.py:84
-msgid "Select one or more products to install."
-msgstr "Selecteer één of meer producten om te installeren."
-
-#: src/z3ext/product/view.py:91
-msgid "Selected products has been installed."
-msgstr "Geselecteerde producten zijn geïnstalleerd."
-
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po (from rev 93236, z3ext.product/trunk/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/nl/LC_MESSAGES/z3ext.product.po 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,123 @@
+# #############################################################################
+#
+# Copyright (c) 2003-2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+# #############################################################################
+msgid ""
+msgstr ""
+"Project-Id-Version: Development/Unknown\n"
+"POT-Creation-Date: Fri Nov 21 17:10:38 2008\n"
+"PO-Revision-Date: 2008-10-23 10:18+0100\n"
+"Last-Translator: F. Kooman <fkooman at tuxed.net>\n"
+"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+
+#: src/z3ext/product/browser.zcml:7
+msgid "Product"
+msgstr "Product"
+
+#: src/z3ext/product/configure.zcml:13
+msgid "This is the Add-on Products install section."
+msgstr "Dit is de product installatiemodule."
+
+#: src/z3ext/product/configure.zcml:13 src/z3ext/product/browser.zcml:13
+#: src/z3ext/product/browser.zcml:26
+msgid "Products management"
+msgstr "Productbeheer"
+
+#: src/z3ext/product/configure.zcml:9
+msgid "Manage products"
+msgstr "Beheer producten"
+
+#: src/z3ext/product/product.py:50 src/z3ext/product/product.py:59
+msgid "Required product is not found."
+msgstr "Vereist product is niet gevonden."
+
+#: src/z3ext/product/product.py:70
+msgid "Product already installed."
+msgstr "Product is al geïnstalleerd."
+
+#: src/z3ext/product/product.py:88 src/z3ext/product/product.py:99
+msgid "Product is not installed."
+msgstr "Product is niet geïnstalleerd."
+
+#: src/z3ext/product/registry.py:60
+msgid "Product: Broken product!!!"
+msgstr "Dit product is beschadigd!!!"
+
+#: src/z3ext/product/utils.py:33
+msgid "Can't create utility."
+msgstr "Kan utility niet aanmaken."
+
+#: src/z3ext/product/view.pt:27
+msgid "Update"
+msgstr "Bijwerken"
+
+#: src/z3ext/product/view.pt:29
+msgid "Uninstall"
+msgstr "Verwijderen"
+
+#: src/z3ext/product/view.pt:3
+msgid "Installed Products"
+msgstr "Geïnstalleerde producten"
+
+#: src/z3ext/product/view.pt:37
+msgid "Products available for install"
+msgstr "Producten beschikbaar voor installatie"
+
+#: src/z3ext/product/view.pt:38
+msgid ""
+"This is the Add-on Products install section, you can add products in the "
+"lists below."
+msgstr ""
+"Dit is de product installatiemodule, u kunt producten selecteren in de "
+"onderstaande lijst."
+
+#: src/z3ext/product/view.pt:56
+msgid "Install"
+msgstr "Installeren"
+
+#: src/z3ext/product/view.py:107
+msgid "Select one or more products to uninstall."
+msgstr "Selecteer één of meer producten om te verwijderen."
+
+#: src/z3ext/product/view.py:114
+msgid "Selected products has been uninstalled."
+msgstr "Geselecteerde producten zijn verwijderd."
+
+#: src/z3ext/product/view.py:72
+msgid "Select one or more products to install."
+msgstr "Selecteer één of meer producten om te installeren."
+
+#: src/z3ext/product/view.py:79
+msgid "Selected products has been installed."
+msgstr "Geselecteerde producten zijn geïnstalleerd."
+
+#: src/z3ext/product/view.py:91
+msgid "Select one or more products to update."
+msgstr "Selecteer één of meer producten om bij te werken."
+
+#: src/z3ext/product/view.py:98
+#, fuzzy
+msgid "Selected products has been updated."
+msgstr "Geselecteerde producten zijn verwijderd."
+
+#~ msgid "Product extension"
+#~ msgstr "Productuitbreiding"
+
+#~ msgid "(Installed)"
+#~ msgstr "(Geïnstalleerd)"
+
+#~ msgid "(Not installed)"
+#~ msgstr "(Niet geïnstalleerd)"
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.mo
===================================================================
(Binary files differ)
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.mo (from rev 93236, z3ext.product/trunk/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.mo)
===================================================================
(Binary files differ)
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po
===================================================================
--- z3ext.product/trunk/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,121 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003-2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-msgid ""
-msgstr ""
-"Project-Id-Version: Development/Unknown\n"
-"POT-Creation-Date: Thu Oct 23 12:08:54 2008\n"
-"PO-Revision-Date: 2008-10-28 11:28+0600\n"
-"Last-Translator: Nikolay Kim <fafhrd91 at gmail.com>\n"
-"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: zope/app/locales/extract.py\n"
-
-#: src/z3ext/product/browser.zcml:19
-msgid "Product extension"
-msgstr "РаÑÑиÑение пÑодÑкÑа"
-
-#: src/z3ext/product/browser.zcml:7
-msgid "Product"
-msgstr "ÐÑодÑкÑ"
-
-#: src/z3ext/product/configure.zcml:13
-msgid "This is the Add-on Products install section."
-msgstr "ÐÐ°Ð½ÐµÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми пÑодÑкÑами."
-
-#: src/z3ext/product/configure.zcml:13
-#: src/z3ext/product/browser.zcml:13
-#: src/z3ext/product/browser.zcml:32
-msgid "Products management"
-msgstr "УпÑавление пÑодÑкÑами"
-
-#: src/z3ext/product/configure.zcml:9
-msgid "Manage products"
-msgstr "УпÑавление пÑодÑкÑами"
-
-#: src/z3ext/product/product.py:50
-#: src/z3ext/product/product.py:59
-msgid "Required product is not found."
-msgstr "ÐеобÑ
одимÑй пÑодÑÐºÑ Ð½Ðµ найден."
-
-#: src/z3ext/product/product.py:70
-msgid "Product already installed."
-msgstr "ÐÑодÑÐºÑ Ñже ÑÑÑановлен."
-
-#: src/z3ext/product/product.py:88
-#: src/z3ext/product/product.py:103
-msgid "Product is not installed."
-msgstr "ÐÑодÑÐºÑ Ð½Ðµ ÑÑÑановлен."
-
-#: src/z3ext/product/registry.py:60
-msgid "Product: Broken product!!!"
-msgstr "ÐÑодÑкÑ: Ðе ÑабоÑаÑÑий пÑодÑкÑ!!!"
-
-#: src/z3ext/product/utils.py:33
-msgid "Can't create utility."
-msgstr "Ðевозможно ÑоздаÑÑ ÑÑилиÑÑ."
-
-#: src/z3ext/product/view.pt:3
-msgid "Installed Products"
-msgstr "УÑÑановленнÑе пÑодÑкÑÑ"
-
-#: src/z3ext/product/view.pt:38
-msgid "(Installed)"
-msgstr "(УÑÑановленнÑй)"
-
-#: src/z3ext/product/view.pt:43
-msgid "(Not installed)"
-msgstr "(Ðе ÑÑÑановленнÑй)"
-
-#: src/z3ext/product/view.pt:58
-msgid "Update"
-msgstr "ÐбновиÑÑ"
-
-#: src/z3ext/product/view.pt:60
-msgid "Uninstall"
-msgstr "ÐеинÑÑаллиÑоваÑÑ"
-
-#: src/z3ext/product/view.pt:68
-msgid "Products available for install"
-msgstr "ÐоÑÑÑпнÑе пÑодÑкÑÑ"
-
-#: src/z3ext/product/view.pt:69
-msgid "This is the Add-on Products install section, you can add products in the lists below."
-msgstr "ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿ÑодÑкÑÑ Ð¸Ð· поÑледÑÑÑего ÑпиÑка."
-
-#: src/z3ext/product/view.pt:87
-msgid "Install"
-msgstr "УÑÑановиÑÑ"
-
-#: src/z3ext/product/view.py:102
-msgid "Select one or more products to update."
-msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ."
-
-#: src/z3ext/product/view.py:117
-msgid "Select one or more products to uninstall."
-msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ Ð´ÐµÐ¸Ð½ÑÑаллиÑованиÑ.\""
-
-#: src/z3ext/product/view.py:124
-msgid "Selected products has been uninstalled."
-msgstr "ÐÑбÑаннÑе пÑодÑкÑÑ Ð±Ñли деинÑÑаллиÑованÑ."
-
-#: src/z3ext/product/view.py:84
-msgid "Select one or more products to install."
-msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ ÑÑÑановки."
-
-#: src/z3ext/product/view.py:91
-msgid "Selected products has been installed."
-msgstr "ÐÑбÑаннÑе пÑодÑкÑÑ Ð±Ñли ÑÑÑановленÑ."
-
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po (from rev 93236, z3ext.product/trunk/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/ru/LC_MESSAGES/z3ext.product.po 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,120 @@
+# #############################################################################
+#
+# Copyright (c) 2003-2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+# #############################################################################
+msgid ""
+msgstr ""
+"Project-Id-Version: Development/Unknown\n"
+"POT-Creation-Date: Fri Nov 21 17:10:38 2008\n"
+"PO-Revision-Date: 2008-11-21 17:12+0600\n"
+"Last-Translator: Nikolay Kim <fafhrd91 at gmail.com>\n"
+"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+
+#: src/z3ext/product/browser.zcml:7
+msgid "Product"
+msgstr "ÐÑодÑкÑ"
+
+#: src/z3ext/product/configure.zcml:13
+msgid "This is the Add-on Products install section."
+msgstr "ÐÐ°Ð½ÐµÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми пÑодÑкÑами."
+
+#: src/z3ext/product/configure.zcml:13 src/z3ext/product/browser.zcml:13
+#: src/z3ext/product/browser.zcml:26
+msgid "Products management"
+msgstr "УпÑавление пÑодÑкÑами"
+
+#: src/z3ext/product/configure.zcml:9
+msgid "Manage products"
+msgstr "УпÑавление пÑодÑкÑами"
+
+#: src/z3ext/product/product.py:50 src/z3ext/product/product.py:59
+msgid "Required product is not found."
+msgstr "ÐеобÑ
одимÑй пÑодÑÐºÑ Ð½Ðµ найден."
+
+#: src/z3ext/product/product.py:70
+msgid "Product already installed."
+msgstr "ÐÑодÑÐºÑ Ñже ÑÑÑановлен."
+
+#: src/z3ext/product/product.py:88 src/z3ext/product/product.py:99
+msgid "Product is not installed."
+msgstr "ÐÑодÑÐºÑ Ð½Ðµ ÑÑÑановлен."
+
+#: src/z3ext/product/registry.py:60
+msgid "Product: Broken product!!!"
+msgstr "ÐÑодÑкÑ: Ðе ÑабоÑаÑÑий пÑодÑкÑ!!!"
+
+#: src/z3ext/product/utils.py:33
+msgid "Can't create utility."
+msgstr "Ðевозможно ÑоздаÑÑ ÑÑилиÑÑ."
+
+#: src/z3ext/product/view.pt:27
+msgid "Update"
+msgstr "ÐбновиÑÑ"
+
+#: src/z3ext/product/view.pt:29
+msgid "Uninstall"
+msgstr "ÐеинÑÑаллиÑоваÑÑ"
+
+#: src/z3ext/product/view.pt:3
+msgid "Installed Products"
+msgstr "УÑÑановленнÑе пÑодÑкÑÑ"
+
+#: src/z3ext/product/view.pt:37
+msgid "Products available for install"
+msgstr "ÐоÑÑÑпнÑе пÑодÑкÑÑ"
+
+#: src/z3ext/product/view.pt:38
+msgid ""
+"This is the Add-on Products install section, you can add products in the "
+"lists below."
+msgstr "ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð¿ÑодÑкÑÑ Ð¸Ð· поÑледÑÑÑего ÑпиÑка."
+
+#: src/z3ext/product/view.pt:56
+msgid "Install"
+msgstr "УÑÑановиÑÑ"
+
+#: src/z3ext/product/view.py:107
+msgid "Select one or more products to uninstall."
+msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ Ð´ÐµÐ¸Ð½ÑÑаллиÑованиÑ.\""
+
+#: src/z3ext/product/view.py:114
+msgid "Selected products has been uninstalled."
+msgstr "ÐÑбÑаннÑе пÑодÑкÑÑ Ð±Ñли деинÑÑаллиÑованÑ."
+
+#: src/z3ext/product/view.py:72
+msgid "Select one or more products to install."
+msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ ÑÑÑановки."
+
+#: src/z3ext/product/view.py:79
+msgid "Selected products has been installed."
+msgstr "ÐÑбÑаннÑе пÑодÑкÑÑ Ð±Ñли ÑÑÑановленÑ."
+
+#: src/z3ext/product/view.py:91
+msgid "Select one or more products to update."
+msgstr "ÐÑбиÑиÑе один или более пÑодÑкÑов Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ."
+
+#: src/z3ext/product/view.py:98
+msgid "Selected products has been updated."
+msgstr "ÐÑбÑаннÑе пÑодÑкÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ."
+
+#~ msgid "Product extension"
+#~ msgstr "РаÑÑиÑение пÑодÑкÑа"
+
+#~ msgid "(Installed)"
+#~ msgstr "(УÑÑановленнÑй)"
+
+#~ msgid "(Not installed)"
+#~ msgstr "(Ðе ÑÑÑановленнÑй)"
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot
===================================================================
--- z3ext.product/trunk/src/z3ext/product/locales/z3ext.product.pot 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,121 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2003-2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-msgid ""
-msgstr ""
-"Project-Id-Version: Development/Unknown\n"
-"POT-Creation-Date: Tue Oct 28 11:28:30 2008\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
-"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: zope/app/locales/extract.py\n"
-
-#: src/z3ext/product/browser.zcml:19
-msgid "Product extension"
-msgstr ""
-
-#: src/z3ext/product/browser.zcml:7
-msgid "Product"
-msgstr ""
-
-#: src/z3ext/product/configure.zcml:13
-msgid "This is the Add-on Products install section."
-msgstr ""
-
-#: src/z3ext/product/configure.zcml:13
-#: src/z3ext/product/browser.zcml:13
-#: src/z3ext/product/browser.zcml:32
-msgid "Products management"
-msgstr ""
-
-#: src/z3ext/product/configure.zcml:9
-msgid "Manage products"
-msgstr ""
-
-#: src/z3ext/product/product.py:50
-#: src/z3ext/product/product.py:59
-msgid "Required product is not found."
-msgstr ""
-
-#: src/z3ext/product/product.py:70
-msgid "Product already installed."
-msgstr ""
-
-#: src/z3ext/product/product.py:88
-#: src/z3ext/product/product.py:103
-msgid "Product is not installed."
-msgstr ""
-
-#: src/z3ext/product/registry.py:60
-msgid "Product: Broken product!!!"
-msgstr ""
-
-#: src/z3ext/product/utils.py:33
-msgid "Can't create utility."
-msgstr ""
-
-#: src/z3ext/product/view.pt:3
-msgid "Installed Products"
-msgstr ""
-
-#: src/z3ext/product/view.pt:38
-msgid "(Installed)"
-msgstr ""
-
-#: src/z3ext/product/view.pt:43
-msgid "(Not installed)"
-msgstr ""
-
-#: src/z3ext/product/view.pt:58
-msgid "Update"
-msgstr ""
-
-#: src/z3ext/product/view.pt:60
-msgid "Uninstall"
-msgstr ""
-
-#: src/z3ext/product/view.pt:68
-msgid "Products available for install"
-msgstr ""
-
-#: src/z3ext/product/view.pt:69
-msgid "This is the Add-on Products install section, you can add products in the lists below."
-msgstr ""
-
-#: src/z3ext/product/view.pt:87
-msgid "Install"
-msgstr ""
-
-#: src/z3ext/product/view.py:102
-msgid "Select one or more products to update."
-msgstr ""
-
-#: src/z3ext/product/view.py:117
-msgid "Select one or more products to uninstall."
-msgstr ""
-
-#: src/z3ext/product/view.py:124
-msgid "Selected products has been uninstalled."
-msgstr ""
-
-#: src/z3ext/product/view.py:84
-msgid "Select one or more products to install."
-msgstr ""
-
-#: src/z3ext/product/view.py:91
-msgid "Selected products has been installed."
-msgstr ""
-
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot (from rev 93236, z3ext.product/trunk/src/z3ext/product/locales/z3ext.product.pot)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/locales/z3ext.product.pot 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,113 @@
+##############################################################################
+#
+# Copyright (c) 2003-2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+msgid ""
+msgstr ""
+"Project-Id-Version: Development/Unknown\n"
+"POT-Creation-Date: Fri Nov 21 17:10:38 2008\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Zope 3 Developers <zope3-dev at zope.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: zope/app/locales/extract.py\n"
+
+#: src/z3ext/product/browser.zcml:7
+msgid "Product"
+msgstr ""
+
+#: src/z3ext/product/configure.zcml:13
+msgid "This is the Add-on Products install section."
+msgstr ""
+
+#: src/z3ext/product/configure.zcml:13
+#: src/z3ext/product/browser.zcml:13
+#: src/z3ext/product/browser.zcml:26
+msgid "Products management"
+msgstr ""
+
+#: src/z3ext/product/configure.zcml:9
+msgid "Manage products"
+msgstr ""
+
+#: src/z3ext/product/product.py:50
+#: src/z3ext/product/product.py:59
+msgid "Required product is not found."
+msgstr ""
+
+#: src/z3ext/product/product.py:70
+msgid "Product already installed."
+msgstr ""
+
+#: src/z3ext/product/product.py:88
+#: src/z3ext/product/product.py:99
+msgid "Product is not installed."
+msgstr ""
+
+#: src/z3ext/product/registry.py:60
+msgid "Product: Broken product!!!"
+msgstr ""
+
+#: src/z3ext/product/utils.py:33
+msgid "Can't create utility."
+msgstr ""
+
+#: src/z3ext/product/view.pt:27
+msgid "Update"
+msgstr ""
+
+#: src/z3ext/product/view.pt:29
+msgid "Uninstall"
+msgstr ""
+
+#: src/z3ext/product/view.pt:3
+msgid "Installed Products"
+msgstr ""
+
+#: src/z3ext/product/view.pt:37
+msgid "Products available for install"
+msgstr ""
+
+#: src/z3ext/product/view.pt:38
+msgid "This is the Add-on Products install section, you can add products in the lists below."
+msgstr ""
+
+#: src/z3ext/product/view.pt:56
+msgid "Install"
+msgstr ""
+
+#: src/z3ext/product/view.py:107
+msgid "Select one or more products to uninstall."
+msgstr ""
+
+#: src/z3ext/product/view.py:114
+msgid "Selected products has been uninstalled."
+msgstr ""
+
+#: src/z3ext/product/view.py:72
+msgid "Select one or more products to install."
+msgstr ""
+
+#: src/z3ext/product/view.py:79
+msgid "Selected products has been installed."
+msgstr ""
+
+#: src/z3ext/product/view.py:91
+msgid "Select one or more products to update."
+msgstr ""
+
+#: src/z3ext/product/view.py:98
+msgid "Selected products has been updated."
+msgstr ""
+
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/product.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/product.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/product.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,172 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$Id: product.py 1843 2008-03-25 18:39:00Z fafhrd91 $
-"""
-from BTrees.OOBTree import OOBTree
-
-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
-
-import z3ext.product
-from z3ext.controlpanel.configlettype import ConfigletProperty
-
-from z3ext.product import interfaces
-from z3ext.product.interfaces import _, IProduct, IProductExtension
-
-
-class Product(object):
- """ base product class """
- interface.implements(IProduct)
-
- @property
- def __installed__(self):
- sm = getSiteManager()
-
- registry = getattr(z3ext.product, self.__product_name__)
- return registry in sm.__bases__
-
- def _checkRequiredInstall(self):
- for productId in self.__require__:
- product = queryUtility(IProduct, productId)
- if product is None:
- raise interfaces.RequiredProductNotFound(
- _('Required product is not found.'))
- if not product.__installed__:
- product.install()
-
- def _checkRequiredUpdate(self):
- for productId in self.__require__:
- product = queryUtility(IProduct, productId)
- if product is None:
- raise interfaces.RequiredProductNotFound(
- _('Required product is not found.'))
- if not product.__installed__:
- product.install()
- else:
- product.update()
-
- def install(self):
- self._checkRequiredInstall()
-
- if self.__installed__:
- raise interfaces.ProductAlreadyInstalledError(
- _('Product already installed.'))
-
- sm = getSiteManager()
-
- 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()
-
- def update(self):
- if not self.__installed__:
- raise interfaces.ProductNotInstalledError(
- _('Product is not installed.'))
-
- configure(self, {})
- event.notify(
- interfaces.ProductUpdatedEvent(self.__product_name__, self))
-
- self._checkRequiredUpdate()
-
- def uninstall(self):
- for name, ext in self.items():
- if IProductExtension.providedBy(ext) and ext.__installed__:
- ext.uninstall()
-
- if not self.__installed__:
- raise interfaces.ProductNotInstalledError(
- _('Product is not installed.'))
-
- sm = getSiteManager()
- registry = getattr(z3ext.product, self.__product_name__)
-
- bases = list(sm.__bases__)
- 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))
-
- def _checkInstalled(self, sm, registry, seen):
- if sm in seen:
- return False
- seen.add(sm)
-
- if registry in sm.__bases__:
- return True
-
- for reg in sm.__bases__:
- if self._checkInstalled(reg, registry, seen):
- return True
-
- return False
-
- def isInstalled(self):
- sm = getSiteManager()
- registry = getattr(z3ext.product, self.__product_name__)
- seen = set()
- return self._checkInstalled(sm, registry, seen)
-
- def listExtensions(self):
- exts = []
- for name, ext in self.items():
- if IProductExtension.providedBy(ext):
- exts.append(name)
-
- return exts
-
- def isUninstallable(self):
- sm = getSiteManager()
- registry = getattr(z3ext.product, self.__product_name__)
- return registry in sm.__bases__
-
-
-class ProductExtension(Product):
- interface.implements(IProductExtension)
-
- def install(self):
- if not self.__parent__.__installed__:
- raise interfaces.ProductNotInstalledError(
- self.__parent__.__product_name__)
- super(ProductExtension, self).install()
-
- def update(self):
- if not self.__parent__.__installed__:
- raise interfaces.ProductNotInstalledError(
- self.__parent__.__product_name__)
- super(ProductExtension, self).update()
-
- def isInstalled(self):
- if self.__parent__.__installed__:
- return self.__installed__
- else:
- return False
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/product.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/product.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/product.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/product.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,138 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id: product.py 1843 2008-03-25 18:39:00Z fafhrd91 $
+"""
+from BTrees.OOBTree import OOBTree
+
+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
+
+import z3ext.product
+from z3ext.controlpanel.configlettype import ConfigletProperty
+
+from z3ext.product import interfaces
+from z3ext.product.interfaces import _, IProduct
+
+
+class Product(object):
+ """ base product class """
+ interface.implements(IProduct)
+
+ @property
+ def __installed__(self):
+ sm = getSiteManager()
+
+ registry = getattr(z3ext.product, self.__product_name__)
+ return registry in sm.__bases__
+
+ def _checkRequiredInstall(self):
+ for productId in self.__require__:
+ product = queryUtility(IProduct, productId)
+ if product is None:
+ raise interfaces.RequiredProductNotFound(
+ _('Required product is not found.'))
+ if not product.__installed__:
+ product.install()
+
+ def _checkRequiredUpdate(self):
+ for productId in self.__require__:
+ product = queryUtility(IProduct, productId)
+ if product is None:
+ raise interfaces.RequiredProductNotFound(
+ _('Required product is not found.'))
+ if not product.__installed__:
+ product.install()
+ else:
+ product.update()
+
+ def install(self):
+ self._checkRequiredInstall()
+
+ if self.__installed__:
+ raise interfaces.ProductAlreadyInstalledError(
+ _('Product already installed.'))
+
+ sm = getSiteManager()
+
+ 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()
+
+ def update(self):
+ if not self.__installed__:
+ raise interfaces.ProductNotInstalledError(
+ _('Product is not installed.'))
+
+ configure(self, {})
+ event.notify(
+ interfaces.ProductUpdatedEvent(self.__product_name__, self))
+
+ self._checkRequiredUpdate()
+
+ def uninstall(self):
+ if not self.__installed__:
+ raise interfaces.ProductNotInstalledError(
+ _('Product is not installed.'))
+
+ sm = getSiteManager()
+ registry = getattr(z3ext.product, self.__product_name__)
+
+ bases = list(sm.__bases__)
+ 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))
+
+ def _checkInstalled(self, sm, registry, seen):
+ if sm in seen:
+ return False
+ seen.add(sm)
+
+ if registry in sm.__bases__:
+ return True
+
+ for reg in sm.__bases__:
+ if self._checkInstalled(reg, registry, seen):
+ return True
+
+ return False
+
+ def isInstalled(self):
+ sm = getSiteManager()
+ registry = getattr(z3ext.product, self.__product_name__)
+ seen = set()
+ return self._checkInstalled(sm, registry, seen)
+
+ def isUninstallable(self):
+ sm = getSiteManager()
+ registry = getattr(z3ext.product, self.__product_name__)
+ return registry in sm.__bases__
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/utils.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/utils.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/utils.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,97 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-
-$Id: utils.py 1839 2008-03-25 13:28:26Z fafhrd91 $
-"""
-from zope import interface, event, component
-from zope.component import queryUtility
-from zope.lifecycleevent import ObjectCreatedEvent
-from zope.security.proxy import removeSecurityProxy
-
-from zope.app.component.hooks import getSite
-from zope.app.component.site import SiteManagementFolder
-from zope.app.component.interfaces import ISite
-
-from z3ext.product.interfaces import _, IProduct, IProductExtension
-
-
-def registerUtility(id, factory, ifaces, container='system'):
- site = getSite()
- if not ISite.providedBy(site):
- raise RuntimeError(_("Can't create utility."))
-
- sm = component.getSiteManager()
-
- if isinstance(container, basestring):
- if container:
- if container not in sm:
- folder = SiteManagementFolder()
- event.notify(ObjectCreatedEvent(folder))
- sm[container] = folder
-
- container = sm[container]
- else:
- container = sm
- elif container is None:
- container = sm
-
- if id not in container:
- if callable(factory):
- utility = factory()
- else:
- utility = component.createObject(factory)
-
- event.notify(ObjectCreatedEvent(utility))
- removeSecurityProxy(container)[id] = utility
-
- for iface, name in ifaces:
- sm.registerUtility(utility, iface, name)
-
- return container[id]
-
-
-def unregisterUtility(id, ifaces, container='system'):
- site = getSite()
- sm = component.getSiteManager()
-
- if container not in sm:
- return
-
- container = sm[container]
-
- if id in container:
- utility = container[id]
-
- for iface, name in ifaces:
- sm.unregisterUtility(utility, iface, name)
-
- del container[id]
-
-
-class ProductTest(object):
-
- def __init__(self, product):
- self.product = product
-
- def __call__(self, *args, **kw):
- product = queryUtility(IProduct, self.product)
- if product is not None:
- return product.__installed__
-
- product = queryUtility(IProductExtension, self.product)
- if product is not None:
- return product.__installed__
-
- return False
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/utils.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/utils.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/utils.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/utils.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,93 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id: utils.py 1839 2008-03-25 13:28:26Z fafhrd91 $
+"""
+from zope import interface, event, component
+from zope.component import queryUtility
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.security.proxy import removeSecurityProxy
+
+from zope.app.component.hooks import getSite
+from zope.app.component.site import SiteManagementFolder
+from zope.app.component.interfaces import ISite
+
+from z3ext.product.interfaces import _, IProduct
+
+
+def registerUtility(id, factory, ifaces, container='system'):
+ site = getSite()
+ if not ISite.providedBy(site):
+ raise RuntimeError(_("Can't create utility."))
+
+ sm = component.getSiteManager()
+
+ if isinstance(container, basestring):
+ if container:
+ if container not in sm:
+ folder = SiteManagementFolder()
+ event.notify(ObjectCreatedEvent(folder))
+ sm[container] = folder
+
+ container = sm[container]
+ else:
+ container = sm
+ elif container is None:
+ container = sm
+
+ if id not in container:
+ if callable(factory):
+ utility = factory()
+ else:
+ utility = component.createObject(factory)
+
+ event.notify(ObjectCreatedEvent(utility))
+ removeSecurityProxy(container)[id] = utility
+
+ for iface, name in ifaces:
+ sm.registerUtility(utility, iface, name)
+
+ return container[id]
+
+
+def unregisterUtility(id, ifaces, container='system'):
+ site = getSite()
+ sm = component.getSiteManager()
+
+ if container not in sm:
+ return
+
+ container = sm[container]
+
+ if id in container:
+ utility = container[id]
+
+ for iface, name in ifaces:
+ sm.unregisterUtility(utility, iface, name)
+
+ del container[id]
+
+
+class ProductTest(object):
+
+ def __init__(self, product):
+ self.product = product
+
+ def __call__(self, *args, **kw):
+ product = queryUtility(IProduct, self.product)
+ if product is not None:
+ return product.__installed__
+
+ return False
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/view.pt
===================================================================
--- z3ext.product/trunk/src/z3ext/product/view.pt 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/view.pt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,92 +0,0 @@
-<div i18n:domain="z3ext.product" tal:define="data view/getProducts">
- <div class="z-topframe" tal:condition="data/installed">
- <h1 i18n:translate="">Installed Products</h1>
-
- <form tal:attributes="action request/URL" method="post">
- <ul class="z-listing">
- <li tal:repeat="product data/installed">
- <div class="z-listing-icon">
- <input class="noborder" type="checkbox" name="products:list"
- tal:attributes="value product/name"
- tal:condition="product/uninstallable" />
- <tal:block tal:condition="not:product/uninstallable">
- </tal:block>
- <img tal:replace="structure product/product/@@zmi_icon" />
- </div>
- <div class="z-listing-details">
- <a tal:omit-tag="not:product/configlet"
- tal:attributes="href string:${product/name}/">
- <span tal:content="product/title"></span>
- </a>
- <div tal:content="product/description"></div>
- </div>
- <div class="small"
- tal:define="name product/name;
- extensions python:view.getExtensions(product['product'])"
- tal:condition="extensions">
- <ul class="z-listing-listing">
- <li tal:repeat="product extensions">
- <div class="z-listing-icon">
- <img tal:replace="structure product/@@zmi_icon" />
- </div>
- <div class="z-listing-details">
- <span>
- <a tal:omit-tag="not:product/isAvailable"
- tal:attributes="href string:${product/__parent__/__name__}/${product/__name__}/">
- <span tal:content="product/__title__"></span>
- </a>
- <a tal:attributes="href
- string:${context/@@absolute_url}/?extension=${product/__id__}"
- tal:condition="product/__installed__" i18n:translate="">
- (Installed)
- </a>
- <a tal:attributes="href
- string:${context/@@absolute_url}/?extension=${product/__id__}"
- tal:condition="not:product/__installed__" i18n:translate="">
- (Not installed)
- </a>
- </span>
- <div tal:content="product/__description__"></div>
- </div>
- </li>
- </ul>
- </div>
- </li>
- </ul>
-
- <div class="z-form-controls" tal:condition="data/hasUninstallable">
- <input type="submit" class="z-form-button" name="update"
- value="Update" i18n:attributes="value" />
- <input type="submit" class="z-form-removebutton" name="uninstall"
- value="Uninstall" i18n:attributes="value" />
- </div>
- </form>
- </div>
-
- <div class="frame" tal:condition="data/notinstalled"
- tal:attributes="class python:not data['installed'] and 'topframe' or 'frame'">
- <h1 i18n:translate="">Products available for install</h1>
- <p i18n:translate="">This is the Add-on Products install section, you can add products in the lists below.</p>
-
- <form tal:attributes="action request/URL" method="post">
- <ul class="z-listing">
- <li tal:repeat="product data/notinstalled">
- <div class="z-listing-icon">
- <input class="noborder" type="checkbox"
- name="products:list" tal:attributes="value product/name" />
- <img tal:replace="structure product/product/@@zmi_icon" />
- </div>
- <div class="z-listing-details">
- <span tal:content="product/title"></span>
- <div tal:content="product/description"></div>
- </div>
- </li>
- </ul>
-
- <div class="z-form-controls">
- <input type="submit" class="context" name="install"
- value="Install" i18n:attributes="value" />
- </div>
- </form>
- </div>
-</div>
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/view.pt (from rev 93236, z3ext.product/trunk/src/z3ext/product/view.pt)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/view.pt (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/view.pt 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,61 @@
+<div i18n:domain="z3ext.product" tal:define="data view/getProducts">
+ <div class="z-topframe" tal:condition="data/installed">
+ <h1 i18n:translate="">Installed Products</h1>
+
+ <form tal:attributes="action request/URL" method="post">
+ <ul class="z-listing">
+ <li tal:repeat="product data/installed">
+ <div class="z-listing-icon">
+ <input class="noborder" type="checkbox" name="products:list"
+ tal:attributes="value product/name"
+ tal:condition="product/uninstallable" />
+ <tal:block tal:condition="not:product/uninstallable">
+ </tal:block>
+ <img tal:replace="structure product/product/@@zmi_icon" />
+ </div>
+ <div class="z-listing-details">
+ <a tal:omit-tag="not:product/configlet"
+ tal:attributes="href string:${product/name}/">
+ <span tal:content="product/title"></span>
+ </a>
+ <div tal:content="product/description"></div>
+ </div>
+ </li>
+ </ul>
+
+ <div class="z-form-controls" tal:condition="data/hasUninstallable">
+ <input type="submit" class="z-form-button" name="update"
+ value="Update" i18n:attributes="value" />
+ <input type="submit" class="z-form-removebutton" name="uninstall"
+ value="Uninstall" i18n:attributes="value" />
+ </div>
+ </form>
+ </div>
+
+ <div class="frame" tal:condition="data/notinstalled"
+ tal:attributes="class python:not data['installed'] and 'topframe' or 'frame'">
+ <h1 i18n:translate="">Products available for install</h1>
+ <p i18n:translate="">This is the Add-on Products install section, you can add products in the lists below.</p>
+
+ <form tal:attributes="action request/URL" method="post">
+ <ul class="z-listing">
+ <li tal:repeat="product data/notinstalled">
+ <div class="z-listing-icon">
+ <input class="noborder" type="checkbox"
+ name="availproducts:list" tal:attributes="value product/name" />
+ <img tal:replace="structure product/product/@@zmi_icon" />
+ </div>
+ <div class="z-listing-details">
+ <span tal:content="product/title"></span>
+ <div tal:content="product/description"></div>
+ </div>
+ </li>
+ </ul>
+
+ <div class="z-form-controls">
+ <input type="submit" class="z-form-button" name="install"
+ value="Install" i18n:attributes="value" />
+ </div>
+ </form>
+ </div>
+</div>
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/view.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/view.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/view.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,154 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" z3ext.product interfaces
-
-$Id: view.py 1839 2008-03-25 13:28:26Z fafhrd91 $
-"""
-import logging, sys
-from transaction import abort
-from zope.component import getUtility, queryUtility, getUtilitiesFor
-
-from z3ext.layout.pagelet import BrowserPagelet
-from z3ext.statusmessage.interfaces import IStatusMessage
-
-from z3ext.product.interfaces import _, IProductExtension
-from z3ext.product.interfaces import ProductWarningError
-
-def log_exc(msg=''):
- log = logging.getLogger(u'z3ext.product')
- log.log(logging.ERROR, msg, exc_info=sys.exc_info())
-
-
-class InstallerView(BrowserPagelet):
-
- def getProducts(self):
- context = self.context
-
- installed = []
- notinstalled = []
- hasUninstallable = False
-
- for name, product in context.items():
- info = {'name': name,
- 'product': product,
- 'title': product.__title__,
- 'description': product.__description__,
- 'uninstallable': product.isUninstallable()}
-
- if product.isInstalled():
- info['configlet'] = product.isAvailable()
- installed.append((product.__title__, info))
- if info['uninstallable']:
- hasUninstallable = True
- else:
- notinstalled.append((product.__title__, info))
-
- installed.sort()
- installed = [info for t, info in installed]
-
- notinstalled.sort()
- notinstalled = [info for t, info in notinstalled]
-
- return {'installed': installed, 'notinstalled': notinstalled,
- 'hasUninstallable': hasUninstallable}
-
- def getExtensions(self, product):
- extensions = []
-
- for name in product.listExtensions():
- ext = product.get(name)
- extensions.append((ext.__title__, ext))
- extensions.sort()
- return [ext for t, ext in extensions]
-
- def update(self, *args, **kw):
- request = self.request
- context = self.context
-
- service = IStatusMessage(request)
- products = request.get('products', ())
-
- if request.has_key('install'):
- if not products:
- service.add(_('Select one or more products to install.'), 'warning')
- else:
- try:
- for product_id in products:
- product = context.get(product_id)
- product.install()
-
- service.add(_('Selected products has been installed.'))
- except ProductWarningError, e:
- abort()
- service.add(unicode(e), 'warning')
- except Exception, e:
- abort()
- log_exc(str(e))
- service.add(e, 'error')
-
- elif request.has_key('update'):
- if not products:
- service.add(_('Select one or more products to update.'), 'warning')
- else:
- try:
- for product_id in products:
- product = context.get(product_id)
- product.update()
-
- service.add('Selected products has been updated.')
- except Exception, e:
- abort()
- log_exc(str(e))
- service.add(e, 'error')
-
- elif request.has_key('uninstall'):
- if not products:
- service.add(_('Select one or more products to uninstall.'), 'warning')
- else:
- try:
- for product_id in products:
- product = context.get(product_id)
- product.uninstall()
-
- service.add(_('Selected products has been uninstalled.'))
- except Exception, e:
- abort()
- log_exc(str(e))
- service.add(e, 'error')
-
- elif request.has_key('extension'):
- try:
- product = ''
- extension = request.get('extension', '')
- if '.' in extension:
- c, product, extension = extension.split('.', 2)
-
- product = context.get(product)
- if product is not None:
- extension = product.get(extension)
-
- if not IProductExtension.providedBy(extension):
- extension = None
-
- if extension is None:
- service.add("Can't fine extension.", 'error')
- else:
- if extension.__installed__:
- extension.uninstall()
- else:
- extension.install()
- except Exception, e:
- abort()
- log_exc(str(e))
- service.add(e, 'error')
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/view.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/view.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/view.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/view.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,118 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" z3ext.product interfaces
+
+$Id: view.py 1839 2008-03-25 13:28:26Z fafhrd91 $
+"""
+import logging, sys
+from transaction import abort
+from zope.component import getUtility, queryUtility, getUtilitiesFor
+from z3ext.statusmessage.interfaces import IStatusMessage
+
+from z3ext.product.interfaces import _, ProductWarningError
+
+def log_exc(msg=''):
+ log = logging.getLogger(u'z3ext.product')
+ log.log(logging.ERROR, msg, exc_info=sys.exc_info())
+
+
+class InstallerView(object):
+
+ def getProducts(self):
+ context = self.context
+
+ installed = []
+ notinstalled = []
+ hasUninstallable = False
+
+ for name, product in context.items():
+ info = {'name': name,
+ 'product': product,
+ 'title': product.__title__,
+ 'description': product.__description__,
+ 'uninstallable': product.isUninstallable()}
+
+ if product.isInstalled():
+ info['configlet'] = product.isAvailable()
+ installed.append((product.__title__, info))
+ if info['uninstallable']:
+ hasUninstallable = True
+ else:
+ notinstalled.append((product.__title__, info))
+
+ installed.sort()
+ installed = [info for t, info in installed]
+
+ notinstalled.sort()
+ notinstalled = [info for t, info in notinstalled]
+
+ return {'installed': installed, 'notinstalled': notinstalled,
+ 'hasUninstallable': hasUninstallable}
+
+ def update(self, *args, **kw):
+ request = self.request
+ context = self.context
+
+ service = IStatusMessage(request)
+
+ if request.has_key('install'):
+ products = request.get('availproducts', ())
+ if not products:
+ service.add(_('Select one or more products to install.'), 'warning')
+ else:
+ try:
+ for product_id in products:
+ product = context.get(product_id)
+ product.install()
+
+ service.add(_('Selected products has been installed.'))
+ except ProductWarningError, e:
+ abort()
+ service.add(unicode(e), 'warning')
+ except Exception, e:
+ abort()
+ log_exc(str(e))
+ service.add(e, 'error')
+
+ elif request.has_key('update'):
+ products = request.get('products', ())
+ if not products:
+ service.add(_('Select one or more products to update.'), 'warning')
+ else:
+ try:
+ for product_id in products:
+ product = context.get(product_id)
+ product.update()
+
+ service.add(_('Selected products has been updated.'))
+ except Exception, e:
+ abort()
+ log_exc(str(e))
+ service.add(e, 'error')
+
+ elif request.has_key('uninstall'):
+ products = request.get('products', ())
+ if not products:
+ service.add(_('Select one or more products to uninstall.'), 'warning')
+ else:
+ try:
+ for product_id in products:
+ product = context.get(product_id)
+ product.uninstall()
+
+ service.add(_('Selected products has been uninstalled.'))
+ except Exception, e:
+ abort()
+ log_exc(str(e))
+ service.add(e, 'error')
Deleted: z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/zcml.py 2008-11-21 00:35:08 UTC (rev 93215)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -1,105 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" z3ext:product directive
-
-$Id: interfaces.py 802 2007-12-28 11:25:55Z fafhrd91 $
-"""
-from zope import schema
-from zope.configuration import fields
-from zope.component.zcml import utility
-from zope.component import globalSiteManager
-from zope.component.interfaces import IComponents
-from zope.security.checker import CheckerPublic
-
-import z3ext.product
-from z3ext.controlpanel.zcml import IConfigletDirective, ConfigletDirective
-
-from interfaces import IProduct
-from registry import ProductRegistry
-from product import Product, ProductExtension
-
-
-class IProductDirective(IConfigletDirective):
-
- configurable = schema.Bool(
- title = u'Configurable',
- default = False,
- required = False)
-
- require = fields.Tokens(
- title = u'Require',
- value_type = schema.TextLine(),
- required = False)
-
-
-class ProductDirective(ConfigletDirective):
-
- def __init__(self, _context, name, schema, title,
- description='', class_=None, provides=(),
- permission='z3ext.ManageProducts', tests=(),
- configurable=False, require = ()):
-
- if '.' not in name:
- product_class = Product
- else:
- product_class = ProductExtension
-
- if class_ is None:
- class_ = product_class
- else:
- class_ = (class_, product_class)
-
- if configurable:
- test = ProductTest()
- tests = (test,) + tuple(tests)
- else:
- tests = (NotConfigurable,)
-
- # create component registry
- registry = ProductRegistry(name, title)
- z3ext.product.registries[name] = registry
- setattr(z3ext.product, name, registry)
- utility(_context, IComponents, registry, name=name)
-
- # register configlet
- productName = name
- name = 'product.' + name
-
- super(ProductDirective, self).__init__(
- _context, name, schema, title,
- description, class_, provides, permission, tests)
-
- self._class.__require__ = require
- self._class.__product_name__ = productName
-
- if configurable:
- test.product = self._configlet
-
- utility(_context, IProduct, self._configlet, name=productName)
-
- self.require(_context, permission, interface=(IProduct,))
- self.require(_context, CheckerPublic,
- attributes=('isInstalled', '__installed__'))
-
-
-class ProductTest(object):
-
- def __init__(self, product=None):
- self.product = product
-
- def __call__(self, *args, **kw):
- return self.product.isInstalled()
-
-def NotConfigurable(configlet):
- return False
Copied: z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py (from rev 93236, z3ext.product/trunk/src/z3ext/product/zcml.py)
===================================================================
--- z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py (rev 0)
+++ z3ext.product/tags/1.3.0/src/z3ext/product/zcml.py 2008-11-21 11:17:26 UTC (rev 93237)
@@ -0,0 +1,101 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" z3ext:product directive
+
+$Id: interfaces.py 802 2007-12-28 11:25:55Z fafhrd91 $
+"""
+from zope import schema
+from zope.configuration import fields
+from zope.component.zcml import utility
+from zope.component import globalSiteManager
+from zope.component.interfaces import IComponents
+from zope.security.checker import CheckerPublic
+
+import z3ext.product
+from z3ext.controlpanel.zcml import IConfigletDirective, ConfigletDirective
+
+from interfaces import IProduct
+from product import Product
+from registry import ProductRegistry
+
+
+class IProductDirective(IConfigletDirective):
+
+ configurable = schema.Bool(
+ title = u'Configurable',
+ default = False,
+ required = False)
+
+ require = fields.Tokens(
+ title = u'Require',
+ value_type = schema.TextLine(),
+ required = False)
+
+
+class ProductDirective(ConfigletDirective):
+
+ def __init__(self, _context, name, schema, title,
+ description='', class_=None, provides=(),
+ permission='z3ext.ManageProducts', tests=(),
+ configurable=False, require = ()):
+
+ product_class = Product
+ if class_ is None:
+ class_ = product_class
+ else:
+ class_ = (class_, product_class)
+
+ if configurable:
+ test = ProductTest()
+ tests = (test,) + tuple(tests)
+ else:
+ tests = (NotConfigurable,)
+
+ # create component registry
+ registry = ProductRegistry(name, title)
+ z3ext.product.registries[name] = registry
+ setattr(z3ext.product, name, registry)
+ utility(_context, IComponents, registry, name=name)
+
+ # register configlet
+ productName = name
+ name = 'product.' + name
+
+ super(ProductDirective, self).__init__(
+ _context, name, schema, title,
+ description, class_, provides, permission, tests)
+
+ self._class.__require__ = require
+ self._class.__product_name__ = productName
+
+ if configurable:
+ test.product = self._configlet
+
+ utility(_context, IProduct, self._configlet, name=productName)
+
+ self.require(_context, permission, interface=(IProduct,))
+ self.require(_context, CheckerPublic,
+ attributes=('isInstalled', '__installed__'))
+
+
+class ProductTest(object):
+
+ def __init__(self, product=None):
+ self.product = product
+
+ def __call__(self, *args, **kw):
+ return self.product.isInstalled()
+
+def NotConfigurable(configlet):
+ return False
More information about the Checkins
mailing list