plonegovbr/brasil.gov.agenda

WrongType: (None, <type 'tuple'>, 'subjects') e TypeError: 'NoneType' object is not iterable ao tentar editar uma agenda de após atualização de um brasil.gov.agenda 1.0rc2 para 1.1.2 (IDG 1.0.5 para 1.5.1)

idgserpro opened this issue · 0 comments

Esse erro só ocorre ao tentar manipular agendas antigas, criadas em releases anteriores de brasil.gov.agenda. Novas agendas não terão esse problema.

Como simular:

Monte um ambiente de brasil.gov.agenda 1.0rc2. Como essa é uma versão antiga, devem ser feitas as seguintes pinagens:

[buildout]
extends = 
    (...)
    https://raw.githubusercontent.com/plonegovbr/portalpadrao.release/master/1.0.5/versions.cfg

[versions]
plone.recipe.codeanalysis = 2.1
setuptools = 18.5
Products.Doormat = 0.7

Instale um Plone site, lembrando de marcar pra instalar suporte a dexterity, tipos conteúdo dexterity e o tipo agenda.

Adicione uma agenda sem adicionar nenhuma tag. Salve o objeto.

Atualize sua instância para a versão 1.1.2. Não se esqueça das pinagens:

[buildout]
extends = 
    (...)
    https://raw.githubusercontent.com/plonegovbr/portalpadrao.release/master/1.5.1/versions.cfg

eggs +=
    (...)
# Para evitar o erro "AttributeError: type object 'IDraftStorage' has no attribute 'iro'"
    plone.app.drafts

Rode os upgradeSteps do Plone. Ao tentar adicionar uma agenda diária na agenda (http://localhost:8080/Plone/agenda/++add++AgendaDiaria):

Traceback (innermost last):

Module ZPublisher.Publish, line 138, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 48, in call_object
Module plone.z3cform.layout, line 66, in __call__
Module plone.z3cform.layout, line 50, in update
Module plone.dexterity.browser.add, line 118, in update
Module plone.z3cform.fieldsets.extensible, line 59, in update
Module plone.z3cform.patch, line 30, in GroupForm_update
Module z3c.form.group, line 132, in update
Module z3c.form.form, line 136, in updateWidgets
Module plone.app.drafts.dexterity, line 80, in update
Module z3c.form.field, line 277, in update
Module z3c.form.browser.textarea, line 37, in update
Module z3c.form.browser.widget, line 171, in update
Module Products.CMFPlone.patches.z3c_form, line 46, in _wrapped
Module z3c.form.widget, line 115, in update
Module zope.schema._bootstrapfields, line 78, in __get__
Module zope.schema._bootstrapfields, line 182, in validate
Module zope.schema._field, line 475, in _validate
Module zope.schema._bootstrapfields, line 309, in _validate
Module zope.schema._bootstrapfields, line 248, in _validate
Module zope.schema._bootstrapfields, line 233, in _validate
Module zope.schema._bootstrapfields, line 209, in _validate - https://github.com/zopefoundation/zope.schema/blob/4.2.2/src/zope/schema/_bootstrapfields.py#L209 (anterior era em https://github.com/zopefoundation/zope.schema/blob/3.7.1/src/zope/schema/_bootstrapfields.py#L178)
WrongType: (None, <type 'tuple'>, 'subjects')

Ao tentar editar a Agenda (http://localhost:8080/Plone/agenda/edit):

Traceback (innermost last):

Module ZPublisher.Publish, line 138, in publish
Module ZPublisher.mapply, line 77, in mapply
Module ZPublisher.Publish, line 48, in call_object
Module plone.z3cform.layout, line 66, in __call__
Module plone.z3cform.layout, line 50, in update
Module plone.dexterity.browser.edit, line 64, in update
Module plone.z3cform.fieldsets.extensible, line 59, in update
Module plone.z3cform.patch, line 30, in GroupForm_update
Module z3c.form.group, line 132, in update
Module z3c.form.form, line 136, in updateWidgets
Module z3c.form.field, line 277, in update
Module z3c.form.browser.textarea, line 37, in update
Module z3c.form.browser.widget, line 171, in update
Module Products.CMFPlone.patches.z3c_form, line 46, in _wrapped
Module z3c.form.widget, line 132, in update
Module z3c.form.converter, line 337, in toWidgetValue - https://github.com/zopefoundation/z3c.form/blob/3.2.11/src/z3c/form/converter.py#L337 (anterior era https://github.com/zopefoundation/z3c.form/blob/3.1.1/src/z3c/form/converter.py#L43)
TypeError: 'NoneType' object is not iterable

Atribuindo () ao campo subjects que não foi preenchido na versão antiga com o uso de um script Python via linha de comando (ver fix_error.py.zip)
faz o erro desaparecer. Apesar disso, durante o teste para verificar se o campo "subjects" é None ou não de uma agenda onde esses campos não foram preenchidos, dá AttributeError, revisar essa peculiaridade.

Dessa forma, precisamos de um upgradeStep que percorra todas os objetos do tipo Agenda, AgendaDiaria e Compromisso pra alterar o valor do campo subjects de None para (). No commit 0baa28c#diff-cb3c64b3e2fb9fc73823cbd5a6fabacb foi estabelecido <default_value>()</default_value><missing_value>()</missing_value> para os tipos mas não foi feito um upgradeStep para percorrer o que já estava persistido no ZODB.

Usar como referência o que já foi mencionado e testado pelo @hvelarde, especialmente porque nesse caso teremos muitos objetos.