[Zope3-Users] Design question (object or interface for category implementation?)

Christophe Combelles ccomb at free.fr
Fri Mar 9 09:14:52 EST 2007


Christophe Combelles a écrit :
> Hi,
> 
> I'm playing again with the notion of categories of objects.
> 
> I have two main goals:
> ---------------------
> 1) I must let the user choose the category of an object added to the 
> zodb. For this, I must be able to retrieve the list of categories and 
> present them in a form field managed by a vocabulary (or in a different 
> manner).
> 2) I must have different behaviours for categorized objects:
> objects of different categories would have different views, different 
> addMenuItems (if they are containers), etc.
> 
> the first requirement would tell me to define categories as objects, 
> while the second one would tell me to define them as interfaces.
> 
> The possible solutions I see:
> ----------------------------
> 
> 1) The simplest solution is to store the categories as text strings into 
> the annotations of the object. So categories actually are just tags.
> 
> 2) The second solution is to do the same, but replace text strings with 
> category objects, that implement ICategory. And categories can be stored 
> separately in a category container, or in a registered utility that 
> gives the list of available categories. This is a bit better, but this 
> way I don't know how to easily let my categorized objects behave 
> differently according to their categories.
> 
> 3) The third solution is to define categories as interfaces extending 
> ICategory. I can retrieve the list of categories with ICategory.dependents
> But to present them in a form, I must have a pretty name for each 
> interface. Should I store them in a Tagged Value?
> 
> 4) The fourth solution I see, is to define an interface type, 
> ICategoryType, extending IInterface just like IContentType. Then my 
> categories would be interfaces whose type is ICategoryType. But with 
> IContentType, is there a way to retrieve the list of all available 
> content types?

I've finally mixed 3) and 4) :

I have defined ICompany(Interface), IClient(ICompany), IProvider(ICompany)
And I have an ICompanyType(IInterface) interface type
I've set the type of IClient and IProvider as ICompanyType in zcml.

ICompany has a "types" attribute, for which I've redefined __getattr__ and 
__setattr_:
__getattr__ retrieve the ICompanyType interfaces from the object
__setattr__ calls noLongerProvides then alsoProvides to change the interfaces.

then I have a Vocabulary which creates terms from all the interfaces whose type 
is ICompanyType, and I use this vocabulary with a list+choice field and a 
MultiCheckBoxWidget.

This way, the admin users can directly change the interfaces provided by company 
objects, so that the menu and UI can automatically adapt to it.

However, I wonder the following: if an interface that defines some attributes is 
first assigned to an object, then this attributes are written, then the 
interface is removed and replaced by another one (eg: client that becomes a 
provider), what will the first attributes become?

Christophe


BTW, there is a problem with custom_widget and MultiCheckBoxWidget: 
MultiCheckBoxWidget has to be wrapped in a custom widget to correctly set the 
number of arguments.



More information about the Zope3-users mailing list