Support #24949
Crash sur un écrasement des rôles d'un utilisateur
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
Historique
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- Fichier 0001-provisionning-prevent-ValueError-on-a-user.roles.cle.patch 0001-provisionning-prevent-ValueError-on-a-user.roles.cle.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Emmanuel Cazenave il y a presque 6 ans
- Statut changé de Solution proposée à Solution validée
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
Appliqué par commit a5410340fecc0672717fddedb7227bf3a48da545.
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
provisionning: prevent ValueError on a user.roles.clear() (fixes #24949)