[Zope-dev] Making a custom class addable to another class in product, but not to Zope

Leonardo Rochael Almeida leo at hiper.com.br
Wed Feb 25 21:56:54 EST 2004


Anoter option is to register a container_filter for the Thing class:

        def initialize(context):
            (...)
            context.registerClass(thingmodule.Thing,
                                  permission=thingmodule.ADD_THING_PERMISSION,
                                  constructors=(...),
                                  container_filter=thingmodule.containerFilter,
                                  icon="www/thing.png")

where containerFilter is a module global function that could be:

        def containerFilter(container):
            isinstance(container, containermodule.Container)

This way Zope doesn't show it as addable to anything on the management
interface except Containers. I don't think Zope checks the
container_filter if the constructors are invoked directly, eg. by a
PythonScript, but if you want to be strict, you can invoke the
containerFilter again on the constructors and raise an exception...

Cheers, Leo.

On Wed, 2004-02-25 at 17:52, Dieter Maurer wrote:
> Ian Beatty wrote at 2004-2-24 17:33 -0500:
> > ...
> >I've got
> >two classes in my product; let's call them Container and Thing. I want to
> >have Container addable to any old folder in the ZMI; that's no problem, I
> >just register it in my product's __init__.py file. I want Container to allow
> >instances of Thing to be added to it, and nothing else; that's also no
> >problem, using all_meta_types.
> >
> >However, I want Thing to be addable to Container, but not to any other
> >ObjectManager-based object.
> 
> You simply do not register "Thing".
> You define "constructors" (they are factories indeed, but
> Zope uses the term "constructors") for "Thing" on "Container",
> among them the "construtor" for the action you used
> in "all_meta_types".
> 
> Your "all_meta_types" will return something like:
> 
> (
>       {
>       'name' : 'Thing',
>       'action': 'Thing_add',
>       'permission': ManagePortal,
>       },
>       )
> 
> Note, there is not "manage_addProduct" in the action...
-- 
Leonardo Rochael Almeida <leo at hiper.com.br>



More information about the Zope-Dev mailing list