Project

General

Profile

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 :

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' vaut 0 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

Also available in: PDF HTML TXT