Project

General

Profile

Bug #28395

Crash Import exception : MultipleObjectsReturned

Added by Emmanuel Cazenave 5 months ago. Updated 5 months ago.

Status:
Nouveau
Priority:
Normal
Assignee:
-
Category:
-
Start date:
27 Nov 2018
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

Signalé ici #28325, reproduit chez moi sur un tenant local (export a2 et chrono joints, puis importer "Calendrier de PASSPORT.ics" dans les exceptions de l'Agenda "CNI et PASSEPORT" guichet "PASSEPORT").

Traceback (most recent call last):
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/cazino/src/chrono/chrono/manager/views.py", line 470, in dispatch
    return super(ManagedAgendaSubobjectMixin, self).dispatch(request, *args, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 240, in post
    return super(BaseUpdateView, self).post(request, *args, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 183, in post
    return self.form_valid(form)
  File "/home/cazino/src/chrono/chrono/manager/views.py", line 773, in form_valid
    exceptions = form.instance.create_timeperiod_exceptions_from_ics(ics_file_content)
  File "/home/cazino/src/chrono/chrono/agendas/models.py", line 550, in create_timeperiod_exceptions_from_ics
    obj, created = TimePeriodException.objects.update_or_create(defaults=event, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/db/models/query.py", line 480, in update_or_create
    obj = self.select_for_update().get(**lookup)
  File "/home/cazino/envs/publik-env/local/lib/python2.7/site-packages/django/db/models/query.py", line 384, in get
    (self.model._meta.object_name, num)
MultipleObjectsReturned: get() returned more than one TimePeriodException -- it returned 8!

export.json (132 KB) Emmanuel Cazenave, 27 Nov 2018 02:37 PM

Calendrier de PASSPORT.ics View (259 KB) Emmanuel Cazenave, 27 Nov 2018 02:37 PM

site-export.json (96.2 KB) Emmanuel Cazenave, 27 Nov 2018 02:37 PM

0001-wip.patch View (1.99 KB) Emmanuel Cazenave, 27 Nov 2018 03:58 PM

History

#2 Updated by Serghei Mihai 5 months ago

Pourquoi l'export d'authentic est nécessaire?

#3 Updated by Serghei Mihai 5 months ago

(ok, pigé).

#4 Updated by Emmanuel Cazenave 5 months ago

Je sais pas si c'est nécessaire dans ce cas précis, mais j'importe toujours a2 en premier sans me poser de questions (la doc dit ça quelque part).

#5 Updated by Emmanuel Cazenave 5 months ago

Un embryon de patch.

En gros le bug, c'est qu'on fait des TimePeriodException.objects.update_or_create(defaults=event, **kwargs) avec quasiment rien dans kwargs (desk, label, recurrence_id), du coup c'est vite fait que ça pète une MultipleObjectsReturned

J'ai commencé les boulot pour les exceptions simples, mais pour les récurrentes il y a des subtilités qui m'échappent dans l'import, je laisse la main à un spécialiste.

#6 Updated by Benjamin Dauvergne 5 months ago

C'est une utilisation anormale de l'outil, l'import manuel ne peut pas concerner des mises à jour, uniquement des ajouts. Le code est écrit ainsi, la mise à jour ne marche que si le label de l'exception est unique, ton changement va casser la mise à jour via URL (ou on veut mettre à jour start/end par contre), là si en plus on a des exceptions manuelles avec des labels identique, c'est fini, plus rien ne marche.

Clairement le mode actuel d'import manuel ne marche pas, surtout parce que les limitations sont trop difficiles à expliquer, il faudrait l'abandonner et fonctionner uniquement en synchronisation via uid/recurrence_id (ça veut keep_sync_by_uid=True tout le temps) comme pour la synchronisation avec un fichier distant, en plus j'ai l'impression que 100% des outils d'agenda génère un tel UID. C'est juste limitant pour les gens qui essaieraient d'en créer à la main.

#7 Updated by Laurent Séguin 5 months ago

Benjamin Dauvergne a écrit :

C'est une utilisation anormale de l'outil, l'import manuel ne peut pas concerner des mises à jour, uniquement des ajouts.

Tant qu'on a pas mieux, c'est fonctionnellement acceptable de faire gameler proprement ce genre d'utilisation (aka: présenter un message d'erreur/refus à l'utilisateur).

#8 Updated by Benjamin Dauvergne 5 months ago

Le mieux qu'on puisse faire c'est "Import impossible: il y a déjà 8 exceptions avec le "Libellé optionnel pour identifier la date": "Réunion du service" » (parce qu'en plus le libellé est optionnel...).

Pour moi autant dégager ça et faire mieux, si un .ICS contient un évènement sans identifiant unique, on n'importe rien, on met un message d'erreur: « Ce fichier ICS ne contient pas d'identifiant unique (UID) pour l'évènement start/end/label , l'import est impossible. »

Also available in: Atom PDF