[Zope3-Users] Dynamic interfaces ?
Jim Washington
jwashin at vt.edu
Mon Mar 10 10:10:26 EDT 2008
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
More information about the Zope3-users
mailing list