[Zope-dev] z3c.form: data manager forPersistentDict/PersistentMapping

Roger Ineichen dev at projekt01.ch
Sat Jul 11 19:46:21 EDT 2009


Hi Michael

> Betreff: [Zope-dev] z3c.form: data manager 
> forPersistentDict/PersistentMapping
> 
> Hello,
> 
> z3c.form.datamanager.DictionaryField is a data manager which 
> is registered for fields on a dict. In its __init__ it checks 
> whether the data object is an instance of dict. So this data 
> manager does neither work for UserDict nor 
> PersistentDict/PersistentMapping.
> I'd like to change this but there are two possibilities and 
> I'm not sure which is the best one:
> 
> 1.) Add a subclasses of DictionaryField which is registered 
> for UserDict and which checks whether the data object is an 
> instance of UserDict.
>      (PersistentDict and PersistentMapping are subclasses of 
> UserDict.)

I think this is the right solution because there are many
places in zope which do not work if a PeristentDict or 
PeristentList is given instead of a simple dict or list
type.

I'm not sure but I guess not even the zope.schema validation
implementation does this part correct for list or dict fields.

class List(AbstractCollection):
    """A field representing a List."""
    implements(IList)
    _type = list

class Dict(MinMaxLen, Iterable):
    """A field representing a Dict."""
    implements(IDict)
    _type = dict
 

But remember, using a PersistentDict or PersitentList
field is only needed if you like to add or remove single
values from the list or dict.

Normaly you should never use a widget for PersistentList
or PeristentDict objects because the widget whould
set an empty dict or list within the new selected items
as value. Which means a PersistentDict or PersistentList
whould get replaced by a simple python type.

I'm pretty sure there are many apps out there where someone
defined a PersitentList and the first time a sequence widget
was used for set some data the PersistentList was replaced
by a simple list typ. This should not be a problem till
you will call pop or remove from this list without to marke
the persistent class itself as changed. (_p_changed = True)

As I remember, Adam Groszer suggested that we should change
the widget implementation and support to reuse the previous
class as value base if a PersistentDict or PeristentList 
is used.

> 2.) Register DictionaryField for
> zope.interface.common.mapping.IMapping. This might have a 
> problem as neither UserDict nor 
> PersistentDict/PersistentMapping seem to provide this 
> interface. (Why?)

Also the dict or list do not provide zope interfaces.
I think that's fine and we should not patch python
at this level.

Regards
Roger Ineichen



More information about the Zope-Dev mailing list