[Zope-dev] schema upgrades with zope.formlib + FIX
Johannes Raggam
raggam-nl at adm.at
Tue Feb 15 08:37:07 EST 2011
... necessary, because when setting fields for an upgraded schema,
applyData tries to get the - inexistent - old value from the field to
compare it against the newvalue.
On Tue, 2011-02-15 at 14:34 +0100, Johannes Raggam wrote:
> well, for schema upgrades, also following patch seems to be necessary:
>
>
> >From c11064b8d8a7607d41071250f587f097f8c130a3 Mon Sep 17 00:00:00 2001
> From: Johannes Raggam <raggam-nl at adm.at>
> Date: Tue, 15 Feb 2011 14:29:56 +0100
> Subject: [PATCH 2/2] gracefully set newvalue for upgraded schemas, where
> oldvalue isn't available.
>
> ---
> zope/formlib/form.py | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/zope/formlib/form.py b/zope/formlib/form.py
> index 0d3ade3..ff10168 100755
> --- a/zope/formlib/form.py
> +++ b/zope/formlib/form.py
> @@ -532,7 +532,13 @@ def applyData(context, form_fields, data,
> adapters=None):
>
> name = form_field.__name__
> newvalue = data.get(name, form_field) # using form_field as
> marker
> - if (newvalue is not form_field) and (field.get(adapter) !=
> newvalue):
> + try:
> + oldvalue = field.get(adapter)
> + except AttributeError:
> + # value not available after schema upgrade
> + # make sure that oldvalue != newwalue
> + oldvalue = not bool(newvalue)
> + if (newvalue is not form_field) and (oldvalue != newvalue):
> descriptions.setdefault(interface,
> []).append(field.__name__)
> field.set(adapter, newvalue)
>
> --
> 1.7.1
>
>
> On Tue, 2011-02-15 at 13:25 +0100, Hanno Schlichting wrote:
> > On Tue, Feb 15, 2011 at 1:21 PM, Johannes Raggam <raggam-nl at adm.at> wrote:
> > > while - IMO - zope.schema throws that error justifiably, i think
> > > zope.formlib should handle it more gracefully in setUpEditWidgets. i
> > > think, this error comes with every schema upgrade for zope.formlib based
> > > edit-forms. so, what do you think of following patch?
> >
> > The usual approach is to add new attributes as class attributes to the
> > persistent object. Or write an actual database upgrade step, either
> > via something like zope.generations or with a GenericSetup upgrade
> > step.
> >
> > But for zope.formlib it make indeed make sense to be more lenient
> > here. So +0 on your patch.
> >
> > Hanno
>
--
johannes raggam / thet
python plone zope development
http://johannes.raggam.co.at/
mailto:johannes at raggam.co.at
http://bluedynamics.com/
--
johannes raggam / thet
python plone zope development
http://johannes.raggam.co.at/
mailto:johannes at raggam.co.at
http://bluedynamics.com/
More information about the Zope-Dev
mailing list