Bug #75587
get_all_slots() : l'exclusion des créneaux pour un même user_external_id ne prend pas en compte tous les agendas
0%
Description
(trouvé fortuitement en reprenant #17685 et en tentant de tester les lock_code avec l'exclusion par user_external_id sur deux agendas indépendants)
Dans ce code on a un agenda_id qui arrive qui n'est jamais défini dans cette partie et qui arrive en fait d'un boucle précédente pour l'exclusion des rdv bookés sur les agendas visés, il me semble que le but est d'exclure tous les créneaux de quelque agenda qu'ils viennent pour le même user_external_id.
# aggregate already booked time intervals by excluded_user_external_id user_bookings = IntervalSet() if user_external_id: used_min_datetime, used_max_datetime = ( min(v[0] for v in agenda_id_min_max_datetime.values()), max(v[1] for v in agenda_id_min_max_datetime.values()), ) booked_events = ( Event.objects.filter( agenda__in=agenda_ids, start_datetime__gte=used_min_datetime - max_meeting_duration_td, start_datetime__lte=used_max_datetime, booking__user_external_id=user_external_id, ) .exclude(booking__cancellation_datetime__isnull=False) # ordering is important for the later groupby, it works like sort | uniq .order_by('start_datetime', 'meeting_type__duration') .values_list('start_datetime', 'meeting_type__duration') )
La valeur d'agenda_ids arrive de cette boucle plus haut dans le code :
# aggregate already booked time intervals by desk bookings = {} for (used_min_datetime, used_max_datetime), agenda_ids in agenda_ids_by_min_max_datetimes.items(): booked_events = ( Event.objects.filter( agenda__in=agenda_ids, start_datetime__gte=used_min_datetime - max_meeting_duration_td, start_datetime__lte=used_max_datetime, ) .exclude(booking__cancellation_datetime__isnull=False) # ordering is important for the later groupby, it works like sort | uniq .order_by('desk_id', 'start_datetime', 'meeting_type__duration') .values_list('desk_id', 'start_datetime', 'meeting_type__duration') ) if lock_code: booked_events = booked_events.exclude(booking__lease__lock_code=lock_code) # compute exclusion set by desk from all bookings, using # itertools.groupby() to group them by desk_id bookings.update( ( desk_id, IntervalSet.from_ordered( (event_start_datetime, event_start_datetime + datetime.timedelta(minutes=event_duration)) for desk_id, event_start_datetime, event_duration in values ), ) for desk_id, values in itertools.groupby(booked_events, lambda be: be[0]) )
À mon avis il faut juste supprimer cette ligne pour que le code soit juste
agenda__in=agenda_ids,
après la description de la fonctionnalité n'ayant pas été ajoutée à la docstring de get_all_slots() ni vraiment décrite précisément dans #51341 (ni dans le pad https://pad.libre-entreprise.org/p/eo-fred-la-famille) le comportement voulu est difficile à déterminer, mais là c'est forcément pas bon, ça ne prend pas en compte tous les agendas d'un agenda virtuel ou bien pas en compte tous les agendas du même type (est-ce qu'on doit aussi exclure les Event des agendas de type évènement quand on prend un rdv?).
History
Updated by Robot Gitea 2 months ago
- Status changed from Nouveau to En cours
Benjamin Dauvergne (bdauvergne) a ouvert une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/chrono/pulls/59
- Titre : WIP: get_all_slots() : l'exclusion des créneaux pour un même user_external_id ne prend pas en compte tous les agendas (#75587)
- Modifications : https://git.entrouvert.org/entrouvert/chrono/pulls/59/files
Updated by Robot Gitea 2 months ago
- Status changed from Solution proposée to Solution validée
Lauréline Guérin (lguerin) a approuvé une pull request sur Gitea concernant cette demande :
Updated by Robot Gitea 2 months ago
- Status changed from Solution validée to Résolu (à déployer)
Benjamin Dauvergne (bdauvergne) a mergé une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/chrono/pulls/59
- Titre : get_all_slots() : l'exclusion des créneaux pour un même user_external_id ne prend pas en compte tous les agendas (#75587)
- Modifications : https://git.entrouvert.org/entrouvert/chrono/pulls/59/files
Updated by Transition automatique about 2 months ago
- Status changed from Résolu (à déployer) to Solution déployée