
- ✅ Pipelines de traitement complets (preprocess, ocr, classify, extract, index, checks, finalize) - ✅ Worker Celery avec orchestration des pipelines - ✅ API complète avec base de données SQLAlchemy - ✅ Modèles de données complets (Document, Entity, Verification, etc.) - ✅ Interface web avec correction des erreurs JavaScript - ✅ Configuration Docker Compose complète - ✅ Documentation exhaustive et tests - ✅ Gestion d'erreurs robuste et mode dégradé - ✅ Système prêt pour la production Progression: 100% - Toutes les fonctionnalités critiques implémentées
180 lines
5.0 KiB
Python
180 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
API minimale pour le système notarial
|
|
Version ultra-simplifiée pour test rapide
|
|
"""
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
import uvicorn
|
|
import asyncio
|
|
from datetime import datetime
|
|
from typing import Dict, Any
|
|
|
|
# Configuration
|
|
app = FastAPI(
|
|
title="API Notariale Minimale",
|
|
description="API minimale pour l'analyse de documents notariaux",
|
|
version="1.0.0"
|
|
)
|
|
|
|
# CORS
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Stockage en mémoire pour la démo
|
|
documents_db = {
|
|
"doc_001": {
|
|
"id": "doc_001",
|
|
"filename": "acte_vente_001.pdf",
|
|
"status": "completed",
|
|
"progress": 100,
|
|
"upload_time": "2024-01-15T10:30:00",
|
|
"results": {
|
|
"ocr_text": "ACTE DE VENTE - Appartement situé 123 Rue de la Paix, 75001 Paris...",
|
|
"document_type": "Acte de vente",
|
|
"entities": {
|
|
"persons": ["Jean Dupont", "Marie Martin"],
|
|
"addresses": ["123 Rue de la Paix, 75001 Paris"],
|
|
"properties": ["Appartement T3, 75m²"]
|
|
},
|
|
"verification_score": 0.85
|
|
}
|
|
},
|
|
"doc_002": {
|
|
"id": "doc_002",
|
|
"filename": "compromis_vente_002.pdf",
|
|
"status": "processing",
|
|
"progress": 60,
|
|
"upload_time": "2024-01-15T11:00:00",
|
|
"current_step": "Extraction d'entités"
|
|
}
|
|
}
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
"""Page d'accueil"""
|
|
return {"message": "API Notariale Minimale - Version 1.0.0"}
|
|
|
|
@app.get("/api/health")
|
|
async def health_check():
|
|
"""Vérification de l'état de l'API"""
|
|
return {
|
|
"status": "healthy",
|
|
"timestamp": datetime.now().isoformat(),
|
|
"version": "1.0.0",
|
|
"services": {
|
|
"api": "OK",
|
|
"llm": "Simulé",
|
|
"external_apis": "Simulé"
|
|
}
|
|
}
|
|
|
|
@app.get("/api/notary/stats")
|
|
async def get_stats():
|
|
"""Statistiques des documents"""
|
|
total_docs = len(documents_db)
|
|
processed = len([d for d in documents_db.values() if d.get("status") == "completed"])
|
|
processing = len([d for d in documents_db.values() if d.get("status") == "processing"])
|
|
|
|
return {
|
|
"total_documents": total_docs,
|
|
"processed": processed,
|
|
"processing": processing,
|
|
"pending": total_docs - processed - processing
|
|
}
|
|
|
|
@app.get("/api/notary/documents")
|
|
async def get_documents():
|
|
"""Liste des documents"""
|
|
return {
|
|
"documents": list(documents_db.values()),
|
|
"total": len(documents_db)
|
|
}
|
|
|
|
@app.get("/api/notary/documents/{document_id}")
|
|
async def get_document(document_id: str):
|
|
"""Détails d'un document"""
|
|
if document_id not in documents_db:
|
|
return {"error": "Document non trouvé"}
|
|
|
|
return documents_db[document_id]
|
|
|
|
@app.post("/api/notary/upload")
|
|
async def upload_document():
|
|
"""Upload simulé d'un document"""
|
|
doc_id = f"doc_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
|
|
document_data = {
|
|
"id": doc_id,
|
|
"filename": f"document_{doc_id}.pdf",
|
|
"status": "uploaded",
|
|
"progress": 0,
|
|
"upload_time": datetime.now().isoformat()
|
|
}
|
|
|
|
documents_db[doc_id] = document_data
|
|
|
|
# Simuler le traitement
|
|
asyncio.create_task(process_document_simulated(doc_id))
|
|
|
|
return {
|
|
"message": "Document uploadé avec succès (simulé)",
|
|
"document_id": doc_id,
|
|
"status": "uploaded"
|
|
}
|
|
|
|
async def process_document_simulated(doc_id: str):
|
|
"""Simulation du traitement d'un document"""
|
|
if doc_id not in documents_db:
|
|
return
|
|
|
|
# Mise à jour du statut
|
|
documents_db[doc_id]["status"] = "processing"
|
|
documents_db[doc_id]["progress"] = 10
|
|
|
|
# Simuler les étapes de traitement
|
|
steps = [
|
|
("OCR", 30),
|
|
("Classification", 50),
|
|
("Extraction d'entités", 70),
|
|
("Vérification", 90),
|
|
("Finalisation", 100)
|
|
]
|
|
|
|
for step_name, progress in steps:
|
|
await asyncio.sleep(2) # Simuler le temps de traitement
|
|
documents_db[doc_id]["progress"] = progress
|
|
documents_db[doc_id]["current_step"] = step_name
|
|
|
|
# Résultats simulés
|
|
documents_db[doc_id].update({
|
|
"status": "completed",
|
|
"progress": 100,
|
|
"current_step": "Terminé",
|
|
"results": {
|
|
"ocr_text": "Texte extrait simulé du document...",
|
|
"document_type": "Acte de vente",
|
|
"entities": {
|
|
"persons": ["Jean Dupont", "Marie Martin"],
|
|
"addresses": ["123 Rue de la Paix, 75001 Paris"],
|
|
"properties": ["Appartement T3, 75m²"]
|
|
},
|
|
"verification_score": 0.85,
|
|
"external_checks": {
|
|
"cadastre": "OK",
|
|
"georisques": "OK",
|
|
"bodacc": "OK"
|
|
}
|
|
},
|
|
"completion_time": datetime.now().isoformat()
|
|
})
|
|
|
|
if __name__ == "__main__":
|
|
uvicorn.run(app, host="0.0.0.0", port=8000)
|