Projet

Général

Profil

Bug #17239

clé dupliquée lors d'une migration

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
29 juin 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

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

#1

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.

#2

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à.
#3

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 ?

#4

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

#5

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.

Formats disponibles : Atom PDF