Projet

Général

Profil

Bug #22793

action de modif de profil et champ date à chaine vide

Ajouté par Frédéric Péters il y a environ 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
26 mars 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Ça n'est pas converti à None donc ça arrive jusqu'au stockage SQL où ça plante avec

Exception:
  type = '<type 'exceptions.AssertionError'>', value = ''

Stack trace (most recent call first):
  File "/usr/lib/python2.7/dist-packages/wcs/sql.py", line 1012, in get_sql_dict_from_data
  1010                     assert isinstance(value, basestring)
  1011                 elif sql_type == 'date':
> 1012                     assert type(value) is time.struct_time
  1013                     value = datetime.datetime(value.tm_year, value.tm_mon, value.tm_mday)
  1014                 elif sql_type == 'bytea':
...
     sql_type = 'date'
     value = ''

Fichiers

Révisions associées

Révision d01d5a79 (diff)
Ajouté par Thomas Noël il y a environ 6 ans

add fault tolerance on convert_value_from_anything usage (#22793)

... and make None a legitimate value.

Historique

#1

Mis à jour par Thomas Noël il y a environ 6 ans

Pourtant dans wcs/wf/profile.py :

                if field and field_value and field.convert_value_from_anything:
                    field_value = field.convert_value_from_anything(field_value)
                new_user_data[field.id] = field_value

et convert_value_from_anything('') renvoie bien un None pour un DateField.

Je dois rater un truc ...?

#2

Mis à jour par Frédéric Péters il y a environ 6 ans

and field_value, donc on ne passe pas dedans.

#3

Mis à jour par Thomas Noël il y a environ 6 ans

  • Assigné à mis à Thomas Noël
#4

Mis à jour par Thomas Noël il y a environ 6 ans

Après avoir vérifié que convert_value_from_anything provoque bien des ValueError si vide ou None est reçu (pour DateField et FileField, seuls champs avec cette méthode), alors je supprime du "if" le test sur la valeur vide, et appelle toujours la fonction.

Et mise à niveau des tests pour vérifier que ça passe bien.

#5

Mis à jour par Frédéric Péters il y a environ 6 ans

  • Statut changé de Nouveau à En cours

Après avoir vérifié que convert_value_from_anything provoque bien des ValueError si vide ou None est reçu (pour DateField et FileField, seuls champs avec cette méthode) [...]

Je me perds là; pour moi convert_value_from_anything a le comportement de retourner None en cas de valeur vide pour le DateField (ce qui me semble le comportement souhaité ici, vu qu'on n'entoure pas tous les appels à convert_value_from_anything de try/except ValueError); mais FileField n'a pas ce comportement (et lève un ValueError mais dans le test qu'on a c'est dans le contexte d'un champ backoffice et là il y a un try/except).

Sur l'idée qu'on ne va pas autoriser tout de suite les champs fichier dans le profil, ack, mais je pense qu'on devrait dégager sans doute dégager le ValueError du convert_value_from_anything de FileField. (et sans doute y avoir un explicite "if not value: return None", puis peut-être le notify_of_exception(...) qu'on a dans wf/backoffice_fields.py.

~~

Aussi, on a rencontré l'erreur lors d'un provisionning SAML sur la prod, et j'ai donc appliqué ça en hot fix.

~~

(Et au cas où j'ai encore les tests qui tournent en local, j'annulerai le ack s'ils échouent)

#6

Mis à jour par Thomas Noël il y a environ 6 ans

Frédéric Péters a écrit :

Après avoir vérifié que convert_value_from_anything provoque bien des ValueError si vide ou None est reçu (pour DateField et FileField, seuls champs avec cette méthode) [...]

Je me perds là; pour moi convert_value_from_anything a le comportement de retourner None en cas de valeur vide pour le DateField (ce qui me semble le comportement souhaité ici, vu qu'on n'entoure pas tous les appels à convert_value_from_anything de try/except ValueError); mais FileField n'a pas ce comportement (et lève un ValueError mais dans le test qu'on a c'est dans le contexte d'un champ backoffice et là il y a un try/except).

Ah oui, je m'étais perdu aussi lors de mes lectures/patches sur le sujet. Effectivement le comportement est différent entre les deux convert de DateField et FileField.

Sur l'idée qu'on ne va pas autoriser tout de suite les champs fichier dans le profil, ack, mais je pense qu'on devrait dégager sans doute dégager le ValueError du convert_value_from_anything de FileField. (et sans doute y avoir un explicite "if not value: return None", puis peut-être le notify_of_exception(...) qu'on a dans wf/backoffice_fields.py.

MMMhhhh... en fait, y'a deux cas, soit la value reçu est '' et alors c'est un soucis (mauvais type de variable, quelqu'un a du essayer de taper [bidule] ou {{bidule_raw}} dans l'affectation), soit c'est None et alors c'est "normal" (pas de fichier à stocker).

Je me dis que ça devrait être pareil pour les DateField (prendre None sans râler).

Aussi, on a rencontré l'erreur lors d'un provisionning SAML sur la prod, et j'ai donc appliqué ça en hot fix.

Ok.

(Et au cas où j'ai encore les tests qui tournent en local, j'annulerai le ack s'ils échouent)

Ouaip j'ai pas joué les tests sur la partie SAML, un peu trop chiant, j'avoue.

#7

Mis à jour par Thomas Noël il y a environ 6 ans

Le patch avec des «if value is None: return None» au début des convert_value_from_anything.

#8

Mis à jour par Frédéric Péters il y a environ 6 ans

MMMhhhh... en fait, y'a deux cas, soit la value reçu est '' et alors c'est un soucis (mauvais type de variable, quelqu'un a du essayer de taper [bidule] ou {{bidule_raw}} dans l'affectation), soit c'est None et alors c'est "normal" (pas de fichier à stocker).

Sauf que pour un champ date vide Authentic envoie un message de provisionning avec une chaine vide, pas null. (c'est ça qu'on a eu comme trace hier)

Je me dis que ça devrait être pareil pour les DateField (prendre None sans râler).

C'est le cas avec ton patch mais on attrapait déjà le ValueError silencieusement, pas de changement ici.

#9

Mis à jour par Thomas Noël il y a environ 6 ans

Frédéric Péters a écrit :

MMMhhhh... en fait, y'a deux cas, soit la value reçu est '' et alors c'est un soucis (mauvais type de variable, quelqu'un a du essayer de taper [bidule] ou {{bidule_raw}} dans l'affectation), soit c'est None et alors c'est "normal" (pas de fichier à stocker).

Sauf que pour un champ date vide Authentic envoie un message de provisionning avec une chaine vide, pas null. (c'est ça qu'on a eu comme trace hier)

Que je pige : tu verrais donc un retour de None "normal" si value est '', pour DateField.convert_value_from_anything ? Pourquoi pas, hein...

Je me dis que ça devrait être pareil pour les DateField (prendre None sans râler).

C'est le cas avec ton patch mais on attrapait déjà le ValueError silencieusement, pas de changement ici.

Oui ça change rien, ça «nettoie» juste le code.

En fait je vois pas trop ce qui pose problème dans mon patch, y'a quelque chose que je dois rater.

#10

Mis à jour par Frédéric Péters il y a environ 6 ans

Que je pige : tu verrais donc un retour de None "normal" si value est '', pour DateField.convert_value_from_anything ? Pourquoi pas, hein...

Oh là là non, je ne veux rien du tout, et le patch précédent m'allait, et celui-ci aussi, je notais juste qu'ils ne me semblaient en pratique rien changer.

~~

Mais à discuter, en "non-pratique", tu introduis ici une notion de retour "normal" mais il se définit soit en opposition au traitement de la chaine vide pour les dates (qui retourne None, mais un None "anormal"). Ou en opposition au traitement d'une chaine vide dans FileField (qui ne retourne pas None mais lève un ValueError).

Et donc, à prendre ce chemin, traiter de manière "normale" le None, appelle pour moi aussi le besoin d'unifier le traitement de la chaine vide "anormale", que ça soit en retournant tout le temps None dans FileField, ou le levant aussi ValueError dans DateField.

Bref, s'il doit y avoir nettoyage, pour moi, ça doit inclure le traitement uniforme des valeurs "anormales", pas juste le traitement du None comme valeur "normale".

#11

Mis à jour par Thomas Noël il y a environ 6 ans

Voilà donc avec du nettoyage :
  • None est une valeur légitime
  • les valeurs "autres" provoquent un Value Error

En cas de ValueError, je déclenche des publisher.notify_of_exception dans les différents contextes hobo, saml, profil et champs backoffice. Il est possible que cela provoque des alertes mail qu'on n'a pas actuellement sur les contextes hobo ou saml, parce qu'on ne passe pas par ce code actuellement (if value and ...). Je propose de poser sur la en recette, et si on reçoit trop d'alertes retirer les notify ou, si possible, corriger le soucis à la source (a2, hobo, ...).

#12

Mis à jour par Frédéric Péters il y a environ 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit d01d5a79289015f684d60c95a2d407d793b43d1b
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Mon Mar 26 17:02:41 2018 +0200

    add fault tolerance on convert_value_from_anything usage (#22793)

    ... and make None a legitimate value.
#13

Mis à jour par Frédéric Péters il y a environ 6 ans

En cas de ValueError, je déclenche des publisher.notify_of_exception dans les différents contextes hobo, saml, profil et champs backoffice. Il est possible que cela provoque des alertes mail qu'on n'a pas actuellement sur les contextes hobo ou saml, parce qu'on ne passe pas par ce code actuellement (if value and ...). Je propose de poser sur la en recette, et si on reçoit trop d'alertes retirer les notify ou, si possible, corriger le soucis à la source (a2, hobo, ...).

Sur la recette rien reçu mais de la prod on vient de recevoir une notif lors de provisionning, parce que dans la notif hobo birthdate était une chaine vide (compte strasbourg avec l'uuid be74b487c458491d9fe50645100b3a5f).

#14

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF