Projet

Général

Profil

Bug #23857

crash sur import de rôle

Ajouté par Thomas Noël il y a presque 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
16 mai 2018
Echéance:
% réalisé:

100%

Temps estimé:
Patch proposed:
Oui
Planning:

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

Lié à Authentic 2 - Bug #23878: role natural_key_json ne rend pas compte des contraintes imposées sur les roles Rejeté17 mai 2018

Actions

Révisions associées

Révision 818737a7 (diff)
Ajouté par Benjamin Dauvergne il y a presque 6 ans

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.

Historique

#1

Mis à jour par Benjamin Dauvergne il y a presque 6 ans

C'est sur quelle instance ? que je puisse rejouer l'import en ligne de comande Les rôles sont là mais il doit forcément en manquer, donc plusieurs soucis en même temps:
  • 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)
#2

Mis à jour par Frédéric Péters il y a presque 6 ans

connexion-up.test.entrouvert.org.

#3

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.

#4

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': ''}}

#5

Mis à jour par Benjamin Dauvergne il y a presque 6 ans

Emmanuel Cazenave a écrit :

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.

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.

#6

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']
]

#7

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é
#8

Mis à jour par Benjamin Dauvergne il y a presque 6 ans

À relire, le traitement des NULL était à refaire, avec un petit peu d'explicit is better than implicit dedans.

#9

Mis à jour par Emmanuel Cazenave il y a presque 6 ans

Testé grandeur nature et je pense que c'est bon, ack.

#10

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
#11

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

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF