[Zope-dev] Proposed interface: Restricted creation

Toby Dickenson tdickenson@geminidataloggers.com
Mon, 10 Jul 2000 11:24:35 +0100


On Wed, 05 Jul 2000 19:42:38 +0300, Itamar Shtull-Trauring
<itamar@maxnm.com> wrote:

>Shane Hathaway wrote:
>
>> The place where this is needed most (IMHO) is for ZClass factories.  So
>> there needs to be a way to create meta type filters through the Web.
>
>Yes, but in Python products too, where you have Items that should only go in
>specific ItemHolders.  This is very common.

I have a beautiful hack to do this for python products......


Firstly, this code goes in your product __init__

def register_xxxx_class(context,klass,**kwargs):
    meta_type = _register_product_specific_type(context,klass,kwargs)
    if meta_type:
        xxxx_meta_types_registry =
xxxx_meta_types_registry+(meta_type,)


def _register_product_specific_type(context,klass,kwargs):
    """Hijack and abuse the product registration system for our own
product-specific
    type. The mechanism for creating instances of this product is
established, but
    the type is not entered in the global availability list.
    """
    # Register the class
    old = Products.meta_types[:]
    apply(context.registerClass,(klass,),kwargs)
    new = Products.meta_types
    if new[:-1]==old:
        # A new meta_type was added to the end of the global list, as
expected.
        # Remove it, and return it
        Products.meta_types = old
        return new[-1]
    else:
        # Something unexpected happened. The safest thing to do is
leave it alone
        return None




Then, in your ObjectManager derived container, add

    def all_meta_types(self):
        return xxxx_meta_types_registry


Then use register_xxx_class(context,...... in place of
context.registerClass.....





Toby Dickenson
tdickenson@geminidataloggers.com