[Zope3-Users] Dynamic interfaces ?

David Pratt fairwinds at eastlink.ca
Mon Mar 10 12:12:02 EDT 2008


Yes, this is interesting, thank you for sharing this. I had done some 
things with xml schemas as zope schemas a while back and had also seen 
other work in this area.

Regards,
David


Jim Washington wrote:
> Thierry Florac wrote:
>> Hi,
>>
>> I'm looking for a way to handle what I've called "dynamic interfaces".
>> My problem is quite simple : I have an application where an
>> administrator can define "content types" ; for each content type, a set
>> of common predefined attributes are used, but the administrator can
>> define for each content type a set of custom attributes, each attribute
>> being defined by a name, a datatype (text, textline, date, boolean...)
>> and eventually a list of references values (for choices) ; definition of
>> these custom attributes is persistent and stored in the ZODB.
>> When creating data, contributor can select the data type, according to
>> which the matching set of attributes will be available in forms.
>>
>> The main point is probably that I'd like to use z3c.form package "as
>> usual", and so integrate this attributes management into Zope3
>> interfaces machinery... ; I suppose I should need a king of "interface
>> factory", but couldn't find any link about that.
>>
>> Thanks for any help,
>>
>>   Thierry Florac
>>   
> Hi, Thierry
> 
> I was experimenting with dynamic interfaces a while back, and this is 
> where I ended up.
> 
> Theoretically, Interfaces are just python class objects, not importantly 
> different than any others.
> 
> You just need to create a python class dynamically:
> 
> import new
> from zope.interface import Interface
> 
> dyn_iface = new.classobj(name,(Interface,),definitions)
> 
> where
> 
> name is a string, the name of your interface class
> Interface is zope.interface.Interface or a descendent
> definitions is a dict of class members 
> {'__doc__':docstring,'name':Schema,'name2':Schema2}
> 
> so,
> 
> if your class could be defined in an interfaces file as
> 
> 
> class IMyClass(Interface):
>    """IMyClass interface"""
>    yourName=TextLine(title=u'Your name',required=True)
> 
> 
> you can dynamically create it like this:
> 
> 
> import new
> from zope.interface import Interface
> import zope.schema
> 
> definitions = {}
> # __doc__ needs to be there; empty string is fine
> definitions['__doc__'] = 'IMyClass Interface'
> definitions['yourName'] = zope.schema.TextLine(title=u'Your 
> name',required=True)
> 
> iface_name=u'IMyClass'
> 
> myiface = new.classobj(iface_name.encode('utf-8'),(Interface,),definitions)
> 
> 
> At this point, myiface should be usable as if generated in an interfaces 
> file.
> 
> According to the python docs, you need to be careful when using "new", 
> so appropriate caution is advised. 
> http://docs.python.org/lib/module-new.html
> 
> 
> HTH,
> 
> - Jim Washington
> 
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
> 


More information about the Zope3-users mailing list