Gestion d'un cabinet médical avec django (Clinic Management)

 

0. Introduction au projet

A propos du projet

La gestion d'un cabinet médical est une tâche complexe qui nécessite une organisation efficace et un suivi rigoureux des patients, des traitements et des rendez-vous. Dans ce contexte, le développement d'une application web de gestion de cabinet médical offre une solution numérique pratique et efficace pour les professionnels de la santé.

Objectif du projet

Le but de ce projet est de concevoir une application web basée sur Django, un framework Python robuste et populaire, pour gérer les opérations essentielles d'un cabinet médical, notamment :

  1. Gestion des patients : Enregistrement des informations personnelles, suivi des visites, et stockage des historiques médicaux.
  2. Gestion des traitements : Suivi des diagnostics et des traitements prescrits.
  3. Gestion des rendez-vous : Planification et suivi des consultations.

L'application permettra également une consultation centralisée et un accès rapide aux informations, facilitant ainsi le travail des médecins et du personnel médical.

 

1. Création du projet Django

Créer un projet Django

Ouvrez un terminal et exécutez :

Cette commande crée la structure de base du projet Django avec les fichiers suivants :

  1. manage.py : Utilisé pour gérer les commandes liées à Django.
  2. clinic_management/ : Contient les paramètres principaux du projet.
 

2. Migration initiale des bases de données

Avant de créer un modèle ou une application, appliquez les migrations initiales pour configurer la base de données par défaut (SQLite, sauf si vous utilisez une autre base).

Exécutez les migrations par défaut

Cela configure les tables par défaut pour l'authentification, les permissions, etc.

 

3. Création d’un super utilisateur

Pour gérer les données via l'interface admin Django, créez un super utilisateur:

Django vous demande les informations suivantes :

  1. Nom d'utilisateur : Par exemple, admin.
  2. Adresse e-mail : Par exemple, admin@example.com.
  3. Mot de passe : Saisissez un mot de passe sécurisé.
 

4. Réglage de la page d’accueil avec héritage du template de base.html

4.1 Création d'un bootstrap template

Vous devez maintenant créer ou télécharger un template Bootstrap ayant la structure suivante:

Si vous n'avez aucun template, vous pouvez utiliser le notre: Bootstrap Template

Après avoir télécharger et décompresser l'archive du template, placer le dossier static/ à la racine de votre projet et le fichier base.html à la racine du dossier template/

Ajouter ou éditer ensuite le code du template au niveau du fichier settings.py:

4.2 Configuration des fichiers statiques et médias

Au niveau du fichier settings.py ajouter les lignes de code suivantes afin que django puisse prendre en charge les fichiers médias et statiques (css, images, js ...):

4.3 Création de la page d'accueil avec la classe TemplateView

Nous allons maintenant créer et regler la page d'accueil en se basant sur la classe TemplateView. La classe TemplateView de Django est une vue générique basée sur les classes (Class-Based View, CBV) qui est utilisée pour rendre un template HTML avec un contexte optionnel. Elle est idéale lorsque vous souhaitez afficher une page statique ou semi-statique sans logique complexe dans la vue. A cet effet, veuillez modifier le fichier des urls du projet principal en important la classe TemplateView et en ajoutant l'url générée par cette dernière: clinic_management/urls.py

Mais on dois aussi mettre à jours le fichier principal des urls afin de prendre en charge les fichiers statiques et medias en important le module static et le fichiers settings.py:

Nous créons ensuite le fichier de la page d'accueil au niveau du template: template/index.html:

Vous pouvez aussi ajoter les icones qui setrouvent au sein du dossier static/img:

En démarrant le projet maintenant, vous obtiendrez la vue suivante:

clinic management system with django framework

 

5. Création et configuration de l'application principale

5.1 Créer l'application principale

A cet effet, ajoutez une application 'patients' pour la gestion des patients:

Ajouter ensuite l'application 'patients' aux applications installées au niveau du fichier: settings.py

Créer ensuite un répertoire  'patients/' pour l'application 'patients' au niveau du template.

 

6. Création des modèles Patient, Treatment & Appointment

Nous allons créer maintenant 3 modèles modèles Django qui permettent de gérer les patients au sein d'un cabinet médical:

  1. Patient : Modèle pour gérer les patients (stocker et mettre à jours les données des patients...)
  2. Treatment : Modèle pour gérer les traitements associés aux patients
  3. Appointment : Modèle pour gérer les rendez vous des patients.

Voici une explication détaillée de chaque modèle et de leurs relations :

6.1 Modèle Patient

Le modèle Patient représente un patient dans le système. Il contient plusieurs champs pour stocker des informations sur le patient: id : Un champ AutoField qui sert de clé primaire. Il est automatiquement incrémenté pour chaque no

  1. name : Un champ CharField pour stocker le nom du patient (maximum 100 caractères).
  2. email : Un champ EmailField pour stocker l'adresse e-mail du patient. Ce champ est unique, ce qui signifie qu'aucun autre patient ne peut avoir la même adresse e-mail.
  3. phone : Un champ CharField pour stocker le numéro de téléphone du patient (maximum 15 caractères).
  4. gender : Un champ CharField avec des choix prédéfinis (GENDER_CHOICES) pour stocker le genre du patient ('M' pour Male, 'F' pour Female).
  5. address : Un champ CharField pour stocker l'adresse du patient (maximum 250 caractères).
  6. age : Un champ PositiveIntegerField pour stocker l'âge du patient.
  7. weight : Un champ FloatField pour stocker le poids du patient.
  8. photo : Un champ ImageField pour stocker une photo du patient. Les images sont sauvegardées dans le répertoire patients/photos/. Ce champ est facultatif (null=True, blank=True).
  9. first_visit_date : Un champ DateField pour stocker la date de la première visite du patient. Ce champ n'est pas modifiable dans l'interface d'administration (editable=False) et est automatiquement défini à la date du jour lors de la création du patient.
  10. last_visit_date : Un champ DateField pour stocker la date de la dernière visite du patient. Ce champ est automatiquement mis à jour à la date du jour à chaque sauvegarde du patient.

6.2 Modèle Treatment

Le modèle Treatment représente un traitement médical administré à un patient. Il est lié au modèle Patient via une clé étrangère (ForeignKey).

  1. id : Un champ AutoField qui sert de clé primaire.
  2. patient : Une clé étrangère vers le modèle Patient. Cela signifie que chaque traitement est associé à un patient. L'option on_delete=models.CASCADE signifie que si un patient est supprimé, tous ses traitements seront également supprimés. Le related_name='treatments' permet d'accéder aux traitements d'un patient via patient.treatments.
  3. disease : Un champ CharField pour stocker le nom de la maladie ou du diagnostic.
  4. medical_treatment : Un champ TextField pour stocker les détails du traitement médical.
  5. treatment_date : Un champ DateField pour stocker la date du traitement. Ce champ n'est pas modifiable dans l'interface d'administration (editable=False) et est automatiquement défini à la date du jour lors de la création du traitement.

6.3 Modèle Appointment

Le modèle Appointment représente un rendez-vous pour un patient. Il est également lié au modèle Patient via une clé étrangère.

  1. id : Un champ AutoField qui sert de clé primaire.
  2. patient : Une clé étrangère vers le modèle Patient. Chaque rendez-vous est associé à un patient. L'option on_delete=models.CASCADE signifie que si un patient est supprimé, tous ses rendez-vous seront également supprimés. Le related_name='appointments' permet d'accéder aux rendez-vous d'un patient via patient.appointments.
  3. appointment : Un champ CharField pour stocker la date ou l'heure du rendez-vous (maximum 50 caractères).

6.4 Code du fichiers patients/models.py

6.5 Méthodes associées aux modèles Patient, Treatment & Appointment

6.5.1 Méthodes du modèle Patient

  1. save(self) : Cette méthode est surchargée pour définir automatiquement la first_visit_date à la date du jour lors de la création du patient (si elle n'est pas déjà définie). Ensuite, elle appelle la méthode save() de la classe parente pour sauvegarder l'objet.
  2. __str__(self) : Cette méthode retourne le nom du patient, ce qui est utile pour l'affichage dans l'interface d'administration ou d'autres parties de l'application.

6.5.2 Méthodes du modèle Treatment

  1. save(self) : Cette méthode est surchargée pour définir automatiquement la treatment_date à la date du jour lors de la création du traitement (si elle n'est pas déjà définie). Ensuite, elle appelle la méthode save() de la classe parente pour sauvegarder l'objet.
  2. __str__(self) : Cette méthode retourne une chaîne de caractères représentant le traitement, incluant le nom de la maladie et le nom du patient.

6.5.3 Méthodes du modèle Appointment

__str__(self) : Cette méthode retourne une chaîne de caractères représentant le rendez-vous, incluant le nom du patient et la date/heure du rendez-vous.

6.5.4 Relations entre les modèles

  1. Patient a une relation one-to-many avec Treatment : Un patient peut avoir plusieurs traitements, mais chaque traitement est associé à un seul patient.
  2. Patient a également une relation one-to-many avec Appointment : Un patient peut avoir plusieurs rendez-vous, mais chaque rendez-vous est associé à un seul patient.

6.6 Utilisation de l'interface d'administration

Le code importe admin de django.contrib, ce qui suggère que ces modèles seront enregistrés dans l'interface d'administration de Django pour permettre la gestion des patients, des traitements et des rendez-vous via une interface graphique. Afin de pouvoir visualiser et éditer les modèles Patient, Treatment, et Appointment dans l'interface d'administration de Django, nous devons créer au sein du fichier patients/models.py une classe pour chaque modèle en héritant de la classe ModelAdmin:

6.6.1 La classe PatientAdmin

  1. @admin.register(Patient) : Ce décorateur enregistre le modèle Patient dans l'interface d'administration et l'associe à la classe PatientAdmin.
  2. list_display : Cette option spécifie les champs à afficher dans la liste des objets Patient dans l'interface d'administration. Ici, les champs suivants seront affichés : name, email, phone, address.

Cela permet à l'administrateur de voir rapidement les informations clés des patients dans une vue tabulaire.

6.6.2 La classe TreatmentAdmin

  1. @admin.register(Treatment) : Ce décorateur enregistre le modèle Treatment dans l'interface d'administration et l'associe à la classe TreatmentAdmin.
  2. list_display : Cette option spécifie les champs à afficher dans la liste des objets Treatment dans l'interface d'administration. Ici, les champs suivants seront affichés : patient, disease, medical_treatment, treatment_date.
  3. Utilité : Cela permet à l'administrateur de voir rapidement les traitements associés à chaque patient, ainsi que les détails du traitement.

6.6.3 La classe AppointmentAdmin

  1. @admin.register(Appointment) : Ce décorateur enregistre le modèle Appointment dans l'interface d'administration et l'associe à la classe AppointmentAdmin.
  2. list_display : Cette option spécifie les champs à afficher dans la liste des objets Appointment dans l'interface d'administration. Ici, les champs suivants seront affichés : patient, appointment.
  3. Utilité : Cela permet à l'administrateur de voir rapidement les rendez-vous programmés pour chaque patient.

Nous devons ensuite effectuer les migrations:

 

7. Création des vues

Les vues que nous allons utiliser sont des vues basées sur des classes (Class-Based Views, CBV) de Django. Elles permettent de gérer les opérations CRUD (Create, Read, Update, Delete) pour les modèles Patient, Treatment, et Appointment. Ces vues basées sur des classes simplifient grandement la gestion des opérations CRUD pour les modèles Patient, Treatment, et Appointment. Elles sont configurables et extensibles, ce qui permet de les adapter aux besoins spécifiques de notre application. Les méthodes comme form_valid() permettent d'ajouter une logique personnalisée, comme lier un traitement ou un rendez-vous à un patient spécifique. Voici une explication détaillée de chaque vue :

7.1 Vues pour le modèle Patient

7.1.1 Créer le Views pour la liste des patients

  1. Fonctionnalité : Cette vue affiche une liste paginée des patients.
  2. Attributs :
    • model = Patient : Spécifie que cette vue travaille avec le modèle Patient.
    • paginate_by = 4 : Divise la liste des patients en pages de 4 éléments chacune.
    • ordering = ['-id'] : Trie les patients par ordre décroissant de leur id (du plus récent au plus ancien).
  3. Utilisation : Cette vue est utile pour afficher une liste de patients dans une interface utilisateur.

7.1.2 Créer le Views pour les details d'un patient

  1. Fonctionnalité : Cette vue affiche les détails d'un patient spécifique.
  2. Attributs :
    • model = Patient : Spécifie que cette vue travaille avec le modèle Patient.
  3. Utilisation : Cette vue est utilisée pour afficher les informations détaillées d'un patient, comme son nom, son e-mail, son adresse, etc.

7.1.3 Views pour la création d'un nouveau patient

  1. Fonctionnalité : Cette vue permet de créer un nouveau patient.
  2. Attributs :
    • model = Patient : Spécifie que cette vue travaille avec le modèle Patient.
    • fields : Liste des champs du modèle Patient qui seront inclus dans le formulaire de création.
    • success_url = reverse_lazy('patient_list') : Redirige l'utilisateur vers la liste des patients après la création réussie.
  3. Utilisation : Cette vue est utilisée pour afficher un formulaire de création de patient et enregistrer les données soumises.

7.1.4 Views pour la mise à jour d'un patient

  1. Fonctionnalité : Cette vue permet de mettre à jour les informations d'un patient existant.
  2. Attributs :
    • model = Patient : Spécifie que cette vue travaille avec le modèle Patient.
    • fields : Liste des champs du modèle Patient qui seront inclus dans le formulaire de mise à jour.
    • success_url = reverse_lazy('patient_list') : Redirige l'utilisateur vers la liste des patients après la mise à jour réussie.
  3. Utilisation : Cette vue est utilisée pour afficher un formulaire de modification de patient et enregistrer les modifications.

7.1.5 Views pour supprimer un patient

  1. Fonctionnalité : Cette vue permet de supprimer un patient.
  2. Attributs :
    • model = Patient : Spécifie que cette vue travaille avec le modèle Patient.
    • template_name : Spécifie le template utilisé pour afficher la page de confirmation de suppression.
    • success_url = reverse_lazy('patient_list') : Redirige l'utilisateur vers la liste des patients après la suppression réussie.
  3. Utilisation : Cette vue est utilisée pour afficher une page de confirmation de suppression et supprimer le patient si l'utilisateur confirme.

7.2 Views pour le modèle Treatment

7.2.1 Views pour créer un nouveau traitement

  1. Fonctionnalité : Cette vue permet de créer un nouveau traitement pour un patient spécifique.
  2. Attributs :
    • model = Treatment : Spécifie que cette vue travaille avec le modèle Treatment.
    • fields : Liste des champs du modèle Treatment qui seront inclus dans le formulaire de création.
    • context_object_name = 'treatment' : Nom de la variable de contexte dans le template.
    • template_name : Spécifie le template utilisé pour afficher le formulaire de création.
    • success_url = reverse_lazy('patient_list') : Redirige l'utilisateur vers la liste des patients après la création réussie.
  3. Méthode form_valid :
    • Récupère l'ID du patient à partir des paramètres de l'URL (patient_id).
    • Associe le traitement au patient correspondant avant de sauvegarder le formulaire.
  4. Utilisation : Cette vue est utilisée pour créer un traitement lié à un patient spécifique.

7.3 Views pour le modèle Appointment

  1. Fonctionnalité : Cette vue permet de créer un nouveau rendez-vous pour un patient spécifique.
  2. Attributs :
    • model = Appointment : Spécifie que cette vue travaille avec le modèle Appointment.
    • fields : Liste des champs du modèle Appointment qui seront inclus dans le formulaire de création.
    • context_object_name = 'appointment' : Nom de la variable de contexte dans le template.
    • template_name : Spécifie le template utilisé pour afficher le formulaire de création.
    • success_url = reverse_lazy('patient_list') : Redirige l'utilisateur vers la liste des patients après la création réussie.
  3. Méthode form_valid :
    • Récupère l'ID du patient à partir des paramètres de l'URL (patient_id).
    • Associe le rendez-vous au patient correspondant avant de sauvegarder le formulaire.
  4. Utilisation : Cette vue est utilisée pour créer un rendez-vous lié à un patient spécifique.

 

8. Template d'affichage

8.1 Règles et normes des vues génériques

Nous adoptons toujours les vues génériques. A cet effet nous devons suivre les normes exigés par ces dernères, notamment la structure et le contenu des fichiers de templates pour le modèle Patient dans l'application patients. Voici donc la structure du template d'affichage des patients:

Remarque

Les fichiers des templates sont placés dans le dossier templates/patients pour respecter les bonnes pratiques de Django notamment les vues génériques. Nous devons maintenant créer et coder les fichiers du template d'affichage cités ci-dessus:

8.2 Template d'affichage de la liste des patients

8.3 Template d'affichage des details d'un patient

8.4 Template d'ajout ou de mise à jour d'un patient

8.5 Template de suppression d'un patient

8.6 Template d'ajout d'un rendez vous

8.7 Template d'ajout d'un traitement

On peut tester maintenant l'application et découvrir un aperçu de son fonctionnement:

projet cabinet médical Django application for doctor office

 

Younes Derfoufi CRMEF OUJDA

Leave a Reply