Nicolas Cantu 7f96fd439d fix: Corrections finales pour le déploiement Docker
- Correction des imports dans domain/models.py (ajout des enums et modèles Pydantic)
- Correction des imports dans routes/ (documents, health, admin)
- Correction de la fonction init_db() dans app.py (suppression await)
- Correction de la configuration MinIO (suppression du protocole http://)
- Correction de la fonction get_detailed_verification_report (async)
- Correction des imports StorageManager dans tasks/notary_tasks.py
- Correction du Dockerfile worker (contexte de build et chemins)
- Suppression de la dépendance python-alto non trouvée

L'API est maintenant fonctionnelle et accessible sur http://localhost:8000
2025-09-10 17:56:10 +02:00

250 lines
7.9 KiB
Python

"""
Modèles de données pour le système notarial
"""
from sqlalchemy import Column, String, Integer, DateTime, Text, JSON, Boolean, Float, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
import uuid
from pydantic import BaseModel, Field
from enum import Enum
from typing import Dict, Any, List, Optional
Base = declarative_base()
class Document(Base):
"""Modèle pour les documents notariaux"""
__tablename__ = "documents"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
filename = Column(String(255), nullable=False)
original_filename = Column(String(255), nullable=False)
mime_type = Column(String(100), nullable=False)
size = Column(Integer, nullable=False)
# Métadonnées
id_dossier = Column(String(100), nullable=False)
etude_id = Column(String(100), nullable=False)
utilisateur_id = Column(String(100), nullable=False)
source = Column(String(50), default="upload")
# Statut et progression
status = Column(String(50), default="uploaded") # uploaded, processing, completed, error
progress = Column(Integer, default=0)
current_step = Column(String(100))
# Résultats du traitement
ocr_text = Column(Text)
document_type = Column(String(100))
confidence_score = Column(Float)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
processed_at = Column(DateTime)
# Relations
entities = relationship("Entity", back_populates="document")
verifications = relationship("Verification", back_populates="document")
processing_logs = relationship("ProcessingLog", back_populates="document")
class Entity(Base):
"""Modèle pour les entités extraites des documents"""
__tablename__ = "entities"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
document_id = Column(String, ForeignKey("documents.id"), nullable=False)
# Type d'entité
entity_type = Column(String(50), nullable=False) # person, address, property, company, etc.
entity_value = Column(Text, nullable=False)
# Position dans le document
page_number = Column(Integer)
bbox_x = Column(Float)
bbox_y = Column(Float)
bbox_width = Column(Float)
bbox_height = Column(Float)
# Métadonnées
confidence = Column(Float)
context = Column(Text)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
# Relations
document = relationship("Document", back_populates="entities")
class Verification(Base):
"""Modèle pour les vérifications effectuées"""
__tablename__ = "verifications"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
document_id = Column(String, ForeignKey("documents.id"), nullable=False)
# Type de vérification
verification_type = Column(String(100), nullable=False) # cadastre, georisques, bodacc, etc.
verification_status = Column(String(50), nullable=False) # pending, success, error, warning
# Résultats
result_data = Column(JSON)
error_message = Column(Text)
warning_message = Column(Text)
# Métadonnées
api_endpoint = Column(String(255))
response_time = Column(Float)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
completed_at = Column(DateTime)
# Relations
document = relationship("Document", back_populates="verifications")
class ProcessingLog(Base):
"""Modèle pour les logs de traitement"""
__tablename__ = "processing_logs"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
document_id = Column(String, ForeignKey("documents.id"), nullable=False)
# Informations du log
step_name = Column(String(100), nullable=False)
step_status = Column(String(50), nullable=False) # started, completed, error
message = Column(Text)
error_details = Column(Text)
# Métadonnées
processing_time = Column(Float)
input_hash = Column(String(64))
output_hash = Column(String(64))
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
# Relations
document = relationship("Document", back_populates="processing_logs")
class Study(Base):
"""Modèle pour les études notariales"""
__tablename__ = "studies"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
name = Column(String(255), nullable=False)
address = Column(Text)
phone = Column(String(50))
email = Column(String(255))
# Configuration
settings = Column(JSON)
api_keys = Column(JSON) # Clés API pour les vérifications externes
# Statut
is_active = Column(Boolean, default=True)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class User(Base):
"""Modèle pour les utilisateurs"""
__tablename__ = "users"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
username = Column(String(100), unique=True, nullable=False)
email = Column(String(255), unique=True, nullable=False)
full_name = Column(String(255))
# Authentification
hashed_password = Column(String(255))
is_active = Column(Boolean, default=True)
is_admin = Column(Boolean, default=False)
# Relations
study_id = Column(String, ForeignKey("studies.id"))
study = relationship("Study")
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
last_login = Column(DateTime)
class Dossier(Base):
"""Modèle pour les dossiers notariaux"""
__tablename__ = "dossiers"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
dossier_number = Column(String(100), unique=True, nullable=False)
title = Column(String(255))
description = Column(Text)
# Relations
study_id = Column(String, ForeignKey("studies.id"), nullable=False)
study = relationship("Study")
# Statut
status = Column(String(50), default="open") # open, closed, archived
# Métadonnées
client_name = Column(String(255))
client_email = Column(String(255))
client_phone = Column(String(50))
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
closed_at = Column(DateTime)
# Enums
class DocumentStatus(str, Enum):
UPLOADED = "uploaded"
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
MANUAL_REVIEW = "manual_review"
class DocumentType(str, Enum):
ACTE_VENTE = "acte_vente"
ACTE_DONATION = "acte_donation"
ACTE_SUCCESSION = "acte_succession"
CNI = "cni"
CONTRAT = "contrat"
AUTRE = "autre"
# Pydantic Models for API responses and requests
class DocumentResponse(BaseModel):
status: str
id_document: str
message: str
estimated_processing_time: Optional[int] = None
class DocumentInfo(BaseModel):
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: Dict[str, Any]
extracted_data: Dict[str, Any]
errors: List[str]
class ProcessingRequest(BaseModel):
id_dossier: str = Field(..., description="Identifiant du dossier")
etude_id: str = Field(..., description="Identifiant de l'étude")
utilisateur_id: str = Field(..., description="Identifiant de l'utilisateur")
source: str = Field(default="upload", description="Source du document")
type_document_attendu: Optional[DocumentType] = Field(None, description="Type de document attendu")
class HealthResponse(BaseModel):
status: str
timestamp: datetime
services: Dict[str, str]
version: str