Bug #7132
format des dates, conflit API json et workflow_data/form.
0%
Description
Dans #6927 on a forcé un retour au get_json_value() sous forme de chaine YYYY-MM-DD; mais la création du dictionnaire json était utilisée aussi pour alimenter le workflow_data lors d'une action de type "Formulaire" :
if form.get_submit() == 'submit' and not form.has_errors(): workflow_data = {} for k, v in get_json_dict( self.formdef.fields, self.formdef.get_data(form)).items(): workflow_data['%s_var_%s' % (self.varname, k)] = v
Ça fait que dans le cas d'un champ date, il pouvait y avoir avant un template appelant "[cloture_var_date_preavis.tm_mday]" et maintenant que c'est une chaine, ça ne marche plus.
Pour faire marcher les deux situations, on pourrait avoir dans le get_jsonvalue() retour d'un objet comme celui-ci :
class CompatDate(datetime.date): @property def tm_mday(self): return self.day ...
Et puis dans le jsonencoder attraper ça pour sortir YYYY-MM-DD.
Pour éviter de futures confusions, le get_json_dict pourrait aussi être renommé sans json dans son nom (vu qu'on y autorise des types "complexes").
Fichiers
Demandes liées
Révisions associées
formdata: keep native ('raw') values in get_dict_with_varnames (#7132)
This is not advertised but may come handy later.
workflows: don't use json output to store workflow form data (#7132)
Historique
Mis à jour par Frédéric Péters il y a presque 9 ans
Une autre possibilité ce serait d'annuler un petit bout de #2926, mais conséquences plutôt inconnues :
--- a/wcs/wf/form.py +++ b/wcs/wf/form.py @@ -22,7 +22,7 @@ from wcs.workflows import WorkflowStatusItem, register_item_class from wcs.formdef import FormDef from wcs.admin.fields import FieldDefPage, FieldsDirectory -from wcs.formdata import get_json_dict +from wcs.formdata import get_dict_with_varnames class WorkflowFormFieldsFormDef(FormDef): @@ -125,7 +125,7 @@ class FormWorkflowStatusItem(WorkflowStatusItem): def submit_form(self, form, formdata, user, evo): if form.get_submit() == 'submit' and not form.has_errors(): workflow_data = {} - for k, v in get_json_dict( + for k, v in get_dict_with_varnames( self.formdef.fields, self.formdef.get_data(form)).items(): workflow_data['%s_var_%s' % (self.varname, k)] = v formdata.update_workflow_data(workflow_data)
(l'avantage ce serait d'uniformiser l'accès aux variables du formulaire et celles tirées du formulaire du workflow).
En conséquence directe ça veut dire que le [periode_var_date_debut.tm_mday]/[periode_var_date_debut.tm_mon]/[periode_var_date_debut.tm_year] d'un workflow vincennes devrait être modifié en [periode_var_date_debut].
Mis à jour par Thomas Noël il y a presque 9 ans
Je préfère investiguer cette seconde solution. Il faudrait une version "varname only" de get_dict_with_varnames(). Et, selon moi, tout devrait être ok... en profiter évidemment pour rajouter 81281038 tests... :/
Mis à jour par Frédéric Péters il y a presque 9 ans
L'idée du get_dict_with_varnames "varnames only", c'est pour ne pas charger le workflow_data avec une série de valeurs dupliquées (f..., field_..., var_...) ?
Du côté des tests, malheureusement, on peut faire des trucs artificiels qui vont naturellement passer; ou des trucs réels (genre le ..._date.tm_month) qui vont échouer.
Ou on parle de supprimer le get_json_dict pour le remplacer par get_dict_with_varnames(..., varnames_only=True) ? Là je pense que ça va foirer parce que le get_dict_with_varnames va donner des représentations qu'on ne veut pas dans le json (les dates formatées "locale" et non yyyy-mm-dd).
(...)
À tester c'est autre chose qui foire, le test_api.py::test_formdata parce qu'il fait :
> assert resp.json['fields']['foobar'] == 'foo@localhost'
Et que dans le dictionnaire, c'est évidemment 'var_foobar', pas 'foobar'.
Mis à jour par Thomas Noël il y a presque 9 ans
Frédéric Péters a écrit :
L'idée du get_dict_with_varnames "varnames only", c'est pour ne pas charger le workflow_data avec une série de valeurs dupliquées (f..., field_..., var_...) ?
Oui.
Du côté des tests, malheureusement, on peut faire des trucs artificiels qui vont naturellement passer; ou des trucs réels (genre le ..._date.tm_month) qui vont échouer.
Effectivement...
Ou on parle de supprimer le get_json_dict pour le remplacer par get_dict_with_varnames(..., varnames_only=True) ? Là je pense que ça va foirer parce que le get_dict_with_varnames va donner des représentations qu'on ne veut pas dans le json (les dates formatées "locale" et non yyyy-mm-dd).
Non, je pensais juste (ré)utiliser get_dict_with_varnames au niveau du submit des formulaires de workflows.
Mis à jour par Frédéric Péters il y a presque 9 ans
J'écrivais :
Et que dans le dictionnaire, c'est évidemment 'var_foobar', pas 'foobar'.
À revenir sur le ticket c'est vraiment là-dessus que ma préoccupation se pose; pour moi ça rend impossible la bascule de get_json_dict à get_dict_with_varnames. Je repartirais plutôt sur le hack initial du CompatDate.
Mis à jour par Frédéric Péters il y a presque 9 ans
- Fichier 0001-formdata-add-a-varnames_only-variant-to-get_dict_wit.patch 0001-formdata-add-a-varnames_only-variant-to-get_dict_wit.patch ajouté
- Fichier 0002-formdata-keep-native-raw-values-in-get_dict_with_var.patch 0002-formdata-keep-native-raw-values-in-get_dict_with_var.patch ajouté
- Fichier 0003-workflows-don-t-use-json-output-to-store-workflow-fo.patch 0003-workflows-don-t-use-json-output-to-store-workflow-fo.patch ajouté
- Fichier 0004-tests-add-basic-date-field-test.patch 0004-tests-add-basic-date-field-test.patch ajouté
- Fichier 0005-tests-add-basic-testing-of-display-form-workflow-act.patch 0005-tests-add-basic-testing-of-display-form-workflow-act.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Voilà.
Mis à jour par Frédéric Péters il y a presque 9 ans
- Statut changé de En cours à Résolu (à déployer)
Voilà la série poussée.
Mis à jour par Frédéric Péters il y a environ 8 ans
- Lié à Bug #9852: crash export json sur les dates avant 1900 ajouté
Mis à jour par Frédéric Péters il y a environ 8 ans
- Lié à Bug #9852: crash export json sur les dates avant 1900 supprimé
Mis à jour par Frédéric Péters il y a environ 8 ans
- Lié à Bug #9876: les champs date des formulaires de workflow deviennent des heures en UTC (la veille à 22 ou 23h à Paris) dans l'export JSON ajouté
formdata: add a varnames_only variant to get_dict_with_varnames (#7132)