https://dev.entrouvert.org/https://dev.entrouvert.org/favicon.ico?15861920342019-09-09T12:34:05ZRedmine Entr’ouvertw.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1902422019-09-09T12:34:05ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/37147">menu.csv</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37147/menu.csv">menu.csv</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37148">workflow-form-bo-within-datasource.wcs</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37148/workflow-form-bo-within-datasource.wcs">workflow-form-bo-within-datasource.wcs</a> ajouté</li></ul><p>En attendant d'avoir quelque chose de mieux borné, voici un workflow et un CSV qui mettent en évidence le bug.<br />Il faut configurer une requête 'choix' qui fitre le CSV sur l'id.<br />Le workflow peut être appelé depuis un formulaire vide.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1906032019-09-10T15:53:35ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>Voici un test qui permet de reproduire l'erreur.<br />Il reprend <code>test_field_live_select_content</code> afin de tester <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: permettre de faire varier le contenu d'un champ "liste" selon un autre champ de la page (Fermé)" href="https://dev.entrouvert.org/issues/27173">#27173</a> non plus sur le formulaire principale, mais sur un second formulaire affiché au cours du workflow.</p>
<pre>
def test_field_live_select_content_on_display_form(pub):
create_user(pub)
wf = Workflow(name='wf-title')
st1 = wf.add_status('Status1', 'st1')
data_from_data_source = [{'id': '1', 'text': 'un'}, {'id': '2', 'text': 'deux'}]
# form displayed into workflow
display_form = FormWorkflowStatusItem()
display_form.id = '_x'
display_form.by = ['_submitter']
display_form.varname = 'xxx'
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
display_form.formdef.fields = [
fields.StringField(type='string', id='1', label='Foo', varname='foo'),
fields.ItemField(type='item', id='2', label='Bar', varname='bar',
data_source={
'type': 'json',
'value': "https://api.example.com/json?foo=[xxx_var_foo]"}),
]
st1.items.append(display_form)
display_form.parent = st1
wf.store()
# initial empty 'test' form
formdef = create_formdef()
formdef.fields = []
formdef.confirmation = False
formdef.workflow_id = wf.id
formdef.store()
formdef.data_class().wipe()
# submit initial empty form
app = get_app(pub)
resp = login(app, username='foo', password='foo').get('/test/')
resp = resp.form.submit('submit').follow()
# provide a value for 'f1' field
assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
assert resp.html.find('div', {'data-field-id': '2'}).find('select')
resp.form['f1'].value = 'foo'
live_resp = app.post('/test/1/live?modified_field_id=1', params=resp.form.submit_fields())
assert live_resp.json['result']['1']['visible']
assert live_resp.json['result']['2']['visible']
# simulate javascript filling the <select>
resp.form['f2'].options = []
for item in data_from_data_source:
resp.form['f2'].options.append((item['id'], False, item['text']))
resp.form['f2'] = '2'
# submit the form
resp = resp.form.submit('submit') # <- hang here ...
# ... fails to retrieve the simulate javascript filled options for the select
resp = resp.follow()
assert 'The form has been recorded' in resp.body
</pre>
<p>Le test échoue dans <em>quixote/form/widget.py::SelectWidget:_parse_single_selection()</em> ...<br /><pre>
for value, description, key in self.options:
...
else:
if self.verify_selection:
self.error = self.SELECTION_ERROR
return default
</pre><br />... parce que les options (du select HTML) utilisées pour valider la valeur sont vides :<br /><pre>
(Pdb) self.options
[(None, '---', '')]
</pre></p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1906042019-09-10T15:55:20ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Sujet</strong> changé de <i>Valeur choisie invalide dans la saisie en backoffice d'un formulaire</i> à <i>Valeur choisie invalide dans la saisie d'un formulaire de workflow</i></li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1906092019-09-10T16:11:23ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Description</strong> mis à jour (<a title="Voir les différences" href="/journals/190609/diff?detail_id=167245">diff</a>)</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1912692019-09-13T15:48:39ZStéphane Lagetslaget@entrouvert.com
<ul></ul><p>également ici : #35874</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1913072019-09-14T19:17:45ZBenjamin Dauvergne
<ul></ul><p><del>Pour les ItemField le contenu de la datasource est mise en cache dès le premier appel à ItemField.get_options() dans self._cached_data_source, je suppute un lien mais je vais lire le code de FormWorkflowStatusItem pour en être sûr...</del><br />Pas le bon code.</p>
<p>Donc non, ce serait plutôt dans wcs/forms/common.py:FormStatusPage au niveau de get_workflow_form() :</p>
<pre>
def get_workflow_form(self, user):
submitted_fields = []
form = self.filled.get_workflow_form(user, displayed_fields=submitted_fields)
if form:
form.attrs['data-live-url'] = self.filled.get_url() + 'live'
if form and form.is_submitted():
with get_publisher().substitutions.temporary_feed(self.filled, force_mode='lazy'):
# remove fields that could be required but are not visible
self.filled.evaluate_live_workflow_form(user, form)
get_publisher().substitutions.feed(self.filled)
for field in submitted_fields:
if not field.is_visible(self.filled.data, self.formdef) and 'f%s' % field.id in form._names:
del form._names['f%s' % field.id]
return form
</pre>
<p>on voit bien le feed des données actuelle du formulaire mais pas le feed des données qui viennent d'être soumises comme je pense on doit l'avoir lors de la soumission d'un formulaire "classique" avec les histoires de get_transient_formdata, comme là :</p>
<pre>
submitted_fields = []
transient_formdata = self.get_transient_formdata()
with get_publisher().substitutions.temporary_feed(
transient_formdata, force_mode='lazy'):
form = self.create_form(page=page,
displayed_fields=submitted_fields,
transient_formdata=transient_formdata)
</pre>
<p>Voilà je pense que c'est cerné, Nicolas je pense qu'il te faudra la science de Fred pour avancer plus loin.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1913082019-09-14T20:25:40ZBenjamin Dauvergne
<ul></ul><p>Mauvaise analyse, les données sont bien ajoutées aux substitutions par :</p>
<pre>
self.filled.evaluate_live_workflow_form(user, form)
</pre>
<p>mais comme on est dans le contexte d'un temporary_feed c'est défait, et donc quand on arrive là :</p>
<pre>
279 def check_submitted_form(self, form):
280 if form and form.is_submitted() and not form.has_errors():
281 url = self.submit(form)
</pre>
<p>le form.has_errors() renvoie True puisqu'on a plus les valeurs, il faudrait ajouter le même code dans check_submitted_form, comme ceci :</p>
<pre> def check_submitted_form(self, form):
if form and form.is_submitted():
with get_publisher().substitutions.temporary_feed(self.filled, force_mode='lazy'):
# remove fields that could be required but are not visible
self.filled.evaluate_live_workflow_form(user, form)
get_publisher().substitutions.feed(self.filled)
for field in submitted_fields:
if not field.is_visible(self.filled.data, self.formdef) and 'f%s' % field.id in form._names:
del form._names['f%s' % field.id]
if not form.has_errors():
url = self.submit(form)
if url is None:
url = get_request().get_frontoffice_url()
response = get_response()
response.set_status(303)
response.headers[str('location')] = url
response.content_type = 'text/plain'
return "Your browser should redirect you"
</pre>
<p>ou alors refactoriser un peu tout ce code la pour limiter la duplication.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921082019-09-19T09:30:50ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/37409">workflow-form-wf-with-datasource.wcs</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37409/workflow-form-wf-with-datasource.wcs">workflow-form-wf-with-datasource.wcs</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37410">menu.ods</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37410/menu.ods">menu.ods</a> ajouté</li></ul><p>(correction)<br />Le WF et la source de donnée suivants cernent mieux le bug.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921122019-09-19T09:38:37ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/32960">Development #32960</a>: évaluation dynamique des conditions pour les formulaires de workflow</i> ajouté</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921142019-09-19T09:38:44ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/35363">Bug #35363</a>: pas de calcul live des listes dans un formulaire de workflow </i> ajouté</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921162019-09-19T09:38:53ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/34564">Bug #34564</a>: Dans les formulaire de workflow, le contexte ne contient pas les variables locale (xxx_var_foo)</i> ajouté</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921302019-09-19T09:59:46ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/37413">0001-workflows-reevaluate-form-according-to-possible-new-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37413/0001-workflows-reevaluate-form-according-to-possible-new-.patch">0001-workflows-reevaluate-form-according-to-possible-new-.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>Nouveau</i> à <i>En cours</i></li><li><strong>Patch proposed</strong> changé de <i>Non</i> à <i>Oui</i></li></ul><p>Merci Benjamin pour le coup de main.</p>
<blockquote>
<p>Mauvaise analyse, les données sont bien ajoutées aux substitutions par :</p>
</blockquote>
<pre>
self.filled.evaluate_live_workflow_form(user, form)
</pre><br />c'est justement là que ça plante.
<p>Le bug est le suivant :<br />Le message "valeur choisie invalide" est enregistré par <code>quixote/form/widget.py::SelectWidget::_parse_single_selection()</code><br />parceque <code>formdata.worlflow_data</code> contient encore la valeur du formulaire initial lors de l'évaluation (par <code>evaluate_live_workflow_form</code>) des champs qui sont soumis.</p>
<p>Donc (si j'ai bien compris) un problème qui se mort la queue mais qui a déjà été résolu dans l'autre point d'entrée 'live()' en réitérant l'appel.</p>
<p>Le patch corrige le test et propose une première correction (que je ne maîtrise pas mais que je vais essayer d'affiner) :</p>
<p>Suite au développement <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: évaluation dynamique des conditions pour les formulaires de workflow (Fermé)" href="https://dev.entrouvert.org/issues/32960">#32960</a>,<br />cette correction viens en fait compléter la correction <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: pas de calcul live des listes dans un formulaire de workflow (Fermé)" href="https://dev.entrouvert.org/issues/35363">#35363</a>,<br />en appliquant la même correction que celle appliquée dans 'live()' pour <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Dans les formulaire de workflow, le contexte ne contient pas les variables locale (xxx_var_foo) (Fermé)" href="https://dev.entrouvert.org/issues/34564">#34564</a>.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1921362019-09-19T10:18:36ZBenjamin Dauvergne
<ul></ul><p>Ma fois je n'y comprends rien du tout, t'as juste sorti le code dans le with, hors du with, je suppose que s'il y a un contexte il doit y avoir une raison.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922522019-09-19T15:15:11ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/37435">0002-workflows-correct-test-and-variable-typo-35903.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37435/0002-workflows-correct-test-and-variable-typo-35903.patch">0002-workflows-correct-test-and-variable-typo-35903.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37436">0003-workflows-rename-variable-and-move-a-line-to-ease-ne.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37436/0003-workflows-rename-variable-and-move-a-line-to-ease-ne.patch">0003-workflows-rename-variable-and-move-a-line-to-ease-ne.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37437">0004-workflows-factorize-code-evaluating-workflow-form-35.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37437/0004-workflows-factorize-code-evaluating-workflow-form-35.patch">0004-workflows-factorize-code-evaluating-workflow-form-35.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37438">0005-workflows-remove-redondant-code-WARNING-35903.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37438/0005-workflows-remove-redondant-code-WARNING-35903.patch">0005-workflows-remove-redondant-code-WARNING-35903.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li></ul><p>Finalement, je n'ai rien trouvé de mieux.<br />Les patchs suivants corrigent 2 coquilles et factorisent le code.</p>
<blockquote>
<p>t'as juste sorti le code dans le with, hors du with</p>
</blockquote>
<p>Oui, du coup j'ai tenté une simplification dans le dernier patch proposé.<br />Les tests passent, mais en fait j'ai l'impression que la correction apportée n'y est pour rien,<br />et donc je vais déplacer ce dernier patch dans un autre ticket (<a class="issue tracker-2 status-6 priority-4 priority-default closed" title="Development: Simplification du context de chargement des formulaires de workflow (Rejeté)" href="https://dev.entrouvert.org/issues/36278">#36278</a>).</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922592019-09-19T15:29:11ZBenjamin Dauvergne
<ul></ul><p>Je vais passer la main pour la relecture, ça ne ressemble pas à ce que je pensais être la correction et je n'ai pas particulièrement d'idée sur ce qui serait juste. Juste renommer submitted_fields en display_fields me semble gratuit.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922602019-09-19T15:29:29ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>C'est cinq itérations sur un même patch, attache un seul patch.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922612019-09-19T15:32:41ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>Et les affaires sont suffisamment compliquées comme ça, comme écrit Benjamin, ne viens pas mêler des changements cosmétiques.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922672019-09-19T15:54:06ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <i>0001-workflows-simplify-cache-context-within-get_workflow.patch</i> ajouté</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922692019-09-19T15:55:14ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <del><i>0001-workflows-simplify-cache-context-within-get_workflow.patch</i></del> supprimé</li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922702019-09-19T15:57:24ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/37443">0001-workflows-reevaluate-form-according-to-possible-new-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37443/0001-workflows-reevaluate-form-according-to-possible-new-.patch">0001-workflows-reevaluate-form-according-to-possible-new-.patch</a> ajouté</li></ul><p>oui, j'en conviens, désolé.<br />(mauvais patch ajouté ci-dessus)</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1922922019-09-19T20:11:50ZBenjamin Dauvergne
<ul></ul><p>Nicolas Roche a écrit :</p>
<blockquote>
<p>oui, j'en conviens, désolé.<br />(mauvais patch ajouté ci-dessus)</p>
</blockquote>
<p>À mon avis le commentaire de Fred sur #36728 s'applique aussi :</p>
<blockquote>
<p>Commentaire sur le patch vu dans la branche ça simplifie pas du tout ça modifie tout le comportement de w.c.s. qui suit le bout de code, sur des situations ultra-particulières qui ne se produisent sans doute pas dans les tests. (genre des combinaisons de pages conditionnelles, utilisant du python, avec des champs conditionnels et du django et des sources de données elles-mêmes utilisant l'un ou l'autre, etc.).</p>
</blockquote>
<p>Dans le code suivant :<br /><pre>
def get_workflow_form(self, user):
form, submitted_fields = self.evaluate_workflow_form(user)
if form:
form.attrs['data-live-url'] = self.filled.get_url() + 'live'
if form and form.is_submitted():
with get_publisher().substitutions.temporary_feed(self.filled, force_mode='lazy'):
# remove fields that could be required but are not visible
self.filled.evaluate_live_workflow_form(user, form)
get_publisher().substitutions.feed(self.filled)
for field in submitted_fields:
if not field.is_visible(self.filled.data, self.formdef) and 'f%s' % field.id in form._names:
del form._names['f%s' % field.id]
return form
</pre></p>
<p>le <code>with</code> protège le code qui vient après d'être perturbé par ces deux lignes qui modifie le contexte des variables de substitutions :<br /><pre>
self.filled.evaluate_live_workflow_form(user, form)
get_publisher().substitutions.feed(self.filled)
</pre><br />tu ne peux juste pas faire :<br /><pre>
+ self.filled.evaluate_live_workflow_form(user, form)
+ get_publisher().substitutions.unfeed(lambda x: x is self.filled)
+ get_publisher().substitutions.feed(self.filled)
</pre><br />en dehors du with, ça change complètement le contexte d'exécution.</p>
<p>Le problème n'est même pas là, il est sur ces lignes :<br /><pre>
289 def check_submitted_form(self, form):
290 if form and form.is_submitted() and not form.has_errors():
</pre></p>
<p>c'est dans <code>form.has_errors()</code> que quixote/form/widget.py::SelectWidget::_parse_single_selection() dont tu parles plus haut est appelé, c'est autour de cette ligne qu'il faut changer des choses.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1923172019-09-20T07:24:46ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>En fait c'est vraiment super d'avoir le test pour reproduire le problème et ça va vraiment aider mais la correction en elle-même, parce qu'elle doit prendre en compte des dangers invisibles, je pense maintenant que ça doit être pour ma pomme.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1923232019-09-20T07:47:07ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>Merci Fred !<br />(Je regarde si je peux pas fournir un second test).<br />Au cas où un dernier petit laïus sur le sujet.</p>
<p><code>---8<---</code><br />Oui, j'ai bien has_error() à True, mais je ne vois pas comment l'exploiter.<br />Voici la pile des appels :<br /><pre>
...
/home/nroche/src/wcs/wcs/forms/common.py(242)_q_index()
-> form = self.get_workflow_form(user)
/home/nroche/src/wcs/wcs/forms/common.py(271)get_workflow_form()
-> self.filled.evaluate_live_workflow_form(user, form)
/home/nroche/src/wcs/wcs/formdata.py(576)evaluate_live_workflow_form()
-> wf_status.evaluate_live_form(form, self, user)
/home/nroche/src/wcs/wcs/workflows.py(1467)evaluate_live_form()
-> item.evaluate_live_form(form, filled, user)
/home/nroche/src/wcs/wcs/wf/form.py(199)evaluate_live_form()
-> self.formdef.fields, self.formdef.get_data(form),
/home/nroche/src/wcs/wcs/formdef.py(710)get_data()
-> d.update(self.get_field_data(field, widget))
/home/nroche/src/wcs/wcs/formdef.py(686)get_field_data()
-> d[field.id] = widget.parse()
/home/nroche/envs/publik-env/local/lib/python2.7/site-packages/quixote/form/widget.py(125)parse()
-> self._parse(request)
/home/nroche/envs/publik-env/local/lib/python2.7/site-packages/quixote/form/widget.py(466)_parse()
-> self.value = self._parse_single_selection(parsed_key)
> /home/nroche/envs/publik-env/local/lib/python2.7/site-packages/quixote/form/widget.py(413)_parse_single_selection()
-> return default
</pre></p>
<p>Par exemple, dans get_data j'ai tenté de positionner <code>widget.verify_selection</code> à <code>False</code> sur les liste afin d'éviter l'erreur. Cela permet de valider le formulaire (de passer sans encombre dans <code>check_submitted_form</code> comme Benjamin le propose dans sa seconde analyse), mais ensuite on ne récupère pas les bonnes valeurs.</p>
<p><em>formdef.py:</em><br /><pre>
def get_data(self, form):
d = {}
for field in self.fields:
widget = form.get_widget('f%s' % field.id)
if widget:
d.update(self.get_field_data(field, widget))
return d
</pre></p>
<p>Au début je pensais intervenir sur <code>evaluate_live_form</code> car c'est ici que l'on observe que la valeur du camps 1 (qui permet de récupérer les options du select du champ 2) est restée la même que celle fourni par le précédent formulaire validé (formulaire de démarche ou formulaire de workflow validé précédemment). Mais je n'ai pas réussi :</p>
<p><em>wf/form.py:</em><br /><pre>
def evaluate_live_form(self, form, formdata, user):
++ print "avant: %s" % formdata.workflow_data
workflow_data = {}
for k, v in get_dict_with_varnames(
self.formdef.fields, self.formdef.get_data(form),
varnames_only=True).items():
workflow_data['%s_%s' % (self.varname, k)] = v
formdata.update_workflow_data(workflow_data)
++ print "apres: %s" % formdata.workflow_data
</pre></p>
<p>A vrai dire le test fourni ne reproduit pas cela (il me faudrait le rajouter à la fin du test <code>test_backoffice_workflow_form_with_live_data_source</code> de <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: pas de calcul live des listes dans un formulaire de workflow (Fermé)" href="https://dev.entrouvert.org/issues/35363">#35363</a>). Le test fourni permet cependant de montrer que les variables de workflow sont mises à jour à ce moment.</p>
<pre>
avant: None
apres: {'xxx_var_bar2': 'plop', 'xxx_var_foo_raw': None, 'xxx_var_foo': None, 'xxx_var_bar': 'hello'}
</pre>
<p>Or les options du select sont récupérées en utilisant la variable de workflow du champ 1 par la méthode <code>formdata.py::FormData::get_workflow_form()</code> appellée (<strong>ici</strong>) avant l'instruction qui met à jour cette variable (<strong>là</strong>) :</p>
<p><em>common.py:</em><br /><pre>
def get_workflow_form(self, user):
submitted_fields = []
form = self.filled.get_workflow_form(user, displayed_fields=submitted_fields) # <- *ici*
if form:
form.attrs['data-live-url'] = self.filled.get_url() + 'live'
if form and form.is_submitted():
with get_publisher().substitutions.temporary_feed(self.filled, force_mode='lazy'):
# remove fields that could be required but are not visible
self.filled.evaluate_live_workflow_form(user, form) # <- *là*
...
</pre></p>
<p>Le test reproduit la même erreur ('valeur choisie invalide') parce que le champs 1 n'est pas encore valué dans <code>formdata</code> lors de la récupération des options du select.</p>
<p>Pour moi se serait plutôt à ce moment <del>ici</del> qu'il faudrait réévaluer les variables de workflow (ou inversement <del>là</del>, ne pas les valider tant que l'on ne les a pas évaluées). Ce qui est fait par <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Dans les formulaire de workflow, le contexte ne contient pas les variables locale (xxx_var_foo) (Fermé)" href="https://dev.entrouvert.org/issues/34564">#34564</a> <em>(reevaluate workflow form according to possible new content)</em> en faisant deux passes : la première passe est fausse (et l'erreur est ignorée) mais les 2 passes ont le mérite de rester cohérentes.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1923782019-09-20T10:08:50ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Fichier</strong> <a href="/attachments/37460">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37460/0001-tests-check-for-live-data-sources-in-workflow-forms-.patch">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37461">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37461/0002-misc-recreate-workflow-form-after-submission-to-get-.patch">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> ajouté</li></ul><p>0001 avec le test corrigé, pour garder l'attribution à Nicolas parce que c'était quand même le gros du travail.</p>
<p>0002 avec la correction, que je laisse découvrir.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1923882019-09-20T10:42:52ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>Solution validée</i></li></ul><p>arf, je m'en veux d'être passé à côté.<br />Ça passe les tests sur mon workflow.<br />(en fait le test de <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: pas de calcul live des listes dans un formulaire de workflow (Fermé)" href="https://dev.entrouvert.org/issues/35363">#35363</a> ne permettrai pas plus de tester avec un champ 1 déjà initialisé)</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1923902019-09-20T10:47:40ZBenjamin Dauvergne
<ul></ul><p>Y a ça qui est perdu au passage quand on recrée le form il me semble (surtout en cas d'erreur de validation, si la soumission passe c'est moins grave):<br /><pre>
if form:
form.attrs['data-live-url'] = self.filled.get_url() + 'live'
</pre><br />à déplacer en sortie de fonction je pense.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924002019-09-20T12:14:44ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>idem, il y a aussi <br /><pre>
submitted_fields = []
</pre><br />apporté par le patch misc-don-t-check-displayed-fields-twice-in-live-eval.patch de <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: pas de calcul live des listes dans un formulaire de workflow (Fermé)" href="https://dev.entrouvert.org/issues/35363">#35363</a> qui a sauté.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924382019-09-20T14:27:47ZBenjamin Dauvergne
<ul><li><strong>Assigné à</strong> mis à <i>Benjamin Dauvergne</i></li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924392019-09-20T14:27:48ZBenjamin Dauvergne
<ul><li><strong>Fichier</strong> <a href="/attachments/37471">0004-tox-remove-skipdist-set-scgi-max-version.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37471/0004-tox-remove-skipdist-set-scgi-max-version.patch">0004-tox-remove-skipdist-set-scgi-max-version.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37472">0005-misc-evaluate-workflow-form-three-times-to-support-d.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37472/0005-misc-evaluate-workflow-form-three-times-to-support-d.patch">0005-misc-evaluate-workflow-form-three-times-to-support-d.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37473">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37473/0002-misc-recreate-workflow-form-after-submission-to-get-.patch">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37474">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37474/0001-tests-check-for-live-data-sources-in-workflow-forms-.patch">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/37475">0003-tests-check-longer-dependency-chain-in-workflow-form.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/37475/0003-tests-check-longer-dependency-chain-in-workflow-form.patch">0003-tests-check-longer-dependency-chain-in-workflow-form.patch</a> ajouté</li><li><strong>Tracker</strong> changé de <i>Bug</i> à <i>Development</i></li><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>Solution proposée</i></li></ul><p>Bon le problème semble plus compliqué, j'ai ajouté un deuxième ItemField 'foo2' dépendant du premier 'foo', créant ainsi une chaîne de dépendance de longueur 3, et ça ne marche plus. Il semble qu'il faille évaluer les formulaire n+1 fois si on a au maximum des chaînes de dépendance de longueur n (et il faudrait prendre en compte les conditions de visibilité). De fait ça ressemble à la recherche d'un point fixe dans l'évaluation d'un dataflow (= une feuille de tableur avec des formules). Pour couvrir tous les cas il faudrait un code commun entre l'évaluation live et normale qui ferait en gros ceci en pseudo-python (et je me demande comment c'est géré dans le code des formulaires normaux) :</p>
<pre>
form = get_form()
if submitted:
while True:
old_form = form
invalidate_cache()
evaluate_live_form(form)
form = get_form()
remove_invisible_fields(form)
if compare(form, old_form) == 0:
break
</pre>
<p>L'important ce serait de définir cette fonction compare pour savoir quand on peut s'arrêter.</p>
<p>Il y a une possibilité que ça boucle infiniment (genre <code>foo1.visible = 'not foo2'; foo2.visible = 'not foo1'</code>..) si on a une dépendance cyclique, donc faudrait se limiter genre à un maximum de n+1 évaluations et expliquer dans la doc qu'on peut pas avoir des dépendances sur plus de n champs.</p>
<p>PS: je note ici pour mon édification personelle que <pre> get_publisher().substitutions.invalidate_cache()</pre> et <pre> get_publisher().substitutions.unfeed(lambda x: x is filled)</pre> donne le même résultat (j'ai testé les deux pour voir dans live/get_workflow_form, pas bien regardé ce que ça change en vrai)</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924432019-09-20T14:40:10ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>Sérieux, on peut ne pas tous travailler sur la même chose ?</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924442019-09-20T14:41:23ZBenjamin Dauvergne
<ul></ul><p>Frédéric Péters a écrit :</p>
<blockquote>
<p>Sérieux, on peut ne pas tous travailler sur la même chose ?</p>
</blockquote>
<p>Je signale juste que la solution apportée ne marche pas et je me demande si ça marche en front et comment; je trouve bien qu'on soit plusieurs à comprendre, ma branche n'apporte pas la solution, elle montre les problèmes qui restent.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924512019-09-20T15:08:24ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>En cours</i></li><li><strong>Assigné à</strong> changé de <i>Benjamin Dauvergne</i> à <i>Frédéric Péters</i></li></ul><blockquote>
<p>ma branche n'apporte pas la solution</p>
</blockquote>
<p>Je modifie le ticket pour refléter ça, et confirmer que je m'occupe de ce ticket, merci.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1924592019-09-20T15:17:35ZBenjamin Dauvergne
<ul></ul><p>Frédéric Péters a écrit :</p>
<blockquote><blockquote>
<p>ma branche n'apporte pas la solution</p>
</blockquote>
<p>Je modifie le ticket pour refléter ça, et confirmer que je m'occupe de ce ticket, merci.</p>
</blockquote>
<p>Ah oui pardon, j'ai fait un <code>git sub</code> j'ai oublié de dire non à la question de prendre le ticket, pardon, j'ai supprimé ma branche aussi pour ne pas polluer.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1949092019-10-04T09:16:27ZBenjamin Dauvergne
<ul></ul><p>Le client demande si ce sera corrigé d'ici fin octobre.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1949242019-10-04T10:03:57ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><p>Si le cas précis correspond au patch, ça peut aller, modulo modification pour reprendre l'attribut data-live-url; ça dépend de l'acceptation d'un patch qui se limiterait à ça. S'il s'agit d'un changement plus large, je n'ai pas regardé.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1964912019-10-11T15:23:04ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Information nécessaire</i></li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1965002019-10-11T15:43:21ZBenjamin Dauvergne
<ul><li><strong>Statut</strong> changé de <i>Information nécessaire</i> à <i>Solution validée</i></li></ul><p>Ok go pour le patch ça corrige le souci immédiat de Toulouse; pour le reste tant pis, on redécouvrira le problème plus tard quand quelqu'un mettra 3 ItemField enchaînés au lieu de 2.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1965022019-10-11T15:53:40ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>En cours</i></li></ul><p>Il y a quand même encore le data-live-url à assurer.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1965042019-10-11T16:02:00ZBenjamin Dauvergne
<ul></ul><p>De mon coté je vais ouvrir un autre ticket et rebaser ma branche avec le problème à long terme, j'essayerai de voir si ça affecte le front aussi.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1979382019-10-21T13:06:17ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Fichier</strong> <a href="/attachments/38291">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/38291/0001-tests-check-for-live-data-sources-in-workflow-forms-.patch">0001-tests-check-for-live-data-sources-in-workflow-forms-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/38292">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/38292/0002-misc-recreate-workflow-form-after-submission-to-get-.patch">0002-misc-recreate-workflow-form-after-submission-to-get-.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li></ul><p>Voilà la version qui doit assurer le taf pour le cas rencontré.</p> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1981212019-10-22T09:07:48ZThomas Noël
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>Solution validée</i></li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1981242019-10-22T09:14:00ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>Résolu (à déployer)</i></li></ul><pre>
commit 9da3ee99014ff61bd636a63d83bd7b8cfea3213b
Author: Frédéric Péters <fpeters@entrouvert.com>
Date: Fri Sep 20 12:00:14 2019 +0200
misc: recreate workflow form after submission, to get live items (#35903)
commit e8384becebfa7f75a102b0474699a4354110711c
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date: Tue Sep 10 10:43:22 2019 +0200
tests: check for live data sources in workflow forms (#35903)
</pre> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=1981542019-10-22T10:15:09ZFrédéric Pétersfpeters@entrouvert.com
<ul><li><strong>Statut</strong> changé de <i>Résolu (à déployer)</i> à <i>Solution déployée</i></li></ul> w.c.s. - Development #35903: Valeur choisie invalide dans la saisie d'un formulaire de workflowhttps://dev.entrouvert.org/issues/35903?journal_id=2089202020-01-08T21:33:20ZBenjamin Dauvergne
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-2 status-1 priority-3 priority-lowest" href="/issues/38852">Development #38852</a>: Évaluation de plusieurs listes live enchaînées des les formulaires</i> ajouté</li></ul>