Bug #47645
crash indispo confusion guichet/agenda
0%
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
Historique
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Fichier 0001-misc-skip-desks-from-other-agendas-when-computing-av.patch 0001-misc-skip-desks-from-other-agendas-when-computing-av.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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)
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
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.Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0001-api-ignore-desks-from-other-agendas-in-datetimes-476.patch 0001-api-ignore-desks-from-other-agendas-in-datetimes-476.patch ajouté
c'est tout à fait ce que j'étais en train de coder :)
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Fichier 0001-api-ignore-desks-from-other-agendas-in-datetimes-476.patch 0001-api-ignore-desks-from-other-agendas-in-datetimes-476.patch ajouté
(avec un to_attr)
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
- Statut changé de Solution proposée à Solution validée
Ok.
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)
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
api: ignore desks from other agendas in datetimes (#47645)