Project

General

Profile

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

Added by Benjamin Dauvergne 2 months ago. Updated about 2 months ago.

Status:
Solution déployée
Priority:
Normal
Category:
-
Target version:
-
Start date:
19 March 2023
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

#1

Updated by Benjamin Dauvergne 2 months ago

  • Description updated (diff)
#2

Updated by Benjamin Dauvergne 2 months ago

  • Description updated (diff)
#3

Updated by Benjamin Dauvergne 2 months ago

  • Assignee set to Benjamin Dauvergne
#4

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 :

#5

Updated by Robot Gitea 2 months ago

  • Status changed from En cours to Solution proposée
#6

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 :

#7

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 :

#8

Updated by Transition automatique about 2 months ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF