Wiki¶
Ce n'est pas fait pour durer (il y a #90619),
mais plus dans une optique de pallier à l'urgence de la dépréciation du script python utilisé actuellement à Toulouse (#90635),
avoir un filtre django qui reprenne le code à l'identique.
Filtre file d'attente¶
Utilisé par exemple sur Parsifal :- https://demarches-parsifal.test.entrouvert.org/backoffice/forms/83/
- https://demarches-parsifal.test.entrouvert.org/backoffice/forms/274/
Description¶
Filtre w.c.s. pour la mise en place d'une file d'attente.
Il retourne une date minimale d'accès à une démarche en fonction d'un identifiant attribuant un slot.
Le slot est attribué définitivement pour la journée suivant le nom de la file et l'identifiant passés.
Le même slot sera toujours retourné durant la même journée.
Mise en place¶
En principe disponible partout (#99215).
- créer une option de workflow (pour avoir le paramétrage à un seul endroit) waiting_queue : qui comprend 3 valeurs séparée par des slashs ('
/
') :- le nom de la file d'attente, les slots sont attribués une fois par nom et par jour,
- la frequence: le nombre de slot par périodes en minutes, ex.
30/1
0, 30 slots par périodes de 10 minutes.
On pourra poser comme validation l'expression régulière"[0-9]{,2}/[0-9]{,2}"
.
- mettre des valeurs par défaut au niveau du workflow ou bien les spécialiser sur le formulaire.
Utilisation¶
Il faut appliquer le filtre sur l'identifiant référençant le slot (ex. "{{ session_user_nameid }}
").Le résultat de l'appel est visible dans
{{ session_user_nameid|waiting_queue:form_option_waiting_queue }}
.(ou sinon, sans les variables juste pour tester :
{{ "aaa"||waiting_queue:"bbb/1/2" }}
)exemple :
<pre>{{ session_user_nameid|waiting_queue:form_option_waiting_queue|pprint }}</pre>
...|waiting_queue:...|get:'err'
vaut0
en cas de réussite,- la date du slot se trouve dans
...|waiting_queue:...|get:slot
on peut l'afficher à l'usager en appliquant en plus le filtre|time
.
exemple de champ commentaire :En raison d'une forte affluence et pour vous assurer une meilleure qualité de service, nous vous avons attribué un créneau horaire. Ce RDV vous permettra d'accéder au formulaire d'inscription sans perdre votre place dans la file d'attente classée par ordre d'arrivée. Pour poursuivre votre démarche sereinement vous avez la possibilité soit de patienter jusqu'à l'heure attribuée, soit de vous reconnecter à n'importe quel moment de la journée à partir de l'heure indiquée : ⏳Votre créneau : {{ session_user_nameid|waiting_queue:form_option_waiting_queue|get:"slot"|time }}
- on utilise la condition suivante pour valider la sortie des pages:
session_user_nameid|waiting_queue:form_option_waiting_queue|get:"slot" <= now Avec ce message si la condition n'est pas satisfaite : Suite à une forte sollicitation des services, nous vous prions de bien vouloir revenir plus tard. Merci pour votre compréhension.
En cas d'erreur technique le filtre ne retournera pas de slot et la comparaison avec toute date sera toujours fausse.
Exemple de retour valide¶
Sur une file configurée pour n'avoir qu'un seul slot toutes les 2 minutes,
deux usager font la demande à 15h14,
seul le premier se voit attribué un slot immédiatement.
Cas passant :
{ 'arg': 'plop/1/2', 'case': 'existing', 'count': 1, 'created': datetime.datetime(2024, 11, 29, 15, 14, 50, 205106, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'current_count': 1, 'err': 0, 'identifier': '16392219e6fb4ea29f52ca4d5c3fd20d', 'name': 'plop', 'per_minutes': 2, 'ref': datetime.datetime(2024, 11, 29, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'slot': datetime.datetime(2024, 11, 29, 15, 14, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')) }
Cas bloquant :
{ 'arg': 'plop/1/2', 'case': 'existing', 'count': 1, 'created': datetime.datetime(2024, 11, 29, 15, 14, 53, 699341, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'current_count': 1, 'err': 0, 'identifier': '9a26f59828b840f19e04dc6978f10b3b', 'name': 'plop', 'per_minutes': 2, 'ref': datetime.datetime(2024, 11, 29, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')), 'slot': datetime.datetime(2024, 11, 29, 15, 16, tzinfo=zoneinfo.ZoneInfo(key='Europe/Paris')) }
Champs utiles¶
err
: 0/1 pas d'erreur/erreur,slot
: la date du slot alloué,err_desc
: la description de l'erreur (c'est dans 99% une erreur due à un mauvais paramétrage).
Champs de debug¶
identifier
: la valeur de l'identifiant auquel on applique le filtre,name
,count
,per_minutes
: détaillent le paramètre passé au filtre,current_bin
: la date du slot actuellement examiné pour une allocation,current_count
: le nombre de slots déjà alloué à cette date,case
: est-ce que le slot vient d'être alloué (allocated) ou existait déjà (existing).
Note: en pratique, comme les appels sont réalisés plusieurs fois par wcs (excepté si l'on teste le filtre via l'inspecteur), on ne voit que les cas où le slot existait déjà et par conséquent on ne voit pas non plus le champ current_bin
.
Détails d'implémentation¶
L'état est conservé dans une table nomméwaiting_queue
créé par le filtre dans la base de donnée de w.c.s. du tenant.Cette table contient 4 colonnes:
- le nom de la file
- l'identifiant de l'usager
- le date de création du slot
- la date du slot (moment ou l'accès devient autorisé)
La seule autre création en base est celle d'une fonction waiting_queue_date_bin
ré-implémentation de date_bin
[1] introduit en version 14 de postgresql trouvée sur Github2; nous utilisons encore la version 13.
1 https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-BIN
fn2. https://github.com/stefanov-sm/Pre-PG14-date_bin-function/blob/main/date_bin.sql