P5 — Mode consultation ciblée (Option B, implémentation complète)

Backend :
- Nouvelle table `consultations` (slug unique, fenêtre temporelle, webhook, logo)
- `ideas.consultation_id` FK nullable (NULL = contexte global home)
- `synthesis.consultation_id` FK nullable (synthèse par contexte)
- Boucle auto-fermeture (thread daemon, 60 s) — ferme + webhook à l'échéance
- Webhook de clôture : POST JSON (synthèse + métadonnées) via urllib.request
- Routes publiques : GET/POST /api/consultations/<slug>, synthèse, contributions, export/print
- Routes admin : list, create, close (+ webhook), delete (cascade explicite)
- CSP ajustée sur /export/print pour autoriser window.print()

Frontend :
- Nouvelle page /consultation/:slug — formulaire, synthèse live, contributions paginées, PDF
- Admin panel : onglet Consultations — liste, formulaire création, fermeture, suppression

Docs : DAT.md v1.5, DEX.md v1.7 (section P5, tables, routes, webhook)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 10:00:39 +02:00
parent bc6bd3f9d7
commit fbc1fad8b9
7 changed files with 1991 additions and 384 deletions
+57 -4
View File
@@ -1,7 +1,7 @@
# Document d'Exploitation — La Voix du Peuple
**Version** : 1.4
**Date** : Avril 2026
**Version** : 1.7
**Date** : Mai 2026
---
@@ -16,6 +16,7 @@
| 1.4 | Avril 2026 | Synchronisation Gitea sécurisée — `GITEA_TOKEN` + `scripts/push-gitea.sh` |
| 1.5 | Avril 2026 | Droit pénal français intégré dans le filtre IA (16 sections) |
| 1.6 | Avril 2026 | Panel admin sécurisé (`/admin`), signalement public, export CSV |
| 1.7 | Mai 2026 | P5 — Mode consultation ciblée (table `consultations`, webhook, auto-fermeture, panel admin) |
---
@@ -405,14 +406,66 @@ Sur la page d'accueil, chaque contribution affiche un bouton **Signaler** au sur
| `POST` | `/api/admin/ideas/<id>/unflag` | Retirer le signalement |
| `POST` | `/api/admin/synthesis/regenerate` | Forcer la régénération |
| `GET` | `/api/admin/export/csv` | Export CSV (toutes les contributions) |
| `GET` | `/api/admin/consultations` | Liste toutes les consultations avec stats |
| `POST` | `/api/admin/consultations` | Crée une consultation (`{slug, title, subject, ...}`) |
| `POST` | `/api/admin/consultations/<slug>/close` | Ferme manuellement + déclenche webhook |
| `DELETE` | `/api/admin/consultations/<slug>` | Supprime une consultation et ses données |
---
## 17. Contacts et ressources
## 17. Mode consultation ciblée
### Créer une consultation (panel admin)
1. Ouvrir `/admin` → onglet **Consultations****Nouvelle consultation**
2. Remplir : slug (URL-safe, ex. `budget-mairie-2026`), titre, sujet
3. Optionnel : message d'introduction, organisateur, logo HTTPS, dates, webhook
4. Les dates sont interprétées comme UTC
5. La consultation est immédiatement accessible sur `/consultation/<slug>`
### Fermeture automatique
La fermeture automatique est gérée par un thread arrière-plan (toutes les 60 secondes).
Si `ends_at` est défini et dépassé, la consultation est fermée automatiquement et le webhook déclenché.
```bash
# Vérifier les consultations actives
psql "$DATABASE_URL" -c "SELECT slug, title, starts_at, ends_at, closed_at FROM consultations;"
```
### Webhook de clôture
Si `webhook_url` est configuré, un POST JSON est envoyé à la clôture :
```json
{
"event": "consultation_closed",
"consultation": {
"slug": "budget-mairie-2026",
"title": "Budget participatif 2026",
"closedAt": "2026-06-30T18:00:00+00:00"
},
"synthesis": {
"text": "...",
"ideaCount": 42
}
}
```
### Export PDF d'une consultation
```
GET /api/consultations/<slug>/export/print
```
Retourne une page HTML auto-imprimante. Accessible depuis le bouton **Exporter PDF** sur la page de consultation, ou directement en navigateur.
---
## 18. Contacts et ressources
- Documentation Mistral : https://docs.mistral.ai
- PostgreSQL : https://www.postgresql.org/docs/
- Flask : https://flask.palletsprojects.com
- qrcode.react : https://github.com/zpao/qrcode.react
- Architecture : `docs/DAT.md`
- Synchronisation Gitea : `docs/GITEA_TUTO.md`