Projet

Général

Profil

Bug #47645

crash indispo confusion guichet/agenda

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
13 octobre 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/usr/lib/python3/dist-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/lib/python3/dist-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/lib/python3/dist-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/usr/lib/python3/dist-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/usr/lib/python3/dist-packages/rest_framework/views.py" in dispatch
  495.             response = self.handle_exception(exc)

File "/usr/lib/python3/dist-packages/rest_framework/views.py" in handle_exception
  455.             self.raise_uncaught_exception(exc)

File "/usr/lib/python3/dist-packages/rest_framework/views.py" in dispatch
  492.             response = handler(request, *args, **kwargs)

File "/usr/lib/python3/dist-packages/chrono/api/views.py" in get
  563.                 for slot in generator_of_unique_slots

File "/usr/lib/python3/dist-packages/chrono/api/views.py" in <listcomp>
  556.                 {

File "/usr/lib/python3/dist-packages/chrono/api/views.py" in unique_slots
  521.             all_slots = list(get_all_slots(agenda, meeting_type, resources=resources, unique=True))

File "/usr/lib/python3/dist-packages/chrono/api/views.py" in get_all_slots
  159.         base = IntervalSet([agenda_id_min_max_datetime[desk.agenda_id]])

Exception Type: KeyError at /api/agenda/.../meetings/standard/datetimes/
Exception Value: 130

https://sentry.entrouvert.org/entrouvert/publik/issues/5753/


Fichiers

Révisions associées

Révision d98707ae (diff)
Ajouté par Lauréline Guérin il y a plus de 3 ans

api: ignore desks from other agendas in datetimes (#47645)

Historique

#1

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

J'ai tapé le patch en question sur la recette et ça m'a l'air ok mais il n'a pas encore tourné jenkins et je n'ai pas trop regardé ce code et je n'écrirai pas de test ce soir. (à prendre ou à compléter)

#3

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Description mis à jour (diff)
#4

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Assigné à mis à Lauréline Guérin

je vais ajouter des tests

#5

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Bizarre, on a agenda_id_min_max_datetime défini comme ça :

    for agenda in agendas:
        ... (rien qui fasse continue ou break ici)
        agenda_id_min_max_datetime[agenda.id] = (used_min_datetime, used_max_datetime)

donc il y a une entrée pour chaque agenda dans agendas.

Et desk_exceptions ce sont les exceptions issue du filtrage TimePeriodException.objects.filter(desk__agenda__in=agendas) donc impossible d'avoir un desk qui ne soit pas dans un agenda de agendas car c'est une ForeignKey donc un desk par TimePeriodException.

Pour moi le souci est dans le code entre qui modifie desks_exceptions, ici :

    # line 145
    # add exceptions from unavailability calendar
    for time_period_exception in TimePeriodException.objects.filter(
        unavailability_calendar__desks__agenda__in=agendas
    ).order_by('start_datetime', 'end_datetime'):
        for desk in time_period_exception.unavailability_calendar.desks.all():
            if desk not in desks_exceptions:
                desks_exceptions[desk] = IntervalSet()
            desks_exceptions[desk].add(
                time_period_exception.start_datetime, time_period_exception.end_datetime
            )

je pense que time_period_exception.unavailability_calendar.desks.all() contient des desk qui n'appartiennent pas à un agenda de agendas.

PS: je suggère donc un test qui mette en place cette situation et ici de remplacer all() par filter(agenda__in=agendas) bien que je ne sache pas trop ce que sont les unavailability_calendar, on doit pouvoir faire un

for time_period_exception in TimePeriodException.objects.filter(
        unavailability_calendar__desks__agenda__in=agendas
    ).order_by('start_datetime', 'end_datetime').prefetch(
        Prefetch('unavailability_calendar__desks', qs=Desk.objects.filter(agenda__in=agendas))):
pour éviter une requête par exception.
PS2: Prefetch avec to_attr pour pas mélanger.

#8

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

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

Ok.

#9

Mis à jour par Lauréline Guérin il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit d98707aeae9c70276cebd86b38d67641d237be24
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Thu Oct 15 14:44:06 2020 +0200

    api: ignore desks from other agendas in datetimes (#47645)
#10

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

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

Formats disponibles : Atom PDF