Bug #21800
Offrir un message sympa en situation de slug dupliqué
0%
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
Historique
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.
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)
Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans
- Fichier 0001-manager-raise-a-ValidationError-on-duplicated-slug-2.patch 0001-manager-raise-a-ValidationError-on-duplicated-slug-2.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
J'ai renvoyé une ValidationError sur le champ titre :
'meteo' slug is already used
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.
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.
Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 4 ans
- Fichier 0001-admin-make-slug-editable-on-connector-create-view-21.patch 0001-admin-make-slug-editable-on-connector-create-view-21.patch ajouté
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 !
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
- Statut changé de Solution proposée à Solution validée
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
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
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.
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)
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
admin: make slug editable on connector create view (#21800)