- 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
250 lines
7.9 KiB
Python
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 |