Projet

Général

Profil

Bug #26580

crash à l'import d'un csv dont l'autodétection de format ne passe pas

Ajouté par Thomas Noël il y a plus de 5 ans. Mis à jour il y a plus de 5 ans.

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

100%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Ça fait une sale 500 à l'écran

Internal Server Error: /manage/csvdatasource/add
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/passerelle/views.py", line 135, in dispatch
    request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/views/generic/base.py", line 89, in dispatch
    return handler(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/views/generic/edit.py", line 249, in post
    return super(BaseCreateView, self).post(request, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/views/generic/edit.py", line 215, in post
    return self.form_valid(form)
  File "/usr/lib/python2.7/dist-packages/passerelle/views.py", line 151, in form_valid
    response = super(GenericCreateConnectorView, self).form_valid(form)
  File "/usr/lib/python2.7/dist-packages/django/views/generic/edit.py", line 193, in form_valid
    self.object = form.save()
  File "/usr/lib/python2.7/dist-packages/passerelle/forms.py", line 24, in save
    return super(GenericConnectorForm, self).save(commit=commit)
  File "/usr/lib/python2.7/dist-packages/django/forms/models.py", line 459, in save
    construct=False)
  File "/usr/lib/python2.7/dist-packages/django/forms/models.py", line 105, in save_instance
    instance.save()
  File "/usr/lib/python2.7/dist-packages/passerelle/apps/csvdatasource/models.py", line 133, in save
    dialect = csv.Sniffer().sniff(content)
  File "/usr/lib/python2.7/csv.py", line 188, in sniff
    raise Error, "Could not determine delimiter" 
Error: Could not determine delimiter

Fichiers

Révisions associées

Révision 31016366 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 5 ans

report failure to detect CSV dialect (fixes #26580)

Révision f58615f2 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 5 ans

fix infinite recursion in dialect_options() (#26580)

Historique

#1

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

  • Tracker changé de Support à Bug
#2

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Assigné à mis à Benjamin Dauvergne
#3

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

#4

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

  • Statut changé de Solution proposée à Solution validée

Dans l'idée que le save() serait utilisé ailleurs, par exemple une commande de manage pour mettre à jour le fichier CSV, ne serait-il pas nécessaire qu'on y laisse la détection du dialecte, même si elle a déjà été faite ?

Mais bon, on le fait déjà pas pour le cas "file_type in ('ods', 'xls', 'xlsx') and not self.sheet_name", donc ...

Ack. (et merci)

#5

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Thomas Noël a écrit :

Dans l'idée que le save() serait utilisé ailleurs, par exemple une commande de manage pour mettre à jour le fichier CSV, ne serait-il pas nécessaire qu'on y laisse la détection du dialecte, même si elle a déjà été faite ?

Premio, premature optimization, on a pas encore le souci, deuxio, c'est mal de faire des contrôles dans le .save() en fait, initialiser une valeur dérivée dont par contre tu es certain oui (suite au check dans .clean()), si t'as besoin d'un contrôle, t'appelles Model.full_clean()[1], on a pris de mauvaises habitudes à ce sujet, le problème de .save() c'est que c'est appelé à plein d'endroits qui n'ont pas de moyen de récupérer les exceptions et donc ça doit être généralement error-proof, et le plus simple pour un truc comme dialect_options qui n'est que du cache après tout (on pourrait faire le sniff() à chaque chargement aussi) c'est d'utiliser un accesseur qui réinitialise le truc quand il est vide.

1 https://docs.djangoproject.com/fr/2.1/ref/models/instances/#django.db.models.Model.full_clean

Mais bon, on le fait déjà pas pour le cas "file_type in ('ods', 'xls', 'xlsx') and not self.sheet_name", donc ...

Ack. (et merci)

#6

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
  • % réalisé changé de 0 à 100
#7

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

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

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

  • Statut changé de Solution déployée à En cours
#9

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Ma faute pas lancé tous les tests :/ En fait il y a un problème sous-jacent plus
sioux de récursion entre dialect_options/save/cache_data.

#10

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

  • Statut changé de Solution proposée à Solution validée

go.

#11

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Solution validée à Solution déployée
#12

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

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

(je ne sais pas si c'est volontaire ou une erreur dans ton script, mais il faudrait plutôt passer vers "résolu (à déployer)").

#13

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Non action manuelle, je n'étais plus au fait des statuts pour les projets EO, je le note.

#14

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

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

Formats disponibles : Atom PDF