[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