
- Infrastructure complète de traitement de documents notariaux - API FastAPI d'ingestion et d'orchestration - Pipelines Celery pour le traitement asynchrone - Support des formats PDF, JPEG, PNG, TIFF, HEIC - OCR avec Tesseract et correction lexicale - Classification automatique des documents avec Ollama - Extraction de données structurées - Indexation dans AnythingLLM et OpenSearch - Système de vérifications et contrôles métier - Base de données PostgreSQL pour le métier - Stockage objet avec MinIO - Base de données graphe Neo4j - Recherche plein-texte avec OpenSearch - Supervision avec Prometheus et Grafana - Scripts d'installation pour Debian - Documentation complète - Tests unitaires et de performance - Service systemd pour le déploiement - Scripts de déploiement automatisés
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""
|
|
Modèles de données pour l'API
|
|
"""
|
|
from pydantic import BaseModel, Field
|
|
from typing import Optional, Dict, Any, List
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
class DocumentStatus(str, Enum):
|
|
"""Statuts possibles d'un document"""
|
|
PENDING = "pending"
|
|
PROCESSING = "processing"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
MANUAL_REVIEW = "manual_review"
|
|
|
|
class DocumentType(str, Enum):
|
|
"""Types de documents supportés"""
|
|
PDF = "application/pdf"
|
|
JPEG = "image/jpeg"
|
|
PNG = "image/png"
|
|
TIFF = "image/tiff"
|
|
HEIC = "image/heic"
|
|
|
|
class ImportMeta(BaseModel):
|
|
"""Métadonnées d'import d'un document"""
|
|
id_dossier: str = Field(..., description="Identifiant du dossier")
|
|
source: str = Field(default="upload", description="Source du document")
|
|
etude_id: str = Field(..., description="Identifiant de l'étude")
|
|
utilisateur_id: str = Field(..., description="Identifiant de l'utilisateur")
|
|
filename: Optional[str] = Field(None, description="Nom du fichier")
|
|
mime: Optional[str] = Field(None, description="Type MIME du fichier")
|
|
received_at: Optional[int] = Field(None, description="Timestamp de réception")
|
|
|
|
class DocumentResponse(BaseModel):
|
|
"""Réponse d'import de document"""
|
|
status: str = Field(..., description="Statut de la requête")
|
|
id_document: str = Field(..., description="Identifiant du document")
|
|
message: Optional[str] = Field(None, description="Message informatif")
|
|
|
|
class DocumentInfo(BaseModel):
|
|
"""Informations détaillées d'un document"""
|
|
id: str
|
|
filename: str
|
|
mime_type: str
|
|
size: int
|
|
status: DocumentStatus
|
|
id_dossier: str
|
|
etude_id: str
|
|
utilisateur_id: str
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
processing_steps: Optional[Dict[str, Any]] = None
|
|
extracted_data: Optional[Dict[str, Any]] = None
|
|
errors: Optional[List[str]] = None
|
|
|
|
class ProcessingStep(BaseModel):
|
|
"""Étape de traitement"""
|
|
name: str
|
|
status: str
|
|
started_at: Optional[datetime] = None
|
|
completed_at: Optional[datetime] = None
|
|
duration: Optional[float] = None
|
|
error: Optional[str] = None
|
|
metadata: Optional[Dict[str, Any]] = None
|
|
|
|
class HealthResponse(BaseModel):
|
|
"""Réponse de santé de l'API"""
|
|
status: str
|
|
timestamp: datetime
|
|
version: str
|
|
services: Dict[str, str]
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""Réponse d'erreur standardisée"""
|
|
detail: str
|
|
error_code: Optional[str] = None
|
|
timestamp: datetime = Field(default_factory=datetime.now)
|