Note that Zope2.app() opens a new ZODB connection which you need to close at some point. I suggest something along the lines of:

        app = Zope2.app()
        try:
                products = app.Control_Panel.Products
                ...
        finally:
                app._p_jar.close()

I am also wondering if this code would break if a product was removed from the file system, but still had its persistent part hanging around in Control_Panel.Products.

Stefan


On 2. Mai 2006, at 22:59, Rocky Burt wrote:

Log message for revision 67869:
External methods can now live outside of Products based python packages.

Changed:
  U   Zope/trunk/lib/python/App/FactoryDispatcher.py

-=-
Modified: Zope/trunk/lib/python/App/FactoryDispatcher.py
===================================================================
--- Zope/trunk/lib/python/App/FactoryDispatcher.py 2006-05-02 20:57:53 UTC (rev 67868) +++ Zope/trunk/lib/python/App/FactoryDispatcher.py 2006-05-02 20:59:07 UTC (rev 67869)
@@ -13,12 +13,36 @@


 # Implement the manage_addProduct method of object managers
+import types
 import Acquisition, sys, Products
 from Globals import InitializeClass
 from AccessControl import ClassSecurityInfo
 from AccessControl.PermissionMapping import aqwrap
 from AccessControl.Owned import UnownableOwner
+import Zope2

+def _product_packages():
+    """Returns all product packages including the regularly defined
+    zope2 packages and those without the Products namespace package.
+    """
+
+    old_product_packages = {}
+    for x in dir(Products):
+        m = getattr(Products, x)
+        if isinstance(m, types.ModuleType):
+            old_product_packages[x] = m
+
+    packages = {}
+    products = Zope2.app().Control_Panel.Products
+    for product_id in products.objectIds():
+        product = products[product_id]
+        if hasattr(product, 'package_name'):
+            packages[product_id] = __import__(product.package_name)
+        elif old_product_packages.has_key(product_id):
+            packages[product_id] = old_product_packages[product_id]
+
+    return packages
+
 class ProductDispatcher(Acquisition.Implicit):
     " "
     # Allow access to factory dispatchers
@@ -32,7 +56,7 @@

         # Try to get a custom dispatcher from a Python product
         dispatcher_class=getattr(
-            getattr(Products, name, None),
+            _product_packages().get(name, None),
             '__FactoryDispatcher__',
             FactoryDispatcher)


_______________________________________________
Checkins mailing list
[EMAIL PROTECTED]
http://mail.zope.org/mailman/listinfo/checkins

--
Anything that happens, happens.  --Douglas Adams


_______________________________________________
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )

Reply via email to