Projet

Général

Profil

Development #80489

"préblocage" d'une réservation

Ajouté par Benjamin Dauvergne il y a 8 mois. Mis à jour il y a 6 mois.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
22 août 2023
Echéance:
25 octobre 2023
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Le préblocage a lieu via le passage d'un paramètre "lock_code" contenant un chaîne quelconque non vide, les espaces en fin et début sont retirés pour éviter les bugs idiots de template.

Ce paramètre est disponible sur les vues datetimes et fillslot pour les rendez-vous et les évènements.

Lors d'une réservation (fillslot) avec lock_code est créé un modèle Lease plus des modèles Event/Booking habituels. Le Lease est en relation 1-1 avec le Booking créé. Le Lease dispose d'une date d'expiration (contrôlé via le setting CHRONO_LOCK_DEFAULT_DURATION mais par ailleurs contrôlable via un autre paramètre lock_duration durant le fill_slot) et d'un champ lock_code qui reprendre la valeur passée.

lock_duration est par ailleurs limité par les settings CHRONO_LOCK_MIN_DURATION/CHRONO_LOCK_MAX_DURATION.

chrono/settings.py:CHRONO_LOCK_MIN_DURATION = 5 * 60
chrono/settings.py:CHRONO_LOCK_DEFAULT_DURATION = 10 * 60
chrono/settings.py:CHRONO_LOCK_MAX_DURATION = 20 * 60

Régulièrement et sur différentes vues (datetimes et fillslot) sont appelés les fonctions clean_meeting_events_with_expired_lease()/clean_bookings_with_expired_lease qui suppriment les Booking (et Event dans le cas des rendez-vous) dont l'objet Lease a expiré, ça évite d'avoir une tâche de fond pour faire cela, c'est fait au fil de l'eau et notamment lors des appels fillslot/datetimes, on a donc une vue toujours à jour des créneaux/évènements disponibles.

Dans w.c.s:
L'appel avec lock_code doit être en sortie de page où le choix du rendez-vous est fait en utilisant les condition de sortie de page. Cet appel doit être en définissant un appel de web-service. Ex.:

Définition du web-service :
  Slug: rdv_fillslot_preblocage
  Méthode: POST
  URL: {{ form_var_rendez_vous_fillslot_url }}
  Paramètre POST: 
    lock_code={{ session_hash_id }}

Condition de sortie de page:
  webservice.rdv_fill_slot_preblocage.err == 0

Si cet appel fillslot a réussi alors le rendez-vous/inscription est pré-bloqué, et on peut passer à la page suivante.cet appel peut-être sur toutes les sorties des pages suivantes il est idempotent (si le lease existe avec le même lock_code il, le rendez-vous/l'inscription est supprimée et recréé à chaque fois, voir dans les blocs transaction.atomic() où se passent la réservation effective). À chaque appel fillslot, l'expiration du lease est prolongée, si l'appel est bien fait en sortie de la page finale ça évite que le fillslot définitif dans le workflow n'échoue.

Pour valider définitivement le rendez-vous/l'inscription, on ajoute à l'appel fillslot (celui qui est typiquement fait en début de workflow après réception de la demande) le lock_code et un autre paramètre "confirm_after_lock" à la valeur true; la présence de ce paramètre permettra le fillslot comme avant mais ne recréera pas le Lease, on se retrouve avec un rendez-vous/une inscription classique.

Appel webservice de réservation définitive:

  Méthode: POST
  URL: {{ form_var_rendez_vous_fillslot_url }}
  Paramètre POST: 
    lock_code={{ session_hash_id }}
    confirm_after_lock=true
Autre commentaire:
Des bidouilles sont faites pour les endpoints datetimes:
  • pour les évènements au niveau d'accesseur de Event et de api/views:get_events_from_slots pour avoir une vue des places disponibles des évènements excluant ou pas les inscriptions pré-bloquées
  • pour les rendez-vous dans Agenda.get_all_slots() (exclusion de certains évènements en fonction de la présence du paramètre lock_code, sur les agendas concernés, sur les ressources et sur les évènements agrégés en fonction du user_external_id)

Coté w.c.s on peut utiliser les sources de données datetimes automatiques mais elle ne passent pas de paramètre lock_code et donc l'expérience n'est pas optimale, par exemple si on revient sur la page de sélection du créneau le slot en cours de préblocage ne sera pas disponible. Pour pallier à cela il faut créer une source de donnée manuelle qui passera le paramètre lock_code={{ session_hash_id }}.


Demandes liées

Lié à Chrono - Development #17685: "préblocage" d'une réservationFermé18 juillet 2017

Actions
Lié à Chrono - Development #82774: affichage en backoffice d'un préblocageFermé24 octobre 2023

Actions
Lié à Chrono - Support #83635: Préblocage - rdv pré-réservé hier non libéré après 12hFermé17 novembre 2023

Actions
Lié à Chrono - Support #83636: Préblocage - condition sortie de page échoue en page 2Fermé17 novembre 2023

Actions
Lié à Chrono - Support #83643: Préblocage - créneau pré-réservé est libéré quand j'effectue une nouvelle demandeFermé17 novembre 2023

Actions

Historique

#1

Mis à jour par Benjamin Dauvergne il y a 8 mois

#2

Mis à jour par Benjamin Dauvergne il y a 8 mois

  • Tags mis à simplification agenda
#3

Mis à jour par Robot Gitea il y a 8 mois

  • Statut changé de Nouveau à Solution proposée

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

#4

Mis à jour par Benjamin Dauvergne il y a 8 mois

  • Description mis à jour (diff)
#5

Mis à jour par Valentin Deniaud il y a 8 mois

Benjamin Dauvergne a écrit :

Ce paramètre est disponible sur les vues datetimes et fillslot pour les rendez-vous et les évènements.

Ça aurait été chouette de séparer les deux genre 1/ ajout pour les agenda rdv 2/ ajout pour les évènements, avec éventuellement le 2/ dans un second temps et un second ticket. Avec un patch/sujet aussi gros la relecture risque d'être soit tortueuse, soit bâclée.

Je vais tenter de mettre ici les remarques de fond et de garder gitea pour les remarques de forme, où le commentaire ligne à ligne a du sens.

un autre paramètre lock_duration durant le fill_slot
lock_duration est par ailleurs limité par les settings CHRONO_LOCK_MIN_DURATION/CHRONO_LOCK_MAX_DURATION.

Pour moi c'est à retirer, ça sera remis si quelqu'un le demande (jamais).

Régulièrement et sur différentes vues (datetimes et fillslot) sont appelés les fonctions clean_meeting_events_with_expired_lease()/clean_bookings_with_expired_lease qui suppriment les Booking (et Event dans le cas des rendez-vous) dont l'objet Lease a expiré, ça évite d'avoir une tâche de fond pour faire cela

Je ne vois que des avantages à la tâche de fond, le jour où il y a un bug avec ton approche on doit grepper les lignes qui nettoient les locks, en trouver 10, vérifier tous ces chemins de code pour un éventuel oubli.

En plus ça ajoute une requête inutile dans 99% des appels à chrono sur nos instances.

Donc pour moi un coup de cron toutes les [2, 5] minutes c'est très bien, en plus la durée du lock d'un créneau est hyper variable comme tu le notes puisqu'elle dépend du nombre de pages du formulaires. Personne ne remarquera si les créneaux sont lockés 12 minutes et pas 10.

#6

Mis à jour par Benjamin Dauvergne il y a 8 mois

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

Mis à jour par Benjamin Dauvergne il y a 8 mois

Valentin Deniaud a écrit :

Benjamin Dauvergne a écrit :

Ce paramètre est disponible sur les vues datetimes et fillslot pour les rendez-vous et les évènements.

Ça aurait été chouette de séparer les deux genre 1/ ajout pour les agenda rdv 2/ ajout pour les évènements, avec éventuellement le 2/ dans un second temps et un second ticket. Avec un patch/sujet aussi gros la relecture risque d'être soit tortueuse, soit bâclée.

Ok je vais faire ça.

un autre paramètre lock_duration durant le fill_slot
lock_duration est par ailleurs limité par les settings CHRONO_LOCK_MIN_DURATION/CHRONO_LOCK_MAX_DURATION.

Pour moi c'est à retirer, ça sera remis si quelqu'un le demande (jamais).

Ok, c'est retiré.

Régulièrement et sur différentes vues (datetimes et fillslot) sont appelés les fonctions clean_meeting_events_with_expired_lease()/clean_bookings_with_expired_lease qui suppriment les Booking (et Event dans le cas des rendez-vous) dont l'objet Lease a expiré, ça évite d'avoir une tâche de fond pour faire cela

Je ne vois que des avantages à la tâche de fond, le jour où il y a un bug avec ton approche on doit grepper les lignes qui nettoient les locks, en trouver 10, vérifier tous ces chemins de code pour un éventuel oubli.

En plus ça ajoute une requête inutile dans 99% des appels à chrono sur nos instances.

Ok, transformé en commande lancé via cron/uwsgi.

#8

Mis à jour par Benjamin Dauvergne il y a 8 mois

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

Mis à jour par Anaïs Ecuvillon il y a 8 mois

#13

Mis à jour par Robot Gitea il y a 7 mois

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

Valentin Deniaud (vdeniaud) a approuvé une pull request sur Gitea concernant cette demande :

#16

Mis à jour par Benjamin Dauvergne il y a 7 mois

  • Echéance mis à 25 octobre 2023
#17

Mis à jour par Anaïs Ecuvillon il y a 7 mois

Le financement est bouclé.

Ce développement est chiffré à 16 000 € HT dont 6 000 € HT par la Mairie de Villejuif, 5 000 € HT par le Conseil départemental de la Haute-Garonne, 3 000 € HT par la ville de Nanterre et 2 000 € HT par la Ville de Lille.

Est-ce que je peux annoncer une livraison début fin novembre ? => ok

#18

Mis à jour par Frédéric Péters il y a 6 mois

#19

Mis à jour par Robot Gitea il y a 6 mois

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

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

#20

Mis à jour par Transition automatique il y a 6 mois

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

Mis à jour par Anaïs Ecuvillon il y a 6 mois

  • Lié à Support #83635: Préblocage - rdv pré-réservé hier non libéré après 12h ajouté
#22

Mis à jour par Anaïs Ecuvillon il y a 6 mois

  • Lié à Support #83636: Préblocage - condition sortie de page échoue en page 2 ajouté
#23

Mis à jour par Anaïs Ecuvillon il y a 6 mois

  • Lié à Support #83643: Préblocage - créneau pré-réservé est libéré quand j'effectue une nouvelle demande ajouté
#24

Mis à jour par Transition automatique il y a 3 mois

Automatic expiration

Formats disponibles : Atom PDF