Bug #72475
Les périodes horaires uniques se masquent les unes les autres
0%
Description
Si elles sont même jour de la semaine + même heure...
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Valentin Deniaud il y a plus d'un an
- Fichier 0001-agendas-compare-all-WeekTime-attributes-by-default-7.patch 0001-agendas-compare-all-WeekTime-attributes-by-default-7.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Joli bug.
Ça se joue dans Agenda.get_effective_time_periods_meetings et l'utilisation de itertools.groupby :
for weektime_interval, time_periods in itertools.groupby( time_periods.prefetch_related('desk').order_by('weekday', 'start_time', 'end_time'), key=TimePeriod.as_weektime_interval, )
Ici on ordonne le queryset « time_periods » en SQL.
Or dans la doc de Python, https://docs.python.org/3/library/itertools.html#itertools.groupby
Generally, the iterable needs to already be sorted on the same key function.
Donc on voit ici qu'on est à moitié dans les clous, on n'a pas ordonné avec la même fonction mais avec du SQL qu'on espère équivalent.
Sauf que depuis que time_periods a gagné un champ weekday_indexes (puis date), ce n'est plus équivalent.
Le péché originel qui fait que ce n'est plus équivalent c'est #65849.
Ce patch c'est moi qui me suit aperçu que la comparaison entre période d'exclusion et période horaire avec numéro de semaine se passait mal, et qui me suit dit « ok on va pas comparer ».
Mais si on ne compare plus on tombe sur le bug présent, on regroupe des périodes qui en fait ne sont pas les même (pas le même weekday_indexes, puis pas la même date). Mais ce regroupement fautif est rare, masqué par l'utilisation borderline de itertools.groupby.
(en vrai j'ai peur de toucher à cette ligne avec itertools donc je la laisse tranquille, elle n'est pas en soit fautive elle rend juste l'analyse plus compliquée)
Tout ça pour dire, le fix c'est de revenir sur #65849 et d'inverser la logique : plutôt que de ne jamais comparer, toujours tout comparer et court-circuiter la comparaison au seul endroit où ça foire.
(et là dessus on est pas aidés par la généricité du code dans interval.py, le code pourrait être nettement moins générique et beaucoup plus simple à suivre/faire évoluer)
Mis à jour par Emmanuel Cazenave il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
Mis à jour par Valentin Deniaud il y a plus d'un an
- Statut changé de Solution validée à Résolu (à déployer)
commit 46b70f6d0533044bd03919927c39abe1a0bbe10c Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Dec 15 15:00:25 2022 +0100 agendas: compare all WeekTime attributes by default (#72475)
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Benjamin Dauvergne il y a environ un an
- Lié à Development #76571: Revoir la logique dans get_effective_timeperiods avec l'introduction de weekday_indexes ajouté
agendas: compare all WeekTime attributes by default (#72475)