Projet

Général

Profil

Bug #28395

Crash Import exception : MultipleObjectsReturned

Ajouté par Emmanuel Cazenave il y a plus de 5 ans. Mis à jour il y a 5 mois.

Statut:
Rejeté
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
27 novembre 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

export.json (132 ko) export.json Emmanuel Cazenave, 27 novembre 2018 14:37
Calendrier de PASSPORT.ics (259 ko) Calendrier de PASSPORT.ics Emmanuel Cazenave, 27 novembre 2018 14:37
site-export.json (96,2 ko) site-export.json Emmanuel Cazenave, 27 novembre 2018 14:37
0001-wip.patch (1,99 ko) 0001-wip.patch Emmanuel Cazenave, 27 novembre 2018 15:58

Historique

#2

Mis à jour par Serghei Mihai il y a plus de 5 ans

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

#3

Mis à jour par Serghei Mihai il y a plus de 5 ans

(ok, pigé).

#4

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).

#5

Mis à jour par Emmanuel Cazenave il y a plus de 5 ans

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

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.

#7

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).

#8

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. »

#9

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.

Formats disponibles : Atom PDF