Application web de gestion d'inventaire personnel avec authentification sécurisée et calcul automatique de vétusté.
- À propos
- Fonctionnalités
- Technologies
- Prérequis
- Installation
- Configuration
- Lancement
- Tests
- Structure du projet
- Équipe
MobiList est une application web qui aide les particuliers à :
- Gérer un inventaire dématérialisé de leurs biens
- Conserver les justificatifs (photos, factures)
- Calculer automatiquement la vétusté et les pertes
- Sécuriser leurs données avec l'authentification à 2 facteurs
- Générer des rapports PDF pour les assurances
Contexte : SAE 3.01 - Développement d'application - BUT Informatique 2ème année
- Inscription et connexion sécurisée
- Authentification à 2 facteurs (A2F) par email
- Gestion de profil avec suppression de compte
- Support multilingue (FR, EN, TR)
- Création de logements avec adresses
- Organisation par pièces (salon, chambre, cuisine...)
- Ajout de biens avec catégories prédéfinies
- Upload de justificatifs (PDF, images)
- Calcul automatique de la vétusté selon l'âge
- Inventaire complet avec recherche et filtres
- Sélection des biens affectés
- Calcul du montant des pertes
- Génération de rapport PDF détaillé
- Dashboard admin avec statistiques
- Gestion des utilisateurs
- Validation des justificatifs avec notifications email
- Filtrage dynamique par utilisateur/logement/pièce
- Configuration des taux de vétusté
| Catégorie | Technologies |
|---|---|
| Backend | Python 3.8+, Flask 3.1.2 |
| Base de données | MySQL 8.0+, SQLAlchemy |
| Frontend | HTML5, CSS3, JavaScript (ES5) |
| Sécurité | Flask-Login, WTForms, CSRF Protection |
| Flask-Mail, SMTP | |
| WeasyPrint | |
| i18n | Flask-Babel (FR, EN, TR) |
| Tests | pytest, unittest, coverage |
- Python 3.8 ou supérieur
- MySQL 8.0 ou MariaDB 10.5+
- pip (gestionnaire de paquets Python)
- Git
- Un compte Gmail (pour l'envoi d'emails A2F)
Vérifier les installations :
python --version
pip --version
mysql --version
git --versiongit clone https://github.com/votre-utilisateur/Projet_FI_SAAS.git
cd Projet_FI_SAAS# Linux / macOS
python3 -m venv venv
source venv/bin/activate
# Windows
python -m venv venv
venv\Scripts\activatepip install --upgrade pip
pip install -r requirements.txt# Se connecter à MySQL
mysql -u root -p
# Dans le shell MySQL :
CREATE DATABASE mobilist CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mobilist_user'@'localhost' IDENTIFIED BY 'votre_mot_de_passe_secure';
GRANT ALL PRIVILEGES ON mobilist.* TO 'mobilist_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;mysql -u mobilist_user -p mobilist < AppliMobilist/BD/Mobilist_Base.sqlmysql -u mobilist_user -p mobilist < AppliMobilist/BD/peuplement.sqlAjoutez cette configuration (remplacez les valeurs par les vôtres) :
# ==========================================
# CONFIGURATION MOBILIST - FICHIER .ENV
# ==========================================
# --- BASE DE DONNÉES ---
DB_USER=mobilist_user
DB_PASSWORD=votre_mot_de_passe_secure
DB_HOST=localhost
DB_NAME=mobilist
# --- SÉCURITÉ ---
SECRET_KEY=votre-cle-secrete-super-longue-et-aleatoire-123456789
# Générer une clé sécurisée avec : python -c "import secrets; print(secrets.token_hex(32))"
# --- CONFIGURATION EMAIL (A2F) ---
# Compte Gmail fourni (prêt à l'emploi)
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USERNAME=mobilistnoreply@gmail.com
MAIL_PASSWORD=zalv tbnv mlfh scnj
MAIL_DEFAULT_SENDER=mobilistnoreply@gmail.com
# --- ENVIRONNEMENT ---
FLASK_ENV=development
FLASK_DEBUG=True
# --- UPLOADS ---
MAX_CONTENT_LENGTH=5242880 # 5 MB en octetsEmail déjà configuré et prêt à l'emploi :
Un compte Gmail dédié est fourni avec l'application. Utilisez cette configuration dans votre .env :
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USERNAME=mobilistnoreply@gmail.com
MAIL_PASSWORD=zalv tbnv mlfh scnj
MAIL_DEFAULT_SENDER=mobilistnoreply@gmail.comCe compte est prêt à envoyer les codes A2F. Aucune configuration Gmail supplémentaire n'est nécessaire.
mkdir -p AppliMobilist/static/uploads/justificatifs
chmod 755 AppliMobilist/static/uploadsSi vous modifiez les traductions :
# Extraire les chaînes à traduire
pybabel extract -F babel.cfg -o messages.pot .
# Mettre à jour les traductions
pybabel update -i messages.pot -d AppliMobilist/translations
# Compiler les fichiers .po en .mo
pybabel compile -d AppliMobilist/translations# Activer l'environnement virtuel
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# Lancer l'application
flask runApplication accessible sur http://127.0.0.1:5000
Emails admin configurés dans config.py :
ADMIN_EMAILS = ['admin@mobilist.fr']- Inscrire un compte avec l'email admin
- Se connecter
- Accéder à
/admin
pytest
coverage run -m pytest
coverage reportModule Coverage
-----------------------------------
__init__.py 100%
email_utils.py 100%
forms.py 100%
config.py 96%
app.py 86%
models.py 75%
views.py 42%
-----------------------------------
TOTAL 53%
Projet_FI/
├── AppliMobilist/ # Package principal
│ ├── __init__.py # Initialisation de l'app
│ ├── app.py # Configuration Flask
│ ├── models.py # Modèles SQLAlchemy
│ ├── views.py # Routes et contrôleurs
│ ├── forms.py # Formulaires WTForms
│ ├── email_utils.py # Gestion des emails A2F
│ ├── BD/ # Scripts SQL
│ │ ├── Mobilist_Base.sql # Schéma complet
│ │ ├── peuplement.sql # Données de test
│ │ └── triggers_sqlite.sql # Triggers
│ ├── static/ # Ressources statiques
│ │ ├── css/ # Feuilles de style
│ │ ├── js/ # Scripts JavaScript
│ │ └── uploads/ # Fichiers uploadés
│ ├── templates/ # Templates Jinja2
│ │ ├── base.html
│ │ ├── index.html
│ │ ├── verify_2fa.html
│ │ └── admin/ # Templates admin
│ ├── tests/ # Tests unitaires
│ │ ├── test_a2f.py
│ │ ├── test_admin.py
│ │ ├── test_email_utils.py
│ │ └── test_views.py
│ └── translations/ # Fichiers i18n
│ ├── en/LC_MESSAGES/
│ └── tr/LC_MESSAGES/
├── rendu/ # Rapports et livrables
│ └── RAPPORT_INDIVIDUEL_SEMAINE3.md
├── config.py # Configuration globale
├── run.py # Point d'entrée
├── requirements.txt # Dépendances Python
├── babel.cfg # Config Babel
├── .env # Variables d'environnement (à créer)
├── .gitignore
└── Readme.md # Ce fichier
Projet développé par :
- Kylian HANIQUET
- Erdem KURAC
- Arif APAYDIN
- Emrecan DEMIRTAY
Encadrant : M. GILLET IUT Orleans
- Ne jamais commiter le fichier
.env - Changez la
SECRET_KEYen production - Utilisez HTTPS en production
- Activez l'A2F pour tous les comptes admin
- Les triggers sont chargés automatiquement au démarrage
-
Activer l'A2F pour un utilisateur
- Connectez-vous à l'application
- Accédez à votre profil
- Dans la section "Paramètres", activez le switch "Authentification à deux facteurs"
-
Connexion avec A2F activé
- Entrez votre email et mot de passe
- Un code à 6 chiffres est envoyé à votre email
- Entrez le code dans la page de vérification (valide 10 minutes)
- Cliquez sur "Renvoyer le code" si nécessaire
Mailtrap (pour les tests en développement) :
MAIL_SERVER=smtp.mailtrap.io
L_PORT=587
MAIL_USERNAME=votre-email@outlook.com
MAIL_PASSWORD=votre-mot-de-passeflask runOu directement :
python AppliMobilist/app.pyL'application sera accessible sur http://localhost:5000
Code Mocodo: ASSUREUR: id_assureur, nom, email_contact ASSURER, 0N CLIENT, 01 ASSUREUR
CLIENT: id_client, nom, prenom, email, mdp, date_creation_cpt POSSEDER, 0N CLIENT, 0N LOGEMENT
LOGEMENT: id_logement, adresse, type_logement, date_ajout CONTENIR, 11 LOGEMENT, 0N SALLE
SALLE: id_salle, nom_salle STOCKER, 11 SALLE, 0N BIEN
CATEGORIE_BIEN: id_categorie, nom_categorie, taux_annuel CATEGORISER, 11 BIEN, 0N CATEGORIE_BIEN
BIEN: id_bien, nom_bien, prix_achat, date_achat, valeur_actuelle, est_assure
JUSTIFIER, 11 BIEN, 0N JUSTIFICATIF JUSTIFICATIF: id_justificatif, type_justificatif, chemin_fichier, date_ajout, est_valide POSSEDER_JUSTIF, 1N BIEN, 1N JUSTIFICATIF
RAPPORT: id_rapport, date_generation, chemin_pdf, total_valeur_neuf, total_valeur_actuelle, perte_totale GENERER, 11 CLIENT, 0N RAPPORT CONCERNER, 11 LOGEMENT, 0N RAPPORT VALIDER, 01 ASSUREUR, 0N RAPPORT
https://drive.google.com/file/d/1JoEySIsrkXjepgKNDoDcLHKrqvTmdy6b/view?usp=sharing
https://drive.google.com/file/d/1AgTkWvYJrBCfJeNcbH25ke5Am9Vyrrl4/view?usp=sharing
https://drive.google.com/file/d/17YTLoH1UB_x9tXfGdNs0KYuNkzSRt0qX/view?usp=sharing