/Projet-Epic-Events

Python Django MySQL Sentry Postman

Primary LanguagePython

Static Badge Static Badge Static Badge
Static Badge
Static Badge
Static BadgeDocumentation Postman du projet Epic Events

Static Badge
Static Badge
Static Badge

Run In Postman

Menu

  1. Informations générales
  2. Fonctionnalités
  3. Liste pré-requis
  4. Création environnement
  5. Activation environnement
  6. Installation des librairies
  7. Installation du SGBD MySQL
  8. Installation et chargement de la base de données MySQL
  9. Connecter l'application à la base de données MySQL
  10. Installation des variables d'environnement
  11. Administration opérations CRUD et gestionnaires de commmandes
  12. Exécution de l'application
  13. Tests avec Pyest
  14. Tests de couverture de code avec Coverage
  15. Monitoring avec Sentry
  16. Rapport avec flake8
  17. Informations importantes sur les différents fichiers et dossiers
  18. Auteur et contact

Projet Epic Events

Logo Epic Events
  • Application conçu pour faciliter une collaboration efficace entre les équipes chez Epic Events de la gestion de la relation client CRM (Customer Relationship Management).
  • L'objectif principal est de mettre en place une base de données qui permette de stocker et de manipuler de manière sécurisée les informations des clients, ainsi que les contrats et les événements.
  • Application Python, incluant la journalisation avec Sentry.

Note : Plusieurs besoins de l'application Epic Events ont été mis en place.

Besoins généraux

  • Chaque collaborateur doit avoir ses identifiants pour utiliser la plateforme.
  • Chaque collaborateur est associé à un rôle (suivant son département).
  • La plateforme doit permettre de stocker et de mettre à jour les informations sur les clients, les contrats et les événements.
  • Tous les collaborateurs doivent pouvoir accéder à tous les clients, contrats et événements en lecture seule.

Besoins individuels

Équipe de gestion :
  • Créer, mettre à jour et supprimer des collaborateurs dans le système CRM.
  • Créer et modifier tous les contrats.
  • Filtrer l’affichage des événements : afficher tous les événements qui n’ont pas de « support » associé.
  • Modifier des événements (pour associer un collaborateur support à l’événement).

Besoins individuels

Équipe commerciale :
  • Créer des clients (le client leur sera automatiquement associé).
  • Mettre à jour les clients dont ils sont responsables.
  • Modifier et mettre à jour les contrats des clients dont ils sont responsables.
  • Filtrer l’affichage des contrats : afficher tous les contrats qui ne sont pas encore signés, ou qui ne sont pas encore entièrement payés.
  • Créer un événement pour un de leurs clients qui a signé un contrat.

Besoins individuels

Équipe support :
  • Filtrer l’affichage des événements : afficher uniquement les événements qui leur sont attribués.
  • Mettre à jour les événements dont ils sont responsables.

Retour en haut 🡅

Fonctionnalités

  • Opérations d'administration et de gestion des utilisateurs, des clients, des contrats et des événements.
  • Visualisation des informations et données des utilisateurs, des clients, des contrats et événements.

Note : Testé sous Windows 10 Professionnel - Python 3.12.0


Retour en haut 🡅

Liste pré-requis

Application conçue avec les technologies suivantes :

  • Python v3.12.0 choisissez la version adaptée à votre ordinateur et système.

  • Python est disponible à l'adresse suivante ➔ https://www.python.org/downloads/

  • Django version 4.2.7 ➔ Documentation Django

  • MySQL version 8.0 ➔ Documentation MySQL

  • Windows 10 Professionnel
     

  • Les scripts Python s'exécutent depuis un terminal.

    • Pour ouvrir un terminal sur Windows, pressez la touche windows + r et entrez cmd.
    • Sur Mac, pressez la touche command + espace et entrez terminal.
    • Sur Linux, vous pouvez ouviri un terminal en pressant les touches Ctrl + Alt + T.

Retour en haut 🡅

Création de l'environnement virtuel

  • Installer une version de Python compatible pour votre ordinateur.
  • Une fois installer ouvrer le cmd (terminal) placer vous dans le dossier principal (dossier racine).

Taper dans votre terminal :

$ python -m venv env

Note : Un répertoire appelé env doit être créé.


Retour en haut 🡅

Activation de l'environnement virtuel

  • Placez-vous avec le terminal dans le dossier principale (dossier racine).

Pour activer l'environnement virtuel créé, il vous suffit de taper dans votre terminal :

$ env\Scripts\activate.bat
  • Ce qui ajoutera à chaque début de ligne de commande de votre terminal (env) :

Note : Pour désactiver l'environnement virtuel, il suffit de taper dans votre terminal :

$ deactivate

Retour en haut 🡅

Installation des librairies

  • Le programme utilise plusieurs librairies externes et modules de Python, qui sont répertoriés dans le fichier requirements.txt.
  • Placez-vous dans le dossier où se trouve le fichier requirements.txt à la racine du projet, l'environnement virtuel doit être activé.
  • Pour faire fonctionner l'application, il vous faudra installer les librairies requises.
  • À l'aide du fichiers requirements.txt mis à disposition.

Taper dans votre terminal la commande :

$ pip install -r requirements.txt

Retour en haut 🡅

Installation du SGBD MySQL

  • Pour le projet Epic Events la gestion des données utilise le SGBD MySQL.

  • Installer MySQL qui est disponible à l'adresse suivante ➔ https://dev.mysql.com/downloads/installer/

  • Une fois le programme téléchargé, lancez-le en double-cliquant dessus, autorisez le programme à s'installer.

Note : Je vous conseille de choisir la version Serveur only lors de l'installation.

  • Il y a plusieurs manières d'utiliser MySQL soit par MySQL 8.0 Command Line Client une fois MySQL installé.
  • Soit par le terminal CMD de Windows, pour cela il faut créer une variable d'environnement pour ouvrir MySQL d'un terminal CMD.

Note : Je vous conseille de créer une variable d'environnement dans le PATH.

Allez dans Paramères avancés du systèmeVariables d'environnementVariable systèmePath

Cliquez sur modifier ajoutez les variables suivantes :

C:\Program Files\MySQL\MySQL Server 8.0\bin
C:\Program Files\MySQL\MySQL Server 8.0\lib

Après ces modifications vous pourrez utiliser MySQL depuis le terminal CMD.


Retour en haut 🡅

Installation et chargement de la base de données MySQL

Note : Ces commandes sont fonctionnelles si vous avez installer les variables d'environnement dans le PATH.

  • Pour lancer et vous connectez à MySQL
    Lancer un terminal CMD, puis taper la commande :
$ mysql -u root -p
  • Une fois identifié et connecté créer la base de données avec la commande :
$ mysql> CREATE DATABASE epicevents;
  • Pour afficher la base de données MySQL.
    Ensuite taper la commande :
$ SHOW DATABASES;
  • Pour utiliser la base de données.
    On utilise la commande :
$ USE epicevents;
  • Charger les tables de la base de données grâce au fichier EpicEvents.sql disponible dans le dossier principal du projet.
    On utilise la commande :
$ source C:\path\to\directory\Epic Events\EpicEvents.sql
  • Quittez MySQL.
    Avec la commande :
$ exit;

Retour en haut 🡅

Connecter l'application à la base de données MySQL

Dans le cadre de Django et de l'utilisation de MySQL, la configuration de Django pour travailler avec une base de données MySQL implique d'établir une connexion à cette dernière.
Après avoir installé MySQL et chargé les tables depuis le fichier EpicEvents.sql, la configuration de l'application Django nécessite la mise en place de cette connexion.

  • Ouvrez un terminal CMD activer l'environnement virtuel.

    Exécutez la commande :

$ python manage.py makemigrations
  • Ensuite taper la commande :
$ python manage.py migrate
  • L'exécution des commandes makemigrations et migrate génère les tables, y compris celles de jonction (d'associations), dans la base de données.
  • Ces tables de jonction sont automatiquement créées en fonction de la structure des modèles Django.

À présent, la base de données est chargée et fonctionnelle, prête à être utilisée avec l'application Epic Events.
Vous pouvez vérifier ceci en vous connectant à MySQL.

  • Dans un terminal CMD, connectez-vous avec la commande suivante :
$ mysql -u root -p
  • Affichez et utilisez la base de données avec les commandes suivantes :
$ SHOW DATABASES;
$ USE epicevents;
  • Pour vérifier la création et les structures des tables, utilisez les commandes :
$ SHOW tables;
$ SHOW COLUMNS FROM NomDeLaTable;
  • Pour vérifier les données présentes dans une table, utilisez les commandes :
$ SELECT * FROM NomDeLaTable;

# Cette requête est utilisée pour afficher la déclaration SQL complète nécessaire pour recréer une table existante, y compris tous ses indices, contraintes et autres propriétés.
# Cette requête retourne un ensemble de résultats avec une colonne appelée "Create Table" qui contient la déclaration SQL complète de la table spécifiée.
$ SHOW CREATE TABLE NomDeLaTable;

ERD Epic Events

  • ERD (Entity-Relationship Diagram) de la base de données Epic Events

ERD bdd


Retour en haut 🡅

Installation des variables d'environnement

  • Pour utiliser l'application, il faut configurer l'environnement de l'application Epic Events et générer une clé secrète aléatoire pour la configuration de Django.
  • De plus, il est nécessaire d'inclure des noms de variables d'environnement préconfigurées.
Configuration de l'environnement :

Il est essentiel de configurer l'environnement de l'application.

  • Générez une clé secrète aléatoire pour la configuration de Django et incluez des noms de variables d'environnement préconfigurées.

Utilisez le fichier .env, voici un exemple d'un fichier .env une fois configuré avec les paramètres :

DJANGO_SECRET_KEY=%x7xmakyvew_am2-0_n*0inmjkdncucg!^_!i3&==k@d2j+4vo
DB_NAME=epicevents
DB_USER=root
DB_PASSWORD=************
DB_HOST=127.0.0.1
DB_PORT=3306
SENTRY_DSN=https://4e2cb1f62e0cfa9eb9a98f9a@o450496232.ingest.sentry.io/4506596576
Création du fichier .env :

À la racine du dossier principal d'Epic Events, exécutez le fichier create_env.bat ➔ (create_env.bat).
Double-cliquez dessus pour enregistrer le fichier .env à la racine du dossier principal.

Create .env

Configuration du fichier .env :

Une fois le fichier .env créé, ouvrez-le avec un éditeur de texte.

  • Remplissez les champs avec les valeurs appropriées pour chaque variable d'environnement.
  • Ces étapes garantissent une configuration correcte de l'environnement nécessaire au bon fonctionnement de l'application Epic Events.

Note : La clé SENTRY_DSN doit être récupérée dans les paramètres de votre compte Sentry.

Note : Le fichier .env généré doit être configuré avec des valeurs appropriées pour chaque variable d'environnement avant utilisation.


Retour en haut 🡅

Administration opérations CRUD et gestionnaire de commmandes

La gestion des opérations CRUD peut se faire de plusieurs manières :

  • En utilisant des requêtes sous forme de commandes dans MySQL
  • En utilisant des commandes dans Le shell Django
  • En utilisant le site d'administration de Django à l'adresse suivante ➔ http://127.0.0.1:8000/admin/

Note : Le site d'administration de Django est accessible seulement aux administrateurs et aux utilisateurs de l'équipe gestion.

  • Dans ce projet, la mise en place d'un gestionnaire de commandes a été réalisée avec les bibliothèques Click et Rich, ainsi qu'avec BaseCommand de Django.
  • Ce gestionnaire de commandes fonctionne avec les privilèges administrateur et ne reflète donc pas les permissions et besoins individuels de chaque département.

Note : Les permissions de chaque département sont fonctionnelles et activées, ceci peut être vérifié en utilisant Postman.

PostmanDocumentation Postman du projet Epic Events

  • Import et exécute la collection dans votre propre espace de travail PostmanRun In Postman

Ouvrez un terminal CMD et activez l'environnement virtuel.

Les commandes d'administration et de gestion pour utiliser le gestionnaire de commandes.

- Afficher tous les utilisateurs.

  • Exemple de sortie dans le terminal :

Display users

$ python manage.py management_user --display_users
- Création, mise à jour, suppression d'un utilisateur ou d'un administrateur.
$ python manage.py management_user --create_user
$ python manage.py management_user --create_superuser
$ python manage.py management_user --update_user [id_user]
$ python manage.py management_user --delete_user [id_user]

- Afficher tous les clients.

  • Exemple de sortie dans le terminal :

Display clients

$ python manage.py management_client --display_clients
- Création, mise à jour, suppression d'un client.
$ python manage.py management_client --create_client
$ python manage.py management_client --update_client [id_client]
$ python manage.py management_client --delete_client [id_client]

- Afficher tous les contrats.

  • Exemple de sortie dans le terminal :

Display contracts

$ python manage.py management_contract --display_contracts
- Création, mise à jour, suppression d'un contrat.
$ python manage.py management_contract --create_contract
$ python manage.py management_contract --update_contract [id_contract]
$ python manage.py management_contract --delete_contract [id_contract]

- Afficher tous les événements.

  • Exemple de sortie dans le terminal :

Display events

$ python manage.py management_event --display_events
- Création, mise à jour, suppression d'un événement.
$ python manage.py management_event --create_event
$ python manage.py management_event --update_event [id_event]
$ python manage.py management_event --delete_event [id_event]

Retour en haut 🡅

Exécution de l'application

Utilisation de l'application.

Lancement du serveur Django.

  • Placez-vous avec le terminal CMD dans le dossier principal.

  • Activer l'environnement virtuel et ensuite lancer le serveur Django.

    Taper dans votre terminal la commande :

$ python manage.py runserver
  • Démarrer le serveur vous permet d'accéder au site d'administration de Django.
  • Disponible à l'adresse suivante ➔ http://127.0.0.1:8000/admin/
  • Permets d'utiliser les requêtes GET, POST, PUT, DEL lors de l'utilisation de Postman.

Note : Le site d'administration de Django est accessible seulement aux administrateurs et aux utilisateurs de l'équipe gestion.

Note navigateur : Les tests ont était fait sur Firefox et Google Chrome.


Retour en haut 🡅

Tests avec Pytest

  • Nous effectuons des tests unitaires et d'intégrations de plusieurs manières pour garantir la qualité du code.

Note : Pour exécuter les tests il est nécessaire d'avoir activer l'environnement virtuel, mais il n'est pas nécessaire de lancer le serveur Django.

Exécution de Pytest

  • Utilisation de Pytest pour effectuer les tests. ➔ Documentation Pytest
  • Pour exécuter les tests à l'aide de Pytest, utilisez la commande suivante :
$ pytest
(env) C:\Epic Events>pytest
======================================= test session starts =======================================
platform win32 -- Python 3.12.0, pytest-7.4.3, pluggy-1.3.0 -- C:\Epic Events\env\Scripts\python.exe
cachedir: .pytest_cache
django: version: 4.2.7, settings: EpicEvents.settings (from ini)
rootdir: C:\Epic Events
configfile: setup.cfg
plugins: cov-4.1.0, django-4.7.0, time-machine-2.13.0
collected 71 items

contracts/tests.py::TestContractsApp::test_contract_print_details PASSED                        [1%]
contracts/tests.py::TestContractsApp::test_contract_str_representation PASSED                   [2%]
contracts/tests.py::TestContractsApp::test_save_method PASSED                                   [4%]
contracts/tests.py::TestContractViewSet::test_all_contracts_details PASSED                      [5%]
contracts/tests.py::TestContractViewSet::test_contract_details PASSED                           [7%]
contracts/tests.py::TestContractViewSet::test_contract_details_unauthorized_user PASSED         [8%]
contracts/tests.py::TestContractViewSet::test_contracts_list PASSED                             [9%]
contracts/tests.py::TestContractViewSet::test_create_contract PASSED                           [11%]
contracts/tests.py::TestContractViewSet::test_create_contract_unauthorized_user PASSED         [12%]
contracts/tests.py::TestContractViewSet::test_destroy_contract PASSED                          [14%]
contracts/tests.py::TestContractViewSet::test_destroy_contract_unauthorized_user PASSED        [15%]
contracts/tests.py::TestContractViewSet::test_filtered_contracts PASSED                        [16%]
contracts/tests.py::TestContractViewSet::test_returns_all_contracts_associated_to_user PASSED  [18%]
contracts/tests.py::TestContractViewSet::test_update_contract PASSED                           [19%]
contracts/tests.py::TestContractViewSet::test_update_contract_unauthorized_user PASSED         [21%]
events/tests.py::TestEventsApp::test_event_print_details PASSED                                [22%]
events/tests.py::TestEventsApp::test_event_str_representation PASSED                           [23%]
events/tests.py::TestEventsApp::test_save_method PASSED                                        [25%]
events/tests.py::TestEventViewSet::test_all_events_details PASSED                              [26%]
events/tests.py::TestEventViewSet::test_create_event PASSED                                    [28%]
events/tests.py::TestEventViewSet::test_create_event_already_exists PASSED                     [29%]
events/tests.py::TestEventViewSet::test_create_event_contract_not_signed PASSED                [30%]
events/tests.py::TestEventViewSet::test_create_event_unauthorized_user PASSED                  [32%]
events/tests.py::TestEventViewSet::test_destroy_event PASSED                                   [33%]
events/tests.py::TestEventViewSet::test_destroy_event_unauthorized_user PASSED                 [35%]
events/tests.py::TestEventViewSet::test_event_details PASSED                                   [36%]
events/tests.py::TestEventViewSet::test_event_details_unauthorized_user PASSED                 [38%]
events/tests.py::TestEventViewSet::test_events_list PASSED                                     [39%]
events/tests.py::TestEventViewSet::test_events_without_support PASSED                          [40%]
events/tests.py::TestEventViewSet::test_update_event PASSED                                    [42%]
events/tests.py::TestEventViewSet::test_update_event_unauthorized_user PASSED                  [43%]
profiles/tests.py::TestProfilesApp::test_add_client_to_group PASSED                            [45%]
profiles/tests.py::TestProfilesApp::test_assign_sales_contact PASSED                           [46%]
profiles/tests.py::TestProfilesApp::test_create_client1 PASSED                                 [47%]
profiles/tests.py::TestProfilesApp::test_create_client2 PASSED                                 [49%]
profiles/tests.py::TestProfilesApp::test_create_superuser PASSED                               [50%]
profiles/tests.py::TestProfilesApp::test_create_superuser_invalid_attributes PASSED            [52%]
profiles/tests.py::TestProfilesApp::test_create_user_management PASSED                         [53%]
profiles/tests.py::TestProfilesApp::test_create_user_sales PASSED                              [54%]
profiles/tests.py::TestProfilesApp::test_create_user_support PASSED                            [56%]
profiles/tests.py::TestProfilesApp::test_create_user_with_empty_email PASSED                   [57%]
profiles/tests.py::TestProfilesApp::test_has_module_perms PASSED                               [59%]
profiles/tests.py::TestProfilesApp::test_has_perm PASSED                                       [60%]
profiles/tests.py::TestProfilesApp::test_obtain_jwt_token_url PASSED                           [61%]
profiles/tests.py::TestProfilesApp::test_refresh_jwt_token_url PASSED                          [63%]
profiles/tests.py::TestProfilesApp::test_str_method_with_sales_contact PASSED                  [64%]
profiles/tests.py::TestLoginViewSet::test_user_login_inactive_account PASSED                   [66%]
profiles/tests.py::TestLoginViewSet::test_user_login_invalid_credentials PASSED                [67%]
profiles/tests.py::TestLoginViewSet::test_user_login_successful PASSED                         [69%]
profiles/tests.py::TestClientViewSet::test_all_clients_details PASSED                          [70%]
profiles/tests.py::TestClientViewSet::test_client_details PASSED                               [71%]
profiles/tests.py::TestClientViewSet::test_client_details_unauthorized_user PASSED             [73%]
profiles/tests.py::TestClientViewSet::test_clients_list PASSED                                 [74%]
profiles/tests.py::TestClientViewSet::test_clients_list_associated_to_user PASSED              [76%]
profiles/tests.py::TestClientViewSet::test_create_client PASSED                                [77%]
profiles/tests.py::TestClientViewSet::test_create_clients_unauthorized_user PASSED             [78%]
profiles/tests.py::TestClientViewSet::test_destroy_client PASSED                               [80%]
profiles/tests.py::TestClientViewSet::test_destroy_client_unauthorized_user PASSED             [81%]
profiles/tests.py::TestClientViewSet::test_update_client PASSED                                [83%]
profiles/tests.py::TestClientViewSet::test_update_client_unauthorized_user PASSED              [84%]
profiles/tests.py::TestUserViewSet::test_all_users_details PASSED                              [85%]
profiles/tests.py::TestUserViewSet::test_create_user PASSED                                    [87%]
profiles/tests.py::TestUserViewSet::test_create_user_unauthorized_user PASSED                  [88%]
profiles/tests.py::TestUserViewSet::test_destroy_user PASSED                                   [90%]
profiles/tests.py::TestUserViewSet::test_destroy_user_unauthorized_user PASSED                 [91%]
profiles/tests.py::TestUserViewSet::test_retrieve_all_user_list PASSED                         [92%]
profiles/tests.py::TestUserViewSet::test_returns_details_specific_user PASSED                  [94%]
profiles/tests.py::TestUserViewSet::test_update_user PASSED                                    [95%]
profiles/tests.py::TestUserViewSet::test_update_user_unauthorized_user PASSED                  [97%]
profiles/tests.py::TestUserViewSet::test_user_details PASSED                                   [98%]
profiles/tests.py::TestUserViewSet::test_users_list PASSED                                    [100%]

================================= 71 passed in 306.71s (0:05:06) ==================================
  • Pour afficher plus d'informations sur les tests lors de leurs exécutions vous pouvez utiliser la commande :
$ pytest -v -s

Retour en haut 🡅

Tests de couverture de code avec Coverage

  • Utilisation de Coverage pour mesurer la couverture de code. ➔ Documentation Coverage

  • Cette commande exécute les tests en utilisant Coverage pour collecter les informations de couverture.

$ pytest --cov=.
---------- coverage: platform win32, python 3.12.0-final-0 -----------
Name                  Stmts   Miss  Cover
-----------------------------------------
contracts\models.py      30      1    97%
contracts\views.py       81      3    96%
events\models.py         30      0   100%
events\views.py          95      5    95%
profiles\models.py      132     11    92%
profiles\views.py       146      9    94%
-----------------------------------------
TOTAL                   514     29    94%


=================== 71 passed in 284.05s (0:04:44) ====================

Renvoie : 94% de couverture de code.

  • Pour afficher un rapport de couverture avec plus de détails.
$ pytest --cov=. --cov-report html
  • Cela générera un dossier htmlcov dans lequel vous pouvez ouvrir le fichier index.html pour visualiser un rapport interactif de la couverture de code dans votre navigateur.

Rapport Coverage

Rapport Coverage


Retour en haut 🡅

Monitoring avec Sentry

La surveillance (ou monitoring) sur Sentry s'effectue en accédant à votre tableau de bord après avoir créé un projet et récupéré les informations nécessaires (clé DSN).

  • Sentryhttps://sentry.io/welcome/
  • Des déclencheurs ont été configurés au niveau des vues de l'application.
  • Ces déclencheurs sont activés lorsqu'un utilisateur tente d'accéder à des opérations d'administration sans autorisation.
  • Cela déclenchera une alerte qui sera envoyée à Sentry.

Voici un exemple d'alerte sur la capture d'écran suivante :

Sentry monitoring


Retour en haut 🡅

Rapport avec flake8

Tapez dans votre terminal la commande :

$ flake8
  • Ne renvoie aucune erreur.

Retour en haut 🡅

Informations importantes sur les différents fichiers et dossiers

Les dossiers contract, events, profiles

  • Chacun contient un fichier tests.py contenant les configurations pour les tests.

Les dossiers management/commmands

Le dossier utils

  • Le dossier contient le fichier creating_environment_variables.py qui génère le fichier .env pour les variables d'environnement (creating_environment_variables.py)

Le dossier static

  • Dossier qui contient qui contient les images et les badges nécessaire à l'application.

Le fichier EpicEvents.sql

  • Le fichier EpicEvents.sql contient la configuration des tables pour la base de données ➔ (EpicEvents.sql)

Le fichier .coveragerc

  • Le fichier contient la configuration de Coverage (.coveragerc)

Le fichier .flake8

  • Le fichier contient la configuration de Flake8 (.flake8)

Retour en haut 🡅

Auteur et contact

Pour toute information supplémentaire, vous pouvez me contacter.
Bubhux : bubhuxpaindepice@gmail.com