Projet

Général

Profil

Bug #46145

Les créneaux d'un guichet ne sont pas vus dans via l'API (dans certaines conditions non éclaircies)

Ajouté par Emmanuel Cazenave il y a plus de 3 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
27 août 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

C'est #46115 où les créneaux d'un guichet (le guichet 5) passent à la trappe sur le endpoint datetime.

Il y a un bout de code qui foire dans get_all_slots :

desks_by_min_max_datetime = {
    datetime_range: list(desks)
    for datetime_range, desks in itertools.groupby(
        time_period.desks,
        key=lambda desk: desk_min_max_datetime.get(desk, agenda_id_min_max_datetime[desk.agenda_id]),                                                                                                    
    )
}

Avec dans les conditions du ticket client le guichet 5 qui passe à la trappe dans desks_by_min_max_datetime :

(Pdb) time_period.desks
{<Desk: Guichet 5>, <Desk: Guichet 6>, <Desk: Guichet 1>, <Desk: Guichet 2>, <Desk: Guichet 3>, <Desk: Guichet 4>}      

(Pdb) desk_min_max_datetime
{<Desk: Guichet 1>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 2>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 3>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 10, 2, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 4>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 5>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)), <Desk:
Guichet 6>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 9, 3, 0, 0, tzinfo=<UTC>))}

(Pdb) desks_by_min_max_datetime
{(datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 4>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 9, 3,
0, 0, tzinfo=<UTC>)): [<Desk: Guichet 6>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 1>, <Desk: Guichet 2>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 10, 2, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 3>]}

S'ensuit une itération sur desks_by_min_max_datetime d'où le guichet 5 est absent, etc.


Fichiers

Révisions associées

Révision 38df08da (diff)
Ajouté par Emmanuel Cazenave il y a plus de 3 ans

api: use a for loop instead of itertools.group_by (#46145)

Historique

#1

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

  • Statut changé de Nouveau à En cours
  • Assigné à mis à Emmanuel Cazenave
#2

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

Je n'arrive pas à reproduire proprement dans un test unitaire, les conditions à réunir m'échappent.

Mais d'un script posé sur la prod avec le patch suivant appliqué, les slots du guichet 5 remontent bien via get_all_slots. Avec dans le détail à comparer à la description :

(Pdb) time_period.desks
{<Desk: Guichet 5>, <Desk: Guichet 6>, <Desk: Guichet 1>, <Desk: Guichet 2>, <Desk: Guichet 3>, <Desk: Guichet 4>}      

(Pdb) desk_min_max_datetime
{<Desk: Guichet 1>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 2>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 3>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 10, 2, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 4>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)), <Desk: Guichet 5>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)), <Desk:
Guichet 6>: (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 9, 3, 0, 0, tzinfo=<UTC>))}

(Pdb) desks_by_min_max_datetime
defaultdict(<class 'list'>, {(datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2021, 2, 24, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 5>, <Desk: Guichet 4>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 9, 3, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 6>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 11, 1, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 1>, <Desk: Guichet 2>], (datetime.datetime(2020, 8, 27, 0, 0, tzinfo=<UTC>), datetime.datetime(2020, 10, 2, 0, 0, tzinfo=<UTC>)): [<Desk: Guichet 3>]})
#4

Mis à jour par Frédéric Péters il y a plus de 3 ans

Il y a un deuxième appel à itertools.groupby() plus loin; évidemment sans les conditions de reproduction c'est compliqué d'imaginer si ça peut foirer pareil là.

#5

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

De https://docs.python.org/3/library/itertools.html#itertools.groupby : "Generally, the iterable needs to already be sorted on the same key function."

Dans mon exemple time_period.desks n'est pas trié par la 'key function', j'imagine que c'est ce qui pose problème. Le tri préalable me semble correct sur les deux groupby qui restent.

Je n'ai pas cherché à trier parce que je trouve ma version plus simple à comprendre.

#6

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

C'est l'absence de tri sur time_period.desks par desk_min_max_datetime qui casse le fonctionnement de groupby, les autres groupby sont triés; je pense donc que ta correction est suffisante.

#7

Mis à jour par Benjamin Dauvergne il y a plus de 3 ans

Emmanuel Cazenave a écrit :

Je n'ai pas cherché à trier parce que je trouve ma version plus simple à comprendre.

Oui.

#8

Mis à jour par Christophe Siraut il y a plus de 3 ans

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

Mis à jour par Emmanuel Cazenave il y a plus de 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 38df08daf06b05e88e2211ca14a51f52c25b3f3d
Author: Emmanuel Cazenave <ecazenave@entrouvert.com>
Date:   Thu Aug 27 16:46:13 2020 +0200

    api: use a for loop instead of itertools.group_by (#46145)
#10

Mis à jour par Frédéric Péters il y a plus de 3 ans

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

Formats disponibles : Atom PDF