Middleware Django pour synchroniser les mouvements de stocks entre OpenLMIS (source) et DHIS2 (destination).
Cette application agrège les mouvements de stocks réels (Stock Movements/Events) d'OpenLMIS pour calculer les consommations et réceptions mensuelles, puis pousse ces résultats vers DHIS2.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Docker Compose Stack β
βββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββββββ¬ββββββββββ€
β PostgreSQL β Redis β RabbitMQ β Django β Celery β
β (Base) β (Cache) β (Broker) β (API) β (Tasks) β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ΄ββββββββββ
β
βββββββββββββ΄ββββββββββββ
β β
βββββββΌββββββ βββββββΌββββββ
β OpenLMIS β β DHIS2 β
β API β β API β
βββββββββββββ βββββββββββββ
# Copier le fichier d'environnement
cp .env.example .env
# Γditer avec vos credentials
nano .env# Construire et dΓ©marrer tous les services
docker-compose up -d
# VΓ©rifier les logs
docker-compose logs -f# ExΓ©cuter les migrations
docker-compose exec django python manage.py migrate
# CrΓ©er un superuser
docker-compose exec django python manage.py createsuperuser
# Importer les fichiers CSV de configuration
docker-compose exec django python manage.py import_csv --allopenlmis_dhis2/
βββ config/ # Configuration Django/Celery
β βββ settings.py # Settings avec Loguru
β βββ celery.py # Configuration Celery Beat
β βββ urls.py
βββ sync/ # Application principale
β βββ models.py # ModΓ¨les Django (Servers, Mappings, Logs)
β βββ tasks.py # TΓ’ches Celery
β βββ views.py # API endpoints
β βββ services/
β β βββ openlmis_client.py # Client API OpenLMIS
β β βββ aggregator.py # Moteur d'agrΓ©gation Pandas
β β βββ dhis2_client.py # Client API DHIS2
β βββ management/commands/
β βββ import_csv.py # Import des CSV
βββ data/ # Fichiers CSV de configuration
β βββ dhis2.servers.csv
β βββ dhis2.shared_facilities.csv
β βββ dhis2.data_elements.csv
β βββ dhis2.datasets.csv
β βββ dhis2.schedules.csv
βββ docker-compose.yml
βββ Dockerfile
βββ requirements.txt
| Fichier | Description |
|---|---|
dhis2.servers.csv |
Credentials des serveurs DHIS2 |
dhis2.shared_facilities.csv |
Mapping Facility OpenLMIS β Org Unit DHIS2 |
dhis2.data_elements.csv |
Mapping Produit + Indicateur β DataElement |
dhis2.datasets.csv |
Configuration des DataSets DHIS2 |
dhis2.schedules.csv |
Planification des synchronisations |
- Authentification OAuth2
- RΓ©cupΓ©ration des stock cards avec pagination
- Filtrage par pΓ©riode (mois prΓ©cΓ©dent)
- AgrΓ©gation avec Pandas par produit et type de mouvement
- Calcul des indicateurs:
RECEIVED,ISSUED,ADJUSTMENT,OPENING_BALANCE,CLOSING_BALANCE - Mapping vers les DataElements DHIS2
- Construction du payload DataValueSet
- POST sur
/api/dataValueSets - Gestion des erreurs et conflits
| Endpoint | MΓ©thode | Description |
|---|---|---|
/api/status/ |
GET | Statut des dernières syncs |
/api/trigger/ |
POST | DΓ©clencher une sync manuelle |
/api/logs/ |
GET | Historique des syncs |
curl -X POST http://localhost:8000/api/trigger/ \
-H "Content-Type: application/json" \
-d '{"period": "202511"}'Les logs sont gΓ©rΓ©s par Loguru avec rotation automatique:
logs/
βββ app_2026-01-20.log # Logs gΓ©nΓ©raux
βββ errors_2026-01-20.log # Erreurs uniquement
βββ sync_2026-01-20.log # Logs de synchronisation
Exemples de logs:
INFO: Start Sync for Facility D001 (Month: Nov 2025)
DEBUG: Aggregated BCG - Received: 150, Issued: 40
ERROR: Mapping missing for Product 'Paracetamol' in data_elements.csv
# Voir les logs Celery
docker-compose logs -f celery_worker
# AccΓ©der au shell Django
docker-compose exec django python manage.py shell
# Relancer une sync Γ©chouΓ©e
docker-compose exec django python manage.py shell -c \
"from sync.tasks import retry_failed_syncs; retry_failed_syncs.delay('202511')"
# Monitoring Celery via Flower
# AccΓ©der Γ http://localhost:5555| Variable | Description | DΓ©faut |
|---|---|---|
OPENLMIS_BASE_URL |
URL de l'API OpenLMIS | - |
OPENLMIS_CLIENT_ID |
Client ID OAuth2 | - |
OPENLMIS_CLIENT_SECRET |
Client Secret OAuth2 | - |
OPENLMIS_USERNAME |
Utilisateur OpenLMIS | - |
OPENLMIS_PASSWORD |
Mot de passe OpenLMIS | - |
SYNC_DAY_OF_MONTH |
Jour de sync mensuelle | 5 |
SYNC_HOUR |
Heure de sync | 2 |
- RabbitMQ: http://localhost:15672 (rabbitmq/rabbitmq)
- Flower: http://localhost:5555
- Django Admin: http://localhost:8000/admin/
# Installer les dΓ©pendances localement
pip install -r requirements.txt
# Lancer les tests
python manage.py test
# VΓ©rifier le code
python manage.py checkMIT License