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