Projet

Général

Profil

Bug #21800

Offrir un message sympa en situation de slug dupliqué

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

Statut:
Fermé
Priorité:
Normal
Version cible:
-
Début:
12 février 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Plutôt qu'une erreur 500.

  File "/usr/lib/python2.7/dist-packages/passerelle/apps/csvdatasource/models.py", line 134, in save
    return super(CsvDataSource, self).save(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 734, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 762, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 846, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/lib/python2.7/dist-packages/django/db/models/base.py", line 885, in _do_insert
    using=using, raw=raw)
  File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 920, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 974, in execute_sql
    cursor.execute(sql, params)
  File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/python2.7/dist-packages/django/db/utils.py", line 100, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
IntegrityError: ERREUR:  la valeur d'une clé dupliquée rompt la contrainte unique « csvdatasource_csvdatasource_slug_6d83a886f7f6cc4a_uniq »
DETAIL:  La clé « (slug)=(directions-nancy) » existe déjà.

Fichiers

Révisions associées

Révision 135bd728 (diff)
Ajouté par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

admin: make slug editable on connector create view (#21800)

Historique

#1

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

Une trace récente,

File "/usr/lib/python2.7/dist-packages/passerelle/views.py" in form_valid
  185.             response = super(GenericCreateConnectorView, self).form_valid(form)

File "/usr/lib/python2.7/dist-packages/django/views/generic/edit.py" in form_valid
  162.         self.object = form.save()

File "/usr/lib/python2.7/dist-packages/passerelle/forms.py" in save
  25.         return super(GenericConnectorForm, self).save(commit=commit)

[...]

File "/usr/lib/python2.7/dist-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

Exception Type: IntegrityError at /manage/orange/add
Exception Value: duplicate key value violates unique constraint "sms_orange_slug_key" 
DETAIL:  Key (slug)=(sms-orange) already exists.
#2

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

  • Assigné à mis à Nicolas Roche (absent jusqu'au 3 avril)
#3

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

J'ai renvoyé une ValidationError sur le champ titre :

'meteo' slug is already used

#4

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

Peut-être que le message d'erreur pourrait directement pointer le titre du connecteur qui pose problème plutôt que de parler de slug ?

Genre :

     other = self.instance.__class__.objects.filter(slug=slug).first()
     if other:
         raise ValidationError(_('Title clashes with title of connector "{0.title}"').format(other))

Sinon l'approche dans l'admin Django c'est plutôt que de générer le slug en loosedé dans un Form.save() avoir un bout de JS qui convertit automatiquement le titre en slug (on doit même pouvoir le pomper facilement) si le champ slug est vide; comme cela c'est plus clair et on a besoin de rien d'autre ModelForm faisant déjà la validation d'unicité sur le champ slug avec le bon message.

#5

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

Benjamin Dauvergne a écrit :

Sinon l'approche dans l'admin Django c'est plutôt que de générer le slug en loosedé dans un Form.save() avoir un bout de JS qui convertit automatiquement le titre en slug (on doit même pouvoir le pomper facilement) si le champ slug est vide; comme cela c'est plus clair et on a besoin de rien d'autre ModelForm faisant déjà la validation d'unicité sur le champ slug avec le bon message.

Je trouverais ça sympa aussi, que le slug soit visible (et modifiable) sur l'UI de création d'un nouveau connecteur.

#6

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

slugify.js est copié/collé depuis wcs/qommon/static/js/qommon.slugify.js
(provient de #6861 puis #15663)

on obtient à présent le message défini dans django/db/models/base.py::Model::unique_error_message() :

Un objet Qualité de l'air avec ce champ Identifiant existe déjà.

Merci Thomas pour le coup de main !

#7

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

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

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

  • Statut changé de Solution validée à En cours

De Nicolas,

pour 21800 il faut encore que je change l'ordre des champs dans le model pour éviter de me taper pleins de migrations

#9

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

  • Statut changé de En cours à Solution proposée

En fait non (j'ai mal présumé), il n'y a pas d'impact sur la BD.

J'ai pourtant fait passer le champs slug au dessus du champs description dans le model BaseRessource,
mais il semblerait que les champs sont gérés individuellement en base :

$ passerelle-manage makemigrations --dry-run -v3
No changes detected

#10

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

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

Je remets alors la validation par Benjamin.

#11

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 135bd728f4d21f0ce7f4b11867c729469efbe7d6
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Oct 16 16:14:04 2019 +0200

    admin: make slug editable on connector create view (#21800)
#12

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

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

Formats disponibles : Atom PDF