Bug #28395
Crash Import exception : MultipleObjectsReturned
0%
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!
Fichiers
Historique
Mis à jour par Emmanuel Cazenave il y a plus de 5 ans
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).
Mis à jour par Emmanuel Cazenave il y a plus de 5 ans
- Fichier 0001-wip.patch 0001-wip.patch ajouté
- Patch proposed changé de Non à Oui
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.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
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.
Mis à jour par Laurent Séguin il y a plus de 5 ans
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).
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
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. »
Mis à jour par Valentin Deniaud il y a 5 mois
- Statut changé de Nouveau à Rejeté
- Planning mis à Non
Le fichier semble s'importer, et la méthode en question n'existe plus.