Bug #17239
clé dupliquée lors d'une migration
0%
Description
File "/usr/lib/python2.7/dist-packages/authentic2/a2_rbac/signal_handlers.py", line 48, in post_migrate_update_rbac update_content_types_roles() File "/usr/lib/python2.7/dist-packages/authentic2/a2_rbac/management.py", line 123, in update_content_types_roles update_name=True) File "/usr/lib/python2.7/dist-packages/authentic2/a2_rbac/managers.py", line 34, in get_admin_role update_slug=update_slug) File "/usr/lib/python2.7/dist-packages/authentic2/a2_rbac/managers.py", line 63, in get_mirror_role }, **kwargs) File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 407, in get_or_create return self._create_object_from_params(lookup, params) File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 447, in _create_object_from_params six.reraise(*exc_info) File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 439, in _create_object_from_params obj = self.create(**params) File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 348, in create obj.save(force_insert=True, using=self.db) File "/usr/lib/python2.7/dist-packages/authentic2/a2_rbac/models.py", line 147, in save return super(Role, self).save(*args, **kwargs) File "/usr/lib/python2.7/dist-packages/django_rbac/models.py", line 60, in save return super(AbstractBase, 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 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) django.db.utils.IntegrityError: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « a2_rbac_role_admin_scope_ct_id_632506495f341476_uniq » DETAIL: La clé « (admin_scope_ct_id, admin_scope_id)=(36, 4) » existe déjà.
(Pdb) self.prefetch_related('permissions').get(admin_scope_ct=ct, admin_scope_id=instance.pk) <Role u'_a2-administrateur-des-utilisateurs' u'Administrateur des utilisateurs'> (Pdb) self.prefetch_related('permissions').get_or_create(admin_scope_ct=ct, admin_scope_id=instance.pk, defaults={'name': name, 'slug': slug}, **kwargs) *** IntegrityError: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « a2_rbac_role_admin_scope_ct_id_632506495f341476_uniq » DETAIL: La clé « (admin_scope_ct_id, admin_scope_id)=(36, 4) » existe déjà. (Pdb) p kwargs {'ou__isnull': True}
(alors que l'existante a ou_id = 1)
Note de Benjamin : y a une permission sans limitation d'ou qui s'est retrouvée sur un rôle restreint à une ou.
Contourné dans a2_rbac/managers.py
if ou or getattr(instance, 'ou', None): kwargs['ou'] = ou or instance.ou else: - kwargs['ou__isnull'] = True + pass # kwargs['ou__isnull'] = True
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 6 ans
- Statut changé de Nouveau à Information nécessaire
En attente d'une nouvelle occurrence du problème pour pouvoir y voir plus claire.
Mis à jour par Anonyme il y a environ 6 ans
Benjamin Dauvergne a écrit :
En attente d'une nouvelle occurrence du problème pour pouvoir y voir plus claire.
J'ai retrouvé ce bug à l’exécution d'un test aujourd'hui (mais avec django 1.9, donc je ne sais pas vraiment si c'est dû à la mise à jour : <tests.test_all.UserProfileTests testMethod=test_noneditable_profile_attributes>. Le crash a lieu à la ligne 277 qui est la dernière de ces lignes :
models.Attribute.objects.update(disabled=True) models.Attribute.objects.create( label=u'custom', name='custom', required=False, user_editable=False, kind='string')
IntegrityError: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « authentic2_attribute_label_key » DETAIL: La clé « (label)=(custom) » existe déjà.
Mis à jour par Benjamin Dauvergne il y a environ 6 ans
Euh je ne crois pas que ce soit lié, était-ce pendant une migration et lié à l'index a2_rbac_role_admin_scope_ct_id_632506495f341476_uniq ?
Mis à jour par Anonyme il y a environ 6 ans
Benjamin Dauvergne a écrit :
Euh je ne crois pas que ce soit lié, était-ce pendant une migration et lié à l'index a2_rbac_role_admin_scope_ct_id_632506495f341476_uniq ?
non effectivement, fausse alerte
Mis à jour par Benjamin Dauvergne il y a 4 mois
- Statut changé de Information nécessaire à Fermé
- Planning mis à Non
Je n'ai plus constaté ce genre d'erreurs (rien dans sentry qui y ressemble) et il y a eu pas mal de travail dans a2_rbac.managers qui a du supprimé les cas produisant cette situation.