Log message for revision 113926:
  Changed product install so it won't write persistent changes only to abort 
them. Instead we don't make any database changes in the first place.
  

Changed:
  U   Zope/trunk/doc/CHANGES.rst
  U   Zope/trunk/src/App/FactoryDispatcher.py
  U   Zope/trunk/src/App/Product.py
  U   Zope/trunk/src/App/ProductContext.py
  U   Zope/trunk/src/OFS/Application.py

-=-
Modified: Zope/trunk/doc/CHANGES.rst
===================================================================
--- Zope/trunk/doc/CHANGES.rst  2010-06-27 11:44:28 UTC (rev 113925)
+++ Zope/trunk/doc/CHANGES.rst  2010-06-27 12:44:22 UTC (rev 113926)
@@ -18,6 +18,11 @@
 Features Added
 ++++++++++++++
 
+- Changed product install so it won't write persistent changes only to abort
+  them. Instead we don't make any database changes in the first place.
+
+- Disabled persistent product installation in the default test configuration.
+
 - Directly extend and use the Zope Toolkit KGS release 1.0dev-r113891 from
   http://download.zope.org/zopetoolkit/index/.
 

Modified: Zope/trunk/src/App/FactoryDispatcher.py
===================================================================
--- Zope/trunk/src/App/FactoryDispatcher.py     2010-06-27 11:44:28 UTC (rev 
113925)
+++ Zope/trunk/src/App/FactoryDispatcher.py     2010-06-27 12:44:22 UTC (rev 
113926)
@@ -23,7 +23,9 @@
 from Acquisition import Acquired
 from Acquisition import aq_base
 from Acquisition import Implicit
+from ExtensionClass import Base
 
+
 def _product_packages():
     """Returns all product packages including the regularly defined
     zope2 packages and those without the Products namespace package.
@@ -41,7 +43,7 @@
     return packages
 
 
-class Product(object):
+class Product(Base):
     """Model a non-persistent product wrapper.
     """
 

Modified: Zope/trunk/src/App/Product.py
===================================================================
--- Zope/trunk/src/App/Product.py       2010-06-27 11:44:28 UTC (rev 113925)
+++ Zope/trunk/src/App/Product.py       2010-06-27 12:44:22 UTC (rev 113926)
@@ -36,8 +36,6 @@
 
 import os
 
-import transaction
-
 from AccessControl.class_init import InitializeClass
 from AccessControl.owner import UnownableOwner
 from AccessControl.SecurityInfo import ClassSecurityInfo
@@ -204,13 +202,16 @@
 
 
 def initializeProduct(productp, name, home, app):
-    # Initialize a levered product
+    # Initialize a persistent product
+    assert doInstall()
+
     import Globals  # to set data
-    products = app.Control_Panel.Products
     fver = ''
 
-    if hasattr(productp, '__import_error__'): ie=productp.__import_error__
-    else: ie=None
+    if hasattr(productp, '__import_error__'):
+        ie = productp.__import_error__
+    else:
+        ie = None
 
     # Retrieve version number from any suitable version.txt
     for fname in ('version.txt', 'VERSION.txt', 'VERSION.TXT'):
@@ -223,32 +224,33 @@
         except IOError:
             continue
 
-    old=None
+    old = None
+    products = app.Control_Panel.Products
     try:
-        if ihasattr(products,name):
+        if ihasattr(products, name):
             old=getattr(products, name)
             if ihasattr(old,'version') and old.version==fver:
                 if hasattr(old, 'import_error_') and \
                    old.import_error_==ie:
                     # Version hasn't changed. Don't reinitialize.
                     return old
-    except: pass
+    except:
+        pass
 
     f = fver and (" (%s)" % fver)
-    product=Product(name, 'Installed product %s%s' % (name,f))
+    product=Product(name, 'Installed product %s%s' % (name, f))
 
     if old is not None:
         app._manage_remove_product_meta_type(product)
         products._delObject(name)
         for id, v in old.objectItems():
-            try: product._setObject(id, v)
-            except: pass
+            try:
+                product._setObject(id, v)
+            except:
+                pass
 
     products._setObject(name, product)
-    product.icon='p_/InstalledProduct_icon'
-    product.version=fver
-    product.home=home
-    product.thisIsAnInstalledProduct=1
+    product.home = home
 
     if ie:
         product.import_error_=ie
@@ -277,12 +279,9 @@
             {'label':'Refresh', 'action':'manage_refresh',
              'help': ('OFSP','Product_Refresh.stx')},)
 
-    if not doInstall():
-        transaction.abort()
-        return product
-
     return product
 
+
 def ihasattr(o, name):
     return hasattr(o, name) and o.__dict__.has_key(name)
 

Modified: Zope/trunk/src/App/ProductContext.py
===================================================================
--- Zope/trunk/src/App/ProductContext.py        2010-06-27 11:44:28 UTC (rev 
113925)
+++ Zope/trunk/src/App/ProductContext.py        2010-06-27 12:44:22 UTC (rev 
113926)
@@ -24,7 +24,6 @@
 from AccessControl.PermissionRole import PermissionRole
 from App.Common import package_home
 from App.ImageFile import ImageFile
-from App.Product import doInstall
 from DateTime.DateTime import DateTime
 from HelpSys import APIHelpTopic
 from HelpSys import HelpTopic
@@ -50,14 +49,15 @@
 class ProductContext:
 
     def __init__(self, product, app, package):
-        self.__prod=product
-        self.__app=app
-        self.__pack=package
+        self.__prod = product
+        # app is None by default which signals disabled product installation
+        self.__app = app
+        self.__pack = package
 
     def registerClass(self, instance_class=None, meta_type='',
                       permission=None, constructors=(),
                       icon=None, permissions=None, legacy=(),
-                      visibility="Global",interfaces=_marker,
+                      visibility="Global", interfaces=_marker,
                       container_filter=None
         ):
         """Register a constructor
@@ -140,7 +140,7 @@
         else:
             default = ('Manager',)
 
-        pr=PermissionRole(permission,default)
+        pr = PermissionRole(permission,default)
         registerPermissions(((permission, (), default),))
         ############################################################
 
@@ -168,7 +168,7 @@
         else:
             name = initial.__name__
 
-        fd=getattr(pack, '__FactoryDispatcher__', None)
+        fd = getattr(pack, '__FactoryDispatcher__', None)
         if fd is None:
             class __FactoryDispatcher__(FactoryDispatcher):
                 "Factory Dispatcher for a Specific Product"
@@ -231,6 +231,8 @@
         """
         Returns the ProductHelp associated with the current Product.
         """
+        if self.__app is None:
+            return self.__prod.getProductHelp()
         return 
self.__prod.__of__(self.__app.Control_Panel.Products).getProductHelp()
 
     def registerHelpTopic(self, id, topic):
@@ -267,7 +269,7 @@
         .py              -- APIHelpTopic
         """
 
-        if not doInstall():
+        if not self.__app:
             return
 
         help=self.getProductHelp()

Modified: Zope/trunk/src/OFS/Application.py
===================================================================
--- Zope/trunk/src/OFS/Application.py   2010-06-27 11:44:28 UTC (rev 113925)
+++ Zope/trunk/src/OFS/Application.py   2010-06-27 12:44:22 UTC (rev 113926)
@@ -30,6 +30,7 @@
 from Acquisition import aq_base
 from App.ApplicationManager import ApplicationManager
 from App.config import getConfiguration
+from App import FactoryDispatcher
 from App.Product import doInstall
 from DateTime import DateTime
 from HelpSys.HelpSys import HelpSys
@@ -676,24 +677,26 @@
             # expected to implement a method named 'initialize' in
             # their __init__.py that takes the ProductContext as an
             # argument.
-            productObject = App.Product.initializeProduct(
-                product, product_name, package_dir, app)
-            context = ProductContext(productObject, app, product)
+            do_install = doInstall()
+            if do_install:
+                productObject = App.Product.initializeProduct(
+                    product, product_name, package_dir, app)
+                context = ProductContext(productObject, app, product)
+            else:
+                # avoid any persistent connection
+                productObject = FactoryDispatcher.Product(product_name)
+                context = ProductContext(productObject, None, product)
 
             # Look for an 'initialize' method in the product.
             initmethod = pgetattr(product, 'initialize', None)
             if initmethod is not None:
                 initmethod(context)
 
-            if not doInstall():
-                transaction.abort()
-            else:
+            if do_install:
                 transaction.get().note('Installed product ' + product_name)
                 transaction.commit()
 
-        except KeyboardInterrupt:
-            raise
-        except:
+        except Exception:
             if log_exc:
                 LOG.error('Couldn\'t install %s' % product_name,
                            exc_info=sys.exc_info())
@@ -706,23 +709,27 @@
     """Installs a Python package like a product."""
     from App.ProductContext import ProductContext
     try:
-        product = App.Product.initializeProduct(module,
-                                                module.__name__,
-                                                module.__path__[0],
-                                                app)
-        product.package_name = module.__name__
+        do_install = doInstall()
+        name = module.__name__
+        if do_install:
+            product = App.Product.initializeProduct(module,
+                                                    name,
+                                                    module.__path__[0],
+                                                    app)
+        else:
+            product = FactoryDispatcher.Product(name)
+            app = None
+
+        product.package_name = name
+
         if init_func is not None:
             newContext = ProductContext(product, app, module)
             init_func(newContext)
 
-        if not doInstall():
-            transaction.abort()
-        else:
+        if do_install:
             transaction.get().note('Installed package %s' % module.__name__)
             transaction.commit()
-    except KeyboardInterrupt:
-        raise
-    except:
+    except Exception:
         if log_exc:
             LOG.error("Couldn't install %s" % module.__name__,
                       exc_info=True)

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
https://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to