Projet

Général

Profil

Bug #75587

Mis à jour par Benjamin Dauvergne il y a environ un an

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

<pre>
# 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')
)
</pre>

La valeur d'agenda_id arrive de cette boucle plus haut dans le code :
<pre>
# 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])
)
</pre>

À mon avis il faut juste supprimer cette ligne pour que le code soit juste
<pre>
agenda__in=agenda_ids,
</pre>
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?).

Retour