[Checkins] SVN: z3ext.product/trunk/ Added product dependencies (required attribute)

Nikolay Kim fafhrd at datacom.kz
Tue Sep 2 08:33:06 EDT 2008


Log message for revision 90697:
  Added product dependencies (required attribute)

Changed:
  U   z3ext.product/trunk/CHANGES.txt
  U   z3ext.product/trunk/src/z3ext/product/interfaces.py
  U   z3ext.product/trunk/src/z3ext/product/product.py
  U   z3ext.product/trunk/src/z3ext/product/zcml.py

-=-
Modified: z3ext.product/trunk/CHANGES.txt
===================================================================
--- z3ext.product/trunk/CHANGES.txt	2008-09-02 12:29:54 UTC (rev 90696)
+++ z3ext.product/trunk/CHANGES.txt	2008-09-02 12:33:06 UTC (rev 90697)
@@ -2,6 +2,12 @@
 CHANGES
 =======
 
+1.2.0 (2008-??-??)
+------------------
+
+- Added product dependencies (required attribute)
+
+
 1.1.2 (2008-08-13)
 ------------------
 

Modified: z3ext.product/trunk/src/z3ext/product/interfaces.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/interfaces.py	2008-09-02 12:29:54 UTC (rev 90696)
+++ z3ext.product/trunk/src/z3ext/product/interfaces.py	2008-09-02 12:33:06 UTC (rev 90697)
@@ -41,6 +41,10 @@
     """ dependencies error """
 
 
+class RequiredProductNotFound(ProductError):
+    """ """
+
+
 class IProduct(interface.Interface):
     """ product information """
 
@@ -48,6 +52,8 @@
         title = u'Product name',
         required = True)
 
+    __required__ = interface.Attribute(u'Required products.')
+
     __installed__ = interface.Attribute(u'Is product installed.')
 
     def install():

Modified: z3ext.product/trunk/src/z3ext/product/product.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/product.py	2008-09-02 12:29:54 UTC (rev 90696)
+++ z3ext.product/trunk/src/z3ext/product/product.py	2008-09-02 12:33:06 UTC (rev 90697)
@@ -41,7 +41,29 @@
         registry = getattr(z3ext.product, self.__product_name__)
         return registry in sm.__bases__
 
+    def _checkRequiredInstall(self):
+        for productId in self.__required__:
+            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.__required__:
+            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.'))
@@ -64,6 +86,8 @@
         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__:

Modified: z3ext.product/trunk/src/z3ext/product/zcml.py
===================================================================
--- z3ext.product/trunk/src/z3ext/product/zcml.py	2008-09-02 12:29:54 UTC (rev 90696)
+++ z3ext.product/trunk/src/z3ext/product/zcml.py	2008-09-02 12:33:06 UTC (rev 90697)
@@ -37,12 +37,18 @@
         default = False,
         required = False)
 
+    required = fields.Tokens(
+        title = u'Required',
+        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):
+                 permission='z3ext.ManageProducts', tests=(),
+                 configurable=False, required = ()):
 
         if '.' not in name:
             product_class = Product
@@ -74,6 +80,7 @@
             _context, name, schema, title,
             description, class_, provides, permission, tests)
 
+        self._class.__required__ = required
         self._class.__product_name__ = productName
 
         if configurable:



More information about the Checkins mailing list