
- 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
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
"""
|
|
Configuration de la base de données
|
|
"""
|
|
from sqlalchemy import create_engine, Column, String, Integer, DateTime, Text, JSON, Boolean
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import sessionmaker, Session
|
|
from sqlalchemy.sql import func
|
|
import os
|
|
from typing import Generator
|
|
|
|
# URL de la base de données
|
|
DATABASE_URL = os.getenv("DATABASE_URL", "postgresql+psycopg://notariat:notariat_pwd@localhost:5432/notariat")
|
|
|
|
# Création du moteur SQLAlchemy
|
|
engine = create_engine(DATABASE_URL, echo=False)
|
|
|
|
# Session factory
|
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|
|
|
# Base pour les modèles
|
|
Base = declarative_base()
|
|
|
|
class Document(Base):
|
|
"""Modèle de document en base de données"""
|
|
__tablename__ = "documents"
|
|
|
|
id = Column(String, primary_key=True, index=True)
|
|
filename = Column(String, nullable=False)
|
|
mime_type = Column(String, nullable=False)
|
|
size = Column(Integer, nullable=False)
|
|
status = Column(String, default="pending")
|
|
id_dossier = Column(String, nullable=False, index=True)
|
|
etude_id = Column(String, nullable=False, index=True)
|
|
utilisateur_id = Column(String, nullable=False, index=True)
|
|
source = Column(String, default="upload")
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
processing_steps = Column(JSON, default={})
|
|
extracted_data = Column(JSON, default={})
|
|
errors = Column(JSON, default=[])
|
|
manual_review = Column(Boolean, default=False)
|
|
|
|
class ProcessingLog(Base):
|
|
"""Log des étapes de traitement"""
|
|
__tablename__ = "processing_logs"
|
|
|
|
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
|
|
document_id = Column(String, nullable=False, index=True)
|
|
step_name = Column(String, nullable=False)
|
|
status = Column(String, nullable=False)
|
|
started_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
completed_at = Column(DateTime(timezone=True))
|
|
duration = Column(Integer) # en millisecondes
|
|
error_message = Column(Text)
|
|
metadata = Column(JSON, default={})
|
|
|
|
def get_db() -> Generator[Session, None, None]:
|
|
"""Dépendance pour obtenir une session de base de données"""
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
async def init_db():
|
|
"""Initialisation de la base de données"""
|
|
try:
|
|
# Création des tables
|
|
Base.metadata.create_all(bind=engine)
|
|
print("Base de données initialisée avec succès")
|
|
except Exception as e:
|
|
print(f"Erreur lors de l'initialisation de la base de données: {e}")
|
|
raise
|