Recommandations pour une application de prise de rendez-vous
Bonjour !
Je suis en train de faire une application de prise de rendez-vous (sans création de compte) et j'aimerais avoir quelques recommandations sur les bonnes pratiques à avoir :
-
Lorsqu'on prend un rendez-vous, comment faire en sorte de confirmer ce rendez-vous sachant qu'il n'y a pas de compte utilisateur et éviter des fake appointments ?
-
J'aimerais avoir quelque chose avec un calendrier et des time slots, y'a-t-il des bonnes bibliothèques Django, JS pour ça ?
-
Également, ça fonctionne comment si jamais je choisis une date et un autre utilisateur choisit la même en même temps ?
J'aimerais bien quelque chose dans ce style pour le calendrier et les time-slots :

Salut Yanis,
Super comme projet ça !
Pour la confirmation sans création de compte je vois plusieurs moyens :
-
Lorsqu'un utilisateur réserve un rendez-vous, envoie-lui un email ou un SMS contenant un lien de confirmation. Le rendez-vous sera enregistré comme "provisoire" et sera confirmé uniquement si l'utilisateur clique sur le lien. Pour créer des liens uniques, tu peux utiliser le PasswordResetTokenGenerator (un exemple ici).
-
Utilise un captcha pour t'assurer que c'est bien un humain qui remplit le formulaire de prise de rendez-vous. Cela peut réduire les faux rendez-vous.
Pour les bibliothèques et lib, tu en as plusieurs, après ça sera soit payant, soit pas forcément toujours super récent. Le mieux reste encore de faire ton propre système parce que tu auras souvent besoin de choses assez spécifiques j'imagine, mais là c'est un gros travail.
Côté Django :
Côté JS :
Pour gérer les conflits de rendez-vous, tu peux implémenter une logique de verrouillage au niveau de ta base de données notamment avec les transactions atomiques.
Tu peux avec ça t'assurer que l'opération d'enregistrement des rendez-vous est faite de manière sécurisée. Si deux utilisateurs tentent de réserver le même créneau, une seule opération sera confirmée.
from django.db import transaction
def book_appointment(user, date, time_slot):
with transaction.atomic():
existing_appointment = Appointment.objects.filter(date=date, time_slot=time_slot).select_for_update().first()
if existing_appointment:
return {"success": False, "message": "Ce créneau est déjà réservé."}
new_appointment = Appointment(user=user, date=date, time_slot=time_slot)
new_appointment.save()
return {"success": True, "appointment": new_appointment}
Regarde du côté de select_for_update dans la doc :)
Voilà ça devrait te donner déjà de bonnes pistes :) Bon courage !
J'avance plutôt bien mais j'ai une question par rapport à un truc :
class AppointmentDatetime(models.Model):
thedatetime = models.DateTimeField()
is_bookable = models.BooleanField(default=True)
@staticmethod
def get_dates_times():
available_date = AppointmentDatetime.objects.filter(is_bookable=True).values_list('thedatetime', flat=True)
liste_date = [date.date().strftime('%Y-%m-%d') for date in available_date]
time_slots = [time.time().strftime('%H:%M') for time in available_date]
return liste_date,time_slots
Dans mon formulaire django, j'utilise un ModelForm avec un widget qui fait que j'utilise flatpicker en front pour selectionner une date. Lors de la séléction, j'ai uniquement les dates qui ont "is_bookable=True" qui sont clickables.
Cependant, vu que j'utilise un DateTimeField, je me demande comment faire pour avoir quelque chose où j'ai une date puis, des heures qui s'adaptent selon la date que j'ai choisi. Une requête Ajax avec HTMX ? Ou ya un moyen de lier ça directement dans la base de données en utilisant autre chose que DateTimeField ?
Mon idée est d'avoir un formulaire qui hérite de form.Form et non un modelform, afin de "fusionner" ma date et mon time pour avoir un datetime que je vais sauvegarde dans la BDD.
J'aimerais bien avoir un avis là dessus et des idées sur une bonne marche à suivre.
Salut Yanis !
Si je comprends bien, ton formulaire en front te retourne deux informations séparées (la date, et l'heure) que tu récupères avec flatpickr, via un ModelForm. Et tu souhaiterais récupérer avec un formulaire normal ces deux informations ensemble, pour les mettre directement dans thedatetime ?
Peu importe ce que tu fais, les formulaires sont assez flexibles en terme de manipulation. Même si tu passes par un ModelForm, tu peux toujours au moment de sauvegarder les informations, bypasser la validation de formulaire. Ainsi, tu peux récupérer directement les informations fournies dans ton formulaire en front dans ta vue en back avec request.POST et ensuite faire ce que tu veux avec ces données (faire une validation custom, via ton formulaire ou non, envoyer les données ailleurs, etc).
Est-ce que tu peux me montrer à quoi ressemble ton front, et ce que tu récupères dans request.POST dans ta vue en back ?
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte