Backend Flask pour l'application web Supercoop, fournissant une API RESTful pour la gestion des produits, des commandes et des utilisateurs.
backend/
├── app/ # Code source principal
│ ├── auth/ # Authentification et autorisation
│ ├── main/ # Routes et logique métier principale
│ ├── odoo/ # Intégration avec Odoo
│ ├── services/ # Services métier
│ └── templates/ # Templates HTML
├── migrations/ # Fichiers de migration de la base de données
├── tests/ # Tests automatisés
└── instance/ # Fichiers de configuration
- Flask - Framework web
- Flask-SQLAlchemy - ORM pour la base de données
- Flask-Migrate - Gestion des migrations
- Flask-CORS - Gestion des requêtes cross-origin
- Python-Jose - Authentification JWT
- Requests - Requêtes HTTP
- Hypercorn - Serveur ASGI
-
Cloner le dépôt
git clone [url-du-depot] cd webapp-backend -
Installer les dépendances
pip install -r requirements.txt
-
Configurer l'environnement Créer un fichier
.envà la racine avec les variables nécessaires :FLASK_APP=main.py FLASK_ENV=development SECRET_KEY=votre_cle_secrete DATABASE_URL=sqlite:///app.db ODOO_URL=votre_url_odoo ODOO_USERNAME=votre_utilisateur ODOO_PASSWORD=votre_mot_de_passe
à compléter ...
- Description : Récupère la liste des commandes fournisseurs en attente avec leurs produits
- Méthode : GET
- Authentification : Requise
- Réponse :
[ { "po": "PO13311", "provider": "Brasserie du Sabot BSA", "date": "2025-10-09T14:09:52", "products": [ { "barcode": "0420000019879", "name": "Brasserie du Sabot Ambrée Emma Goldman 33cl BSA", "brand": "Brasserie du Sabot", "image": "data:image/png;base64,iVBORw0KGgoAA...", "parcels": 2, "packSize": 24 } ] } ]
- Description : Traite la réception d'une commande fournisseur
- Méthode : POST
- Authentification : Requise
- Paramètres de chemin :
po_reference(requis) : Référence de la commande fournisseur (ex: "PO13311")
- Corps de la requête :
{ "products": [ { "barcode": "1234567890123", "ok": false, "received": 234, "comment": "Commentaire optionnel" }, { "barcode": "234567891234", "ok": true } ] } - Réponses possibles :
- Succès (200) :
{ "success": true, "message": "Commande PO13311 traitée avec succès" } - Erreur (400) : Données invalides
- Erreur (404) : Commande non trouvée
- Erreur (500) : Erreur serveur
- Succès (200) :
- Description : Traite une zone d'inventaire
- Méthode : POST
- Authentification : Requise
- Paramètres de chemin :
zone_id(requis) : Identifiant de la zone à traiter (entier)
- Réponses possibles :
- Succès (200) : Traitement réussi
- Erreur (400) : Requête mal formatée
- Erreur (401) : Non autorisé
- Erreur (500) : Erreur serveur
- Description : Récupère les informations de l'utilisateur connecté
- Méthode : GET
- Authentification : Requise (JWT dans le header Authorization)
- Réponse :
{ "user": { "sub": "user_id", "email": "user@example.com", "name": "Nom Utilisateur", "preferred_username": "username" }, "is_authenticated": true }
- Description : Vérifie l'accessibilité du serveur d'authentification
- Méthode : GET
- Authentification : Non requise
- Réponses possibles :
- Succès (200) :
{ "status": "ok", "auth_server": "reachable" } - Erreur (503) :
{ "status": "error", "error": "auth_server_unreachable", "message": "[détail de l'erreur]" }
- Succès (200) :
- Description : Récupère les informations d'un produit avec son image
- Méthode : GET
- Authentification : Requise
- Paramètres :
barcode(requis) : Code-barres du produit
- Réponse :
{ "barcode": "1234567890123", "name": "Nom du produit", "brand": "Marque", "brand_id": 1, "image": "data:image/png;base64,iVBORw0KGgoAA..." }
- Description : Liste des commandes fournisseurs en attente
- Méthode : GET
- Authentification : Requise
- Réponse :
{ "orders": [ { "id": 1, "reference": "PO001", "supplier": "Fournisseur", "date_planned": "2023-01-01", "state": "purchase" } ] }
Pour exécuter les tests :
pytest tests/ -v