Préblocage d'une réservation (#80489) #135
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/80489-preblocage-d-une-reservation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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.
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.:
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.
Autre commentaire:
Des bidouilles sont faites pour les endpoints datetimes:
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 }}.
34e866f178
tofa6bb51121
Un train de remarques de forme suite à une lecture rapide.
@ -380,2 +380,3 @@
return [
MeetingType(duration=mt['duration'], label=mt['label'], slug=mt['slug'])
MeetingType(
duration=mt['duration'], label=mt['label'], slug=mt['slug'], agenda=self, id=Ellipsis
Dans le cadre du commit je crois pas que
id=Ellipsis
soit requis.ok.
@ -1566,2 +1576,4 @@
return free_time
@property
def api_datetimes_url(self):
Si tu veux mais ça doit être une méthode normale et s'appeler
get_datetimes_url
pour coller à la sémantique générale.ok.
@ -1958,1 +1973,4 @@
@property
def api_datetimes_url(self):
assert self.agenda.kind in ('meetings', 'virtual')
Alors que
assert self.agenda.kind != 'virtual'
dans le save() plus haut ?Ok, retiré.
@ -2195,1 +2227,4 @@
@staticmethod
def annotate_queryset_for_lock_code(qs, lock_code):
assert lock_code
Puisqu'on pourrait mettre ce genre de ligne partout je suis pour ne la mettre nulle part.
ok.
@ -2196,0 +2232,4 @@
locked_booked_places=Count(
'booking',
filter=Q(
booking__cancellation_datetime__isnull=True,
Si jamais la règle de calcul des places change dans le trigger qui met à jour booked_places, cet endroit sera oublié.
J'imagine qu'on doit pouvoir additionner la colonne booked_places avec le nombre de booking avec lock code, ou juste annoter avec ce nombre et additionner en python aux endroits où c'est utilisé (peut-être que cette dernière option donnerait du code plus clair, car locked_booked_places veut dire littéralement « nombre de réservations avec lock code » alors que ce n'est actuellement pas ça).
Il ne faudra pas l'oublier alors, je ne vois vraiment de moyen de faire autrement, on ne va pas pré-calculer booked_places pour chaque valeur de lock_code.
Ça n'est pas possible il faudra quand même reprendre la règle de comptage en excluant ce qui sont lockés avec lock_code, par contre je prends ta remarque sur le nommage, je vais plutôt appeler ça nonlocked_booked_places.
Ça dépend des cas j'imagine, si un jour on remplace cancellation_datetime par simplement un booléen cancelled et que ton annotation est écrite
alors il y aurait rien besoin de changer. Mais je ne t'embête pas plus avec des cas théoriques, laissons comme ça.
Plus concret pour le calcul du flag full on a bien une règle spécifique aux agendas plages libres petite enfance (#78082) que tu n'as pas prise en compte, à toi de voir si tu l'ajoutes ou si on dit que ces agendas ne sont pas supportés (les deux me vont).
Je ne vois pas de conséquence sur le nombre de places qui est la seule chose dont je corrige la valeur. À bien y réfléchir si un agenda est en mode partial_booking, alors il n'est jamais plein et donc que ce soit avec des bookings temporaires ou définitifs ça ne change rien. Non ?
Je me corrige: tu as raison j'ai implémenté get_full, je vais prendre ça en compte.
Fait, j'ai regardé pour almost_full que j'avais ignoré, mais il semble que ce soit c'est simplement un indicateur pour envoyer des notifications aux responsables il me semble, ça n'a pas d'importance ici.
fa6bb51121
to52cdaa46ea
52cdaa46ea
toc86908d840
Préblocage d'une réservation (#80489)to WIP: Préblocage d'une réservation (#80489)c86908d840
to2c216d7bc0
2c216d7bc0
to1df930a851
1df930a851
to9b43f5575e
9b43f5575e
to028306ee02
028306ee02
tof1cd25bf5e
f1cd25bf5e
to8cb643db36
WIP: Préblocage d'une réservation (#80489)to Préblocage d'une réservation (#80489)Les parties du code concernant les évènements et les rendez-vous sont maintenant bien séparés dans deux commits et j'ai simplifié certains fillslot en posant le atomic() directement sur la méthode, ça simplifie aussi pas mal les calculs sur les places disponibles pendant le fillslot.
8cb643db36
tob30a11292b
Le code est bon pour moi, je veux bien correction de build pour pouvoir tester en vrai puis valider.
b30a11292b
to6ce7d52db2
C'est rebasé.
6ce7d52db2
to62d78565ec
Testé avec succès en local, le truc qui resterait à faire c'est d'afficher en BO que la réservation est un lock (par défaut ça donne un libellé « Anonyme » laconique), ça pourra être vu dans un autre ticket.
62d78565ec
toe8801306b4
e8801306b4
to577bfdc5c5
577bfdc5c5
to5716d6b3dc