vendredi, 24 avril, 2026
API rapports
Le module Rapports expose une API REST complète sous le préfixe /api/reports/ qui permet d'automatiser toutes les opérations réalisables depuis l'interface graphique : création et gestion de templates, génération de PDF, consultation de l'historique, personnalisation du branding, création de blocs Python personnalisés, configuration des règles de matrices. Cette page documente les vingt-trois endpoints disponibles et leurs schémas d'entrée et de sortie.
Vue d'ensemble des endpoints
Les endpoints sont regroupés en sept familles fonctionnelles. Chaque famille correspond à une zone de l'interface et peut être utilisée indépendamment.
| Famille | Nombre d'endpoints | Usage |
|---|---|---|
| Templates | 5 | Gérer les squelettes de rapports réutilisables |
| Génération | 2 | Produire un PDF final ou un aperçu |
| Consultation | 4 | Lister, récupérer, télécharger, supprimer des rapports |
| Sessions Nexus | 1 | Lister les sessions disponibles pour la génération |
| Branding | 3 | Personnaliser nom et logo de l'organisation |
| Blocs personnalisés | 5 | CRUD des blocs Python créés par l'utilisateur |
| Matrices | 3 | Configurer les règles de pertinence entre matrices |
Templates
Les cinq endpoints templates forment un CRUD complet. Les templates par défaut (embarqués) sont accessibles en lecture seule ; les modifications portent sur les templates créés par l'utilisateur.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/reports/templates | Liste tous les templates disponibles |
| POST | /api/reports/templates | Crée un template utilisateur (retourne 201) |
| GET | /api/reports/templates/{id} | Récupère un template par identifiant |
| PUT | /api/reports/templates/{id} | Met à jour un template utilisateur |
| DELETE | /api/reports/templates/{id} | Supprime un template utilisateur |
Schéma de création (TemplateCreate) : name, blocks (liste de clés), description, language (défaut 'fr'), mode ('concis' ou 'expert'). La mise à jour (TemplateUpdate) n'accepte que blocks, name et description.
Génération
Deux endpoints partagent la même logique interne. La seule différence est que /preview force le flag is_preview=True, ce qui produit un PDF temporaire non persisté destiné à être ouvert dans un nouvel onglet.
| Méthode | Chemin | Usage |
|---|---|---|
| POST | /api/reports/generate | PDF final persisté et ajouté à l'historique |
| POST | /api/reports/preview | PDF temporaire d'aperçu |
Schéma ReportGenerateRequest
Le schéma d'entrée de la génération est le plus riche de l'API. Il comprend seize champs optionnels qui couvrent à la fois la structure du rapport, les données à inclure et le contexte environnemental.
| Champ | Type | Description |
|---|---|---|
| template_id | int optionnel | Identifiant d'un template existant |
| blocks | liste de str optionnelle | Template ad hoc (si template_id absent) |
| title | str | Titre du rapport, défaut "Rapport IsoFind" |
| sample_ids | liste d'int optionnelle | Filtre les échantillons inclus |
| project | str optionnel | Nom du projet (usage simple) |
| project_data | dict optionnel | Objet projet complet (nom, objectif, contraintes), prioritaire sur project |
| nexus_session_id | int optionnel | Charge une session Nexus par son identifiant |
| nexus_result | dict optionnel | Résultat Nexus passé directement (alternative à nexus_session_id) |
| auto_context_result | dict optionnel | Résultat du contexte géochimique automatique |
| scoring_result | dict optionnel | Résultat de matching ou scoring |
| licence_data | dict optionnel | Informations de licence et branding associées |
| language | str | 'fr' ou 'en', défaut 'fr' |
| is_preview | bool | Mode aperçu (forcé à True par /preview) |
| mbtiles_path | str optionnel | Chemin vers une tuile de carte hors ligne |
| snapshots | dict optionnel | Captures de cartes et coupes verticales : {map: [...], section: [...]} |
| simulation_result | dict optionnel | Résultat de simulation CSIA ou redox, requis par les blocs sim_*, licence Pro |
| scenarios | liste de dict optionnelle | Scénarios sauvegardés pour scenario_comparison : {id, label, ts, meta} |
Au moins l'un des deux champs template_id ou blocks doit être présent, sinon la requête retourne un 422. Les autres champs sont tous optionnels et le moteur s'adapte à l'ensemble fourni.
Consultation et téléchargement
Les rapports générés sont persistés côté serveur avec un identifiant et un chemin de fichier PDF. L'API permet la liste, la récupération des métadonnées, le téléchargement du fichier et la suppression.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/reports/list | Liste tous les rapports générés |
| GET | /api/reports/{id} | Métadonnées d'un rapport (titre, date, blocs, chemin) |
| GET | /api/reports/download/{id} | Télécharge le PDF en application/pdf |
| DELETE | /api/reports/{id} | Supprime le rapport et son fichier |
La suppression retire à la fois l'enregistrement en base et le fichier PDF sur le disque. Elle est irréversible. Un PDF signé déjà transmis à un tiers reste valide et vérifiable de son côté, mais il ne sera plus téléchargeable depuis l'API.
Sessions Nexus
Un endpoint dédié liste les sessions Nexus disponibles pour alimenter le formulaire de création de rapport. Il lit directement la base SQLite des sessions et retourne les cinquante plus récentes.
| Méthode | Chemin | Réponse |
|---|---|---|
| GET | /api/reports/nexus-sessions | {success: true, sessions: [...], count: n} |
Chaque session retournée contient son identifiant, son nom, le sample_id et sample_name associés, l'élément traité et la date de création. Ces informations servent à proposer un menu déroulant à l'utilisateur dans l'interface.
Branding
Le branding regroupe le nom d'organisation et le chemin vers un logo local qui seront injectés dans l'en-tête et le pied de page des rapports. Il est stocké côté serveur et appliqué automatiquement à chaque génération.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/reports/branding | Retourne le branding configuré |
| PUT | /api/reports/branding | Met à jour nom et logo, licence Pro requise |
| DELETE | /api/reports/branding | Restaure le branding IsoFind par défaut |
La mise à jour valide que le chemin de logo fourni pointe vers un fichier existant et que son extension est reconnue (PNG, JPG, JPEG ou SVG). Un fichier manquant retourne un 400 avec le message explicite, un format non supporté également.
Blocs personnalisés
Les cinq endpoints blocs personnalisés forment un CRUD complet avec une spécificité importante : la validation syntaxique du code Python côté backend avant acceptation.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/reports/custom-blocks | Liste les blocs personnalisés actifs |
| GET | /api/reports/custom-blocks/{id} | Récupère un bloc par identifiant |
| POST | /api/reports/custom-blocks | Crée un bloc, compile le code Python en amont |
| PUT | /api/reports/custom-blocks/{id} | Met à jour, re-compile si le code est modifié |
| DELETE | /api/reports/custom-blocks/{id} | Supprime le bloc |
Le schéma CustomBlockCreate impose : key, name, code_python. Les autres champs ont des valeurs par défaut : description='', category='custom', nature='I', icon='CB', licence='pro', expert=False, language='fr', api_calls=None.
Le backend appelle compile(code_python, '<custom_block>', 'exec') sur le code fourni avant de l'enregistrer. Une SyntaxError remonte en HTTP 422 avec le message d'erreur détaillé. Cette validation précoce évite d'enregistrer un bloc syntaxiquement invalide qui échouerait à chaque génération.
Groupes et règles de matrices
Les matrices d'échantillonnage (eau, sol, sédiment, etc.) peuvent être regroupées par affinité, et des règles de pertinence peuvent être définies entre groupes. Cette configuration alimente les validations réalisées lors de la comparaison de matrices différentes dans un même rapport.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/reports/matrix-groups | Retourne groupes et règles configurés |
| PUT | /api/reports/matrix-groups | Sauvegarde l'ensemble des groupes et règles |
| GET | /api/reports/matrix-groups/check | Vérifie la pertinence entre matrix_a et matrix_b |
Un groupe de matrices comporte un identifiant, un nom, une couleur, une liste de matrices concrètes et une note optionnelle. Une règle lie deux groupes (from_group, to_group), porte un flag relevant (booléen) et une note. L'endpoint check retourne relevant (bool ou null) et defined (bool indiquant si la règle existe).
Codes d'erreur standards
Tous les endpoints suivent les mêmes conventions de codes d'erreur HTTP.
| Code | Signification | Cas d'occurrence |
|---|---|---|
| 200 | OK | Requête traitée avec succès |
| 201 | Created | Template créé (POST templates) |
| 400 | Bad Request | Fichier logo manquant ou format non supporté |
| 404 | Not Found | Template, rapport ou bloc introuvable |
| 422 | Unprocessable Entity | Paramètres manquants, erreur de syntaxe Python, clé invalide |
| 500 | Internal Server Error | Erreur inattendue lors de la génération |
| 503 | Service Unavailable | Module rapports non chargé au démarrage |
Exemple d'usage programmatique
L'exemple suivant illustre un parcours complet en Python avec la bibliothèque requests : sélection d'une session Nexus, génération du rapport, téléchargement du PDF.
import requests
base = 'http://localhost:8000'
# Selection d'une session Nexus
sessions = requests.get(f'{base}/api/reports/nexus-sessions').json()
session_id = sessions['sessions'][0]['id']
# Generation du rapport avec le preset expert
payload = {
'blocks': ['cover_page', 'executive_summary', 'sample_inventory',
'nexus_processes', 'nexus_chain', 'limitations',
'certification'],
'title': 'Audit automatise -- session Nexus',
'nexus_session_id': session_id,
'language': 'fr',
}
resp = requests.post(f'{base}/api/reports/generate', json=payload)
report = resp.json()
# Telechargement du PDF
pdf = requests.get(f'{base}/api/reports/download/{report["id"]}')
with open('rapport.pdf', 'wb') as f:
f.write(pdf.content)
Cette automatisation est la voie recommandée pour les intégrations d'IsoFind dans un pipeline plus large : surveillance continue, génération périodique de rapports de suivi, production en lot d'attestations pour un portefeuille de sites.
Authentification
L'API est protégée par le même système d'authentification que l'interface graphique. Un token est requis dans l'en-tête HTTP pour les endpoints qui modifient l'état ou accèdent à des données sensibles. Les endpoints en lecture seule sur les templates par défaut sont accessibles sans token.
Les détails d'obtention et d'usage du token sont décrits dans la documentation générale de l'API IsoFind. Pour les intégrations tierces, un token de service peut être généré côté administration et révoqué indépendamment du compte utilisateur.
Les endpoints de branding et de blocs personnalisés agissent au niveau du poste et sont plus sensibles que les endpoints de lecture de rapports. Un contrôle d'accès strict sur ces endpoints est recommandé dans les déploiements d'entreprise.
Pour aller plus loin
- Générer un rapport : parcours équivalent depuis l'interface.
- Blocs personnalisés : schéma complet et contraintes d'un bloc custom.
- API IsoFind : authentification et endpoints des autres modules.
- Intégration Python : usage du package isof côté client.