Projet

Général

Profil

Bug #36037

crash après le retrait d'une source de données dans un champ liste

Ajouté par Paul Marillonnet il y a plus de 4 ans. Mis à jour il y a 10 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
11 septembre 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Dans l'ordre, je :
- crée un formulaire
- ajoute un champ liste, avec une source de données (en l'occurrence l'URL d'un JSON)
- modifie le champ liste, retire la source de champs liste
- retourne sur la page principale backoffice du formulaire → Crash


Fichiers


Demandes liées

Lié à w.c.s. - Bug #36851: crash si on passe d'une data source "Url JSON" à "Aucun"Fermé11 octobre 2019

Actions
Dupliqué par w.c.s. - Development #36475: data sources: erreur d'identification d'une source de donnéesRejeté27 septembre 2019

Actions

Historique

#1

Mis à jour par Paul Marillonnet il y a plus de 4 ans

  • Assigné à mis à Paul Marillonnet
#2

Mis à jour par Paul Marillonnet il y a plus de 4 ans

A priori on peut s'occuper de gérer les types de sources inconnus.
Alternativement, on pourrait aussi faire en sorte qu'une source de données retirée d'un champ liste ne laisse pas de reliquat comme c'est le cas actuellement.

Qu'en disent les dévs w.c.s. ?

#3

Mis à jour par Paul Marillonnet il y a plus de 4 ans

La trace, comme demandée de vive voix au bureau :

[2019-09-11 14:37:41] exception caught
Exception:
  type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'startswith''

Stack trace (most recent call first):
  File "/home/paul/src/wcs/wcs/data_sources.py", line 245, in get_object
   243         named_data_source.data_source = data_source
   244         return named_data_source
>  245     if ds_type.startswith('carddef:'):
   246         named_data_source = NamedDataSource()
   247         named_data_source.data_source = data_source

  locals: 
     data_source = {'value': '{{ passerelle_url }}csvdatasource/liste-des-ecoles-primaires-triees/query/type/?type={% if form_var_niveau_ecole == "Toute petite section" or form_var_niveau_ecole == "Petite section" or form_var_niveau_ecole == "Moyenne section" or form_var_niveau_ecole == "Grande section" %}maternelle{% elif form_var_niveau_ecole == "CP" or form_var_niveau_ecole == "CE1" or form_var_niveau_ecole == "CE2" or form_var_niveau_ecole == "CM1" or form_var_niveau_ecole == "CM2" or form_var_niveau_ecole == "ULIS" %}\xc3\xa9l\xc3\xa9mentaire{% endif %}'}
     ds_type = None

  File "/home/paul/src/wcs/wcs/fields.py", line 1264, in perform_more_widget_changes
  1262 
  1263     def perform_more_widget_changes(self, form, kwargs, edit=True):
> 1264         data_source = data_sources.get_object(self.data_source)
  1265 
  1266         if data_source and data_source.type == 'jsonp':

  locals: 
     edit = True
     form = <qommon.form.Form object at 0x7f5adc83df10>
     kwargs = {'required': True}
     self = <ItemField 18 '\xc3\x89cole'>

[...]

#4

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

Le gros pâté du patch modifie cette ligne :

    if data_source.get('type') and data_source.get('type').startswith('carddef:'):

Qui assure déjà que le second terme ne sera pas évalué si le premier est None.

Pâté à dégager.

#5

Mis à jour par Paul Marillonnet il y a plus de 4 ans

En fait la partie problématique est le bloc d'en dessous

if data_source.get('type') not in ('json', 'jsonp', 'formula'):

lorsque data_source.get('type') est évalué à None.

Je pensais, plutôt que d'inclure un if data_source.get('type') and … (voire une truc plus crade genre un ajout de None dans le tuple des not in (…)), faire remonter cette condition pour la cerner dans les deux blocs consécutifs. D'où le gros paté. Je me plante ?

#6

Mis à jour par Paul Marillonnet il y a plus de 4 ans

(Et ceci, sous l'hypothèse que la lisibilité finale du code une fois patché est plus importante que la lisibilité (et la taille) du patch. Et non pas l'inverse. Je me plante aussi ici ?)

#7

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

Je pensais, plutôt que d'inclure un if data_source.get('type') and … (voire une truc plus crade genre un ajout de None dans le tuple des not in (…)), faire remonter cette condition pour la cerner dans les deux blocs consécutifs. D'où le gros paté. Je me plante ?

Je ne vois pas pourquoi tu continues à parler d'une partie du code qui n'a aucune raison de changer.

#8

Mis à jour par Paul Marillonnet il y a plus de 4 ans

Ok, je n'aimais pas la forme non factorisée des tests sur data_source.get('type'), mais c'est pas non plus affreux.
Je vais écrire des tests

#9

Mis à jour par Paul Marillonnet il y a plus de 4 ans

#10

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

datasource = {'value': "https://whatever.com/json"}

Ok via ce test je vois donc ce qu'il y avait là, mais du coup ça me semble plutôt devoir se corriger ailleurs, plutôt qu'avoir à surveiller quantité d'endroits sur des données malformées, genre :

@@ -90,7 +90,7 @@ class DataSourceSelectionWidget(CompositeWidget):
             value = self.get(name)
             if value:
                 values[name] = value
-        if values.get('type', '') == 'none':
+        if not values.get('type') or values.get('type') == 'none':
             values = None
         self.value = values or None

#11

Mis à jour par Paul Marillonnet il y a plus de 4 ans

  • Statut changé de Solution proposée à En cours
  • Patch proposed changé de Oui à Non

Ok nickel, c'est mieux comme ça, merci. Je vais donc écrire le test qui va avec, dans tests/test_widgets.py.

#12

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

  • Dupliqué par Development #36475: data sources: erreur d'identification d'une source de données ajouté
#13

Mis à jour par Frédéric Péters il y a 10 mois

  • Statut changé de En cours à Fermé

Ticket dupliqué/corrigé en #36851.

#14

Mis à jour par Frédéric Péters il y a 10 mois

  • Lié à Bug #36851: crash si on passe d'une data source "Url JSON" à "Aucun" ajouté

Formats disponibles : Atom PDF