Bug #23857
crash sur import de rôle
100%
Description
Import via l'UI du fichier ci-joint.
L'import se termine par une 500... mais les rôles sont quand même là (pas de rollback).
Internal Server Error: /manage/site-import/ 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/authentic2/manager/views.py", line 649, in dispatch return super(SiteImportView, self).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 215, in post return self.form_valid(form) File "/usr/lib/python2.7/dist-packages/authentic2/manager/views.py", line 639, in form_valid import_site(json_site, ImportContext()) File "/usr/lib/python2.7/dist-packages/authentic2/data_transfer.py", line 264, in import_site result.update_parentings(*ds.parentings()) File "/usr/lib/python2.7/dist-packages/authentic2/data_transfer.py", line 160, in parentings parent = search_role(parent_d) File "/usr/lib/python2.7/dist-packages/authentic2/data_transfer.py", line 42, in search_role return Role.objects.get_by_natural_key_json(role_d) File "/usr/lib/python2.7/dist-packages/authentic2/natural_key.py", line 90, in get_by_natural_key_json return self.get(**get_kwargs) 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 338, in get (self.model._meta.object_name, num) MultipleObjectsReturned: get() returned more than one Role -- it returned 7! Request repr(): <WSGIRequest path:/manage/site-import/, ...
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- manque l'interception de MultipleObjectsReturned
- l'import doit être fait dans une transaction (j'ai l'impression qu'on a plus ATOMIC_REQUESTS qui marche sur a2 je vais vérifier ça)
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Reproduit chez moi.
Pour la partie MultipleObjectsReturned
:
chez moi les données suivantes en base :
"5";"0e42cde972f24b8da909954db729ce7c";"Administrateur de Hobo";"_a2-hobo-superuser";"''";;;1;1;"''" "6";"20965081314d4472a6fa626e672aac64";"Administrateur de Portail Citoyen";"_a2-hobo-superuser";"''";;;1;2;"''" "7";"be8e1347004f4a019be83ac2edef8e93";"Administrateur de Portail Agent";"_a2-hobo-superuser";"''";;;1;3;"''" "8";"a942bda5373a46ebaa8b4a310f756536";"Administrateur de Démarches";"_a2-hobo-superuser";"''";;;1;4;"''" "9";"f88299540d6248b4bcdeb2fd085494bf";"Administrateur de Passerelle";"_a2-hobo-superuser";"''";;;1;5;"''" "10";"869cb49526cb4f559687e1a0428a5dcc";"Administrateur de Porte-documents";"_a2-hobo-superuser";"''";;;1;6;"''" "11";"963049ee416d4a9bb684a178c9091933";"Administrateur de Agendas";"_a2-hobo-superuser";"''";;;1;7;"''" "12";"5052be4800db4cc28b45d87da1f6d3d8";"Administrateur de Annonces";"_a2-hobo-superuser";"''";;;1;8;"''"
Plusieurs roles avec le même slug '_a2-hobo-superuser', liés à la même OU.
Or si ma mémoire est bonne, on suppose dans le nouveau système de natural_key_json
, pour les roles, une unicité des slugs par OU.
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Pour ATOMIC_REQUESTS, sur le tenant local où je reproduis le bug :
In [3]: settings.DATABASES Out[3]: {'default': {'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'ENGINE': 'tenant_schemas.postgresql_backend', 'HOST': '', 'NAME': 'authentic2_multitenant', 'OPTIONS': {}, 'PASSWORD': '', 'PORT': '', 'SCHEMA': 'public', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIRROR': None, 'NAME': None}, 'TIME_ZONE': 'UTC', 'USER': ''}}
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
Emmanuel Cazenave a écrit :
En fait la règle complète c'est:Reproduit chez moi.
Pour la partie
MultipleObjectsReturned
:chez moi les données suivantes en base :
[...]
Plusieurs roles avec le même slug '_a2-hobo-superuser', liés à la même OU.
Or si ma mémoire est bonne, on suppose dans le nouveau système de
natural_key_json
, pour les roles, une unicité des slugs par OU.
- si pas d'OU, par slug
- si OU et pas de service, par OU et par slug
- si OU et service, par slug, OU et service
Je vais voir si on a bien fait ça.
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Benjamin Dauvergne a écrit :
En fait la règle complète c'est:
- si pas d'OU, par slug
- si OU et pas de service, par OU et par slug
- si OU et service, par slug, OU et service
Je vais voir si on a bien fait ça.
On fait pas ça :
Role._meta.natural_key = [ ['uuid'], ['slug', 'ou'], ['name', 'ou'], ['slug', 'service'], ['name', 'service'] ]
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
- Lié à Bug #23878: role natural_key_json ne rend pas compte des contraintes imposées sur les roles ajouté
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- Fichier 0001-natural_key-fix-get_by_natural_key_json-for-objects-.patch 0001-natural_key-fix-get_by_natural_key_json-for-objects-.patch ajouté
- Patch proposed changé de Non à Oui
À relire, le traitement des NULL était à refaire, avec un petit peu d'explicit is better than implicit dedans.
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
Testé grandeur nature et je pense que c'est bon, ack.
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- Statut changé de Nouveau à Résolu (à déployer)
- % réalisé changé de 0 à 100
Appliqué par commit authentic2|818737a7c6acecef0d879d898327221bee2bc2f2.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Résolu (à déployer) à Fermé
natural_key: fix get_by_natural_key_json for objects with partial unique indexes (fixes #23857)
Unicity on NULL column must be explicitely stated in the list of natural
keys.