[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