Projet

Général

Profil

Support #24949

Crash sur un écrasement des rôles d'un utilisateur

Ajouté par Benjamin Dauvergne 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:
02 juillet 2018
Echéance:
% réalisé:

100%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Dans #24923 j'ai écrit un script qui importe des utilisateurs et des rôles via un CSV, dans ce script on affecte les rôles aux utilisateurs ainsi:

    user.roles = [role]

Opération qui je pense fait d'abord un .clear() de la relation, avant d'ajouter les nouvelles relations une par une (ou batché enfin ça ne change pas grand chose).

Ça a produit une exception dans le code de provisionning:

Traceback (most recent call last):
  File "/usr/lib/authentic2/manage.py", line 21, in <module>
    execute_from_command_line(sys.argv[:1] + argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.7/dist-packages/hobo/multitenant/management/commands/tenant_command.py", line 73, in run_from_argv
    klass.run_from_argv(args)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python2.7/dist-packages/hobo/agent/authentic2/apps.py", line 45, in new_execute
    return old_execute(self, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/python2.7/dist-packages/hobo/multitenant/management/commands/runscript.py", line 34, in handle
    runpy.run_module(module_name)
  File "/usr/lib/python2.7/runpy.py", line 180, in run_module
    fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/ecazenave/import-csv-auch.py", line 35, in <module>
    user.roles = [role]
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 1208, in __set__
    manager.clear()
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 1005, in clear
    model=self.model, pk_set=None, using=db)
  File "/usr/lib/python2.7/dist-packages/django/dispatch/dispatcher.py", line 189, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/usr/lib/python2.7/dist-packages/hobo/agent/authentic2/provisionning.py", line 353, in m2m_changed
    for other_instance in model.objects.filter(pk__in=pk_set):
  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 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/django/db/models/query.py", line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1310, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1338, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 1156, in build_filter
    value, lookups, used_joins = self.prepare_lookup_value(value, lookups, can_reuse, allow_joins)
  File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py", line 996, in prepare_lookup_value
    raise ValueError("Cannot use None as a query value")
ValueError: Cannot use None as a query value

Corrigé par cette modification locale pour faire tourner le script (modification retirée depuis):

diff --git a/hobo/agent/authentic2/provisionning.py b/hobo/agent/authentic2/provisionning.py
index 02fa237..a70a8e7 100644
--- a/hobo/agent/authentic2/provisionning.py
+++ b/hobo/agent/authentic2/provisionning.py
@@ -350,8 +350,9 @@ class Provisionning(object):
             return
         if sender is self.Role.members.through:
             self.saved(instance)
-            for other_instance in model.objects.filter(pk__in=pk_set):
-                self.saved(other_instance)
+            if pk_set:
+                for other_instance in model.objects.filter(pk__in=pk_set):
+                    self.saved(other_instance)
             if action == 'pre_clear':
                 # when the action is pre_clear we need to lookup the current value of the members
                 # relation, to re-provision all previously enroled users.

Fichiers

Révisions associées

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

provisionning: prevent ValueError on a user.roles.clear() (fixes #24949)

Historique

#1

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

  • Assigné à mis à Benjamin Dauvergne
#2

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

#3

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

  • Statut changé de Solution proposée à Solution validée
#4

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

  • Statut changé de Solution validée à Résolu (à déployer)
  • % réalisé changé de 0 à 100
#5

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF