root 5d8ad901d1 Initial commit: Pipeline notarial complet
- 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
2025-09-08 22:05:22 +02:00

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