Projet

Général

Profil

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

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
19 mars 2023
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

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?).

Historique

#1

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

  • Description mis à jour (diff)
#2

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

  • Description mis à jour (diff)
#3

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

  • Assigné à mis à Benjamin Dauvergne
#4

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de Nouveau à En cours

Benjamin Dauvergne (bdauvergne) a ouvert une pull request sur Gitea concernant cette demande :

#5

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de En cours à Solution proposée
#6

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de Solution proposée à Solution validée

Lauréline Guérin (lguerin) a approuvé une pull request sur Gitea concernant cette demande :

#7

Mis à jour par Robot Gitea il y a environ un an

  • Statut changé de Solution validée à Résolu (à déployer)

Benjamin Dauvergne (bdauvergne) a mergé une pull request sur Gitea concernant cette demande :

#8

Mis à jour par Transition automatique il y a environ un an

  • Statut changé de Résolu (à déployer) à Solution déployée
#9

Mis à jour par Transition automatique il y a 11 mois

Automatic expiration

Formats disponibles : Atom PDF