Projet

Général

Profil

Bug #7132

format des dates, conflit API json et workflow_data/form.

Ajouté par Frédéric Péters il y a presque 9 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
-
Début:
04 mai 2015
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

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

Lié à w.c.s. - Bug #9876: les champs date des formulaires de workflow deviennent des heures en UTC (la veille à 22 ou 23h à Paris) dans l'export JSONFermé04 février 2016

Actions

Révisions associées

Révision e65b09fb (diff)
Ajouté par Frédéric Péters il y a presque 9 ans

formdata: add a varnames_only variant to get_dict_with_varnames (#7132)

Révision 46d8878f (diff)
Ajouté par Frédéric Péters il y a presque 9 ans

formdata: keep native ('raw') values in get_dict_with_varnames (#7132)

This is not advertised but may come handy later.

Révision 072aba31 (diff)
Ajouté par Frédéric Péters il y a presque 9 ans

workflows: don't use json output to store workflow form data (#7132)

Historique

#1

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].

#2

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... :/

#3

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'.

#4

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.

#5

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.

#6

Mis à jour par Frédéric Péters il y a presque 9 ans

  • Priorité changé de Normal à Haut
#7

Mis à jour par Frédéric Péters il y a presque 9 ans

« Non, pas le hack ! ».

#9

Mis à jour par Thomas Noël il y a presque 9 ans

Forcément je suis content, donc Ack.

#10

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.

#11

Mis à jour par Thomas Noël il y a plus de 8 ans

  • Statut changé de Résolu (à déployer) à Fermé
#12

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é
#13

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é
#14

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é

Formats disponibles : Atom PDF