[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