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