Application de gestion de relation client (CRM) pour Epic Events, une entreprise d'organisation d'événements.
Epic Events CRM est une application en ligne de commande qui permet de gérer :
- Les clients et leurs informations de contact
- Les contrats associés aux clients
- Les événements organisés pour les clients
- Les collaborateurs et leurs permissions par département
L'application implémente un système de permissions basé sur les rôles (RBAC) avec trois départements :
- Sales (Commercial) : Gestion des clients et création d'événements
- Support : Gestion des événements assignés
- Gestion : Administration complète du système
- Interface utilisateur riche avec Rich (tableaux, panels, ASCII art)
- Navigation intuitive par menus
- Design avec bordures personnalisées et couleurs
- Créer un client (Sales/Gestion)
- Lister les clients (filtré selon le rôle)
- Modifier les informations client
- Recherche et affichage détaillé
- Créer des contrats (Gestion uniquement)
- Lister et filtrer les contrats :
--unsigned: contrats non signés--unpaid: contrats non entièrement payés
- Modifier les contrats (Sales pour leurs clients, Gestion pour tous)
- Signature de contrats avec notification Sentry
- Créer des événements pour contrats signés (Sales)
- Assigner un support à un événement (Gestion)
- Modifier les événements (Support pour les leurs, Gestion pour tous)
- Filtrer les événements :
--no-support: événements sans support assigné (Gestion)--mine: événements qui me sont assignés (Support)
- Créer des utilisateurs (Gestion uniquement)
- Modifier les rôles et départements
- Supprimer des collaborateurs
- Système de superuser pour droits étendus
- Authentification JWT avec tokens persistants
- Mots de passe hachés avec Argon2
- Principe du moindre privilège
- Protection contre injections SQL (ORM)
- Journalisation avec Sentry
- Python 3.9 ou supérieur
- PostgreSQL (ou autre base de données compatible SQLAlchemy)
- Compte Sentry
git clone https://github.com/MaximeJB/EpicEvents.git
cd EpicEvents# Windows
python -m venv .venv
.venv\Scripts\activate
# Linux/macOS
python3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtCréez un fichier .env à la racine du projet :
DATABASE_URL=postgresql+psycopg2://username:password@localhost:5432/epicevents
SECRET_KEY=votre-cle-secrete-jwt-ici
ACCES_TOKEN_EXPIRE_MINUTES=1440
ALGORITHM=HS256
SENTRY_DSN=https://votre-dsn-sentry@sentry.io/...Important : Remplacez les valeurs par vos propres informations.
# Se connecter à PostgreSQL
psql -U postgres
# Créer la base de données
CREATE DATABASE epicevents;
# Créer un utilisateur (optionnel)
CREATE USER epicevents_user WITH PASSWORD 'votre_mot_de_passe';
GRANT ALL PRIVILEGES ON DATABASE epicevents TO epicevents_user;
# Quitter psql
\qpython init_db.pyCette commande :
- Crée toutes les tables nécessaires
- Insère les 3 rôles par défaut (sales, support, gestion)
Vous devrez créer manuellement le premier utilisateur gestion directement dans la base de données ou via un script Python.
Option : Via script Python
Créez un fichier create_admin.py :
from app.db import SessionLocal
from app.models import User, Role
from app.auth import hash_password
db = SessionLocal()
role_gestion = db.query(Role).filter(Role.name == "gestion").first()
password_hash = hash_password("votre_mot_de_passe_admin")
admin = User(
email="admin@epicevents.com",
password_hash=password_hash,
name="Administrateur",
department="gestion",
role_id=role_gestion.id,
is_superuser=True
)
db.add(admin)
db.commit()
print(f"✓ Administrateur créé : {admin.email}")
db.close()Exécutez : python create_admin.py
Menu principal interactif (recommandé) :
python main.py menu_principalInterface Click CLI classique :
python main.py --helpSe connecter :
python main.py auth login
# Entrez votre email et mot de passeVérifier l'utilisateur connecté :
python main.py auth whoamiSe déconnecter :
python main.py auth logoutEpicEvents/
│
├── app/
│ ├── __init__.py
│ ├── models.py # Modèles SQLAlchemy (User, Client, Contract, Event)
│ ├── auth.py # Authentification JWT + Argon2
│ ├── db.py # Configuration base de données
│ ├── cli_app.py # Configuration CLI Click
│ │
│ ├── managers/ # Couche d'accès aux données (Data Access Layer)
│ │ ├── __init__.py
│ │ ├── user.py # Opérations CRUD utilisateurs
│ │ ├── client.py # Opérations CRUD clients
│ │ ├── contract.py # Opérations CRUD contrats
│ │ └── event.py # Opérations CRUD événements
│ │
│ └── views/ # Interface CLI (Couche présentation)
│ ├── __init__.py
│ ├── auth.py # Commandes login/logout/whoami
│ ├── client.py # Commandes client
│ ├── contract.py # Commandes contrat
│ ├── event.py # Commandes événement
│ └── user.py # Commandes collaborateur
│
├── tests/ # Tests unitaires et d'intégration (129 tests, 99% coverage)
│ ├── conftest.py # Fixtures pytest
│ ├── test_auth.py # Tests authentification et autorisation
│ ├── test_models.py # Tests modèles de données
│ ├── test_crud_user.py # Tests CRUD utilisateurs
│ ├── test_crud_client.py # Tests CRUD clients
│ ├── test_crud_contract.py # Tests CRUD contrats
│ ├── test_crud_event.py # Tests CRUD événements
│ └── test_e2e_workflow.py # Tests end-to-end workflows
│
├── main.py # Point d'entrée principal
├── init_db.py # Script d'initialisation DB
├── requirements.txt # Dépendances Python
├── .env # Variables d'environnement (non versionné)
├── .gitignore
└── README.md
# Activer l'environnement virtuel
.venv\Scripts\activate # Windows
source .venv/bin/activate # Linux/macOS
# Lancer pytest
pytest -vpytest --cov=app tests/| Fonctionnalité | Sales (Commercial) | Support | Gestion |
|---|---|---|---|
| Clients | |||
| Créer un client | ✅ (assigné auto) | ❌ | ✅ |
| Lister les clients | ✅ (ses clients) | ✅ (tous) | ✅ (tous) |
| Modifier un client | ✅ (ses clients) | ❌ | ✅ (tous) |
| Contrats | |||
| Créer un contrat | ❌ | ❌ | ✅ |
| Lister les contrats | ✅ (ses clients) | ✅ (tous) | ✅ (tous) |
| Modifier un contrat | ✅ (ses clients) | ❌ | ✅ (tous) |
| Signer un contrat | ✅ (ses clients) | ❌ | ✅ (tous) |
| Événements | |||
| Créer un événement | ✅ (ses clients) | ❌ | ❌ |
| Lister les événements | ✅ (ses clients) | ✅ (ses events) | ✅ (tous) |
| Modifier un événement | ❌ | ✅ (ses events) | ✅ (tous) |
| Assigner un support | ❌ | ❌ | ✅ |
| Collaborateurs | |||
| Créer un utilisateur | ❌ | ❌ | ✅ |
| Lister les utilisateurs | ❌ | ❌ | ✅ |
| Modifier un utilisateur | ❌ | ❌ | ✅ |
| Supprimer un utilisateur | ❌ | ❌ | ✅ |
- Hachage des mots de passe : Argon2 (algorithme moderne résistant aux GPU)
- Authentification JWT : Tokens avec expiration (24h par défaut)
- Principe du moindre privilège : Permissions strictes par rôle
- Protection injection SQL : Utilisation exclusive de l'ORM SQLAlchemy
- Variables d'environnement : Données sensibles dans
.env(non versionné) - Journalisation Sentry : Tracking des événements métier et erreurs
- ✅ Toutes les exceptions inattendues (automatique)
- ✅ Création d'un collaborateur
- ✅ Modification d'un collaborateur
- ✅ Signature d'un contrat
Couverture de tests : 99% ✅
Name Stmts Miss Cover Missing
--------------------------------------------------------
app\auth.py 62 1 98% 176
app\db.py 9 0 100%
app\managers\__init__.py 0 0 100%
app\managers\client.py 29 0 100%
app\managers\contract.py 39 0 100%
app\managers\event.py 55 0 100%
app\managers\user.py 40 0 100%
app\models.py 56 0 100%
--------------------------------------------------------
TOTAL 290 1 99%
125 tests passed, 3 warnings in 13.91s
Détails :
- ✅ 125 tests unitaires et d'intégration
- ✅ 99% de couverture sur la logique métier (models, auth, managers)
- ✅ 100% de couverture sur tous les managers (user, client, contract, event)
- ✅ 100% de couverture sur les modèles de données
La seule ligne non couverte (ligne 176 de auth.py) concerne le cas du superuser, qui est une feature edge non utilisée actuellement.
Commande pour reproduire :
flake8 app/ tests/ main.py --statistics --countConfiguration utilisée : .flake8 avec max-line-length=120
Ce projet est développé dans le cadre d'un exercice de formation OpenClassrooms.
Maxime - Développeur Python en formation