[Zope-dev] Re: [Checkins] SVN: Zope/trunk/lib/python/App/FactoryDispatcher.py External methods can now live outside of Products based python packages.

Stefan H. Holek stefan at epy.co.at
Thu May 4 04:43:53 EDT 2006


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
> Checkins at zope.org
> http://mail.zope.org/mailman/listinfo/checkins

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




More information about the Zope-Dev mailing list