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@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users