Files
office_translator/schemas/translation.py
2026-03-07 11:42:58 +01:00

236 lines
6.5 KiB
Python

"""
Pydantic models for translation endpoints
Story 3.6: Documentation OpenAPI (Swagger + ReDoc)
"""
from pydantic import BaseModel, Field
from typing import Optional, Literal, List, Dict, Any
from datetime import datetime
class TranslateResponseData(BaseModel):
"""Response data for translation request"""
id: str = Field(
...,
example="tr_abc123def456",
description="Identifiant unique du job de traduction"
)
status: Literal["processing"] = Field(
default="processing",
description="Statut du job (toujours 'processing' à la création)"
)
file_name: Optional[str] = Field(
None,
example="rapport_financier.xlsx",
description="Nom du fichier original"
)
source_lang: Optional[str] = Field(
None,
example="en",
description="Code langue source (ISO 639-1)"
)
target_lang: str = Field(
...,
example="fr",
description="Code langue cible (ISO 639-1)"
)
class Config:
json_schema_extra = {
"example": {
"id": "tr_abc123def456",
"status": "processing",
"file_name": "rapport_financier.xlsx",
"source_lang": "en",
"target_lang": "fr"
}
}
class TranslateResponseMeta(BaseModel):
"""Metadata for translation response"""
rate_limit_remaining: int = Field(
...,
description="Nombre de traductions restantes aujourd'hui",
example=4
)
estimated_time_seconds: Optional[int] = Field(
None,
description="Temps estimé pour la traduction en secondes",
example=15
)
class TranslateResponse(BaseModel):
"""Full response for translation request"""
data: TranslateResponseData
meta: TranslateResponseMeta
class Config:
json_schema_extra = {
"example": {
"data": {
"id": "tr_abc123def456",
"status": "processing",
"file_name": "rapport_financier.xlsx",
"source_lang": "en",
"target_lang": "fr"
},
"meta": {
"rate_limit_remaining": 4,
"estimated_time_seconds": 15
}
}
}
class TranslationStatusData(BaseModel):
"""Response data for translation status endpoint"""
id: str = Field(
...,
description="Identifiant unique du job de traduction",
example="tr_abc123def456"
)
status: Literal["queued", "processing", "completed", "failed"] = Field(
...,
description="Statut actuel du job"
)
progress_percent: int = Field(
default=0,
ge=0,
le=100,
description="Pourcentage de progression (0-100)",
example=65
)
current_step: str = Field(
default="Initializing",
description="Description de l'opération en cours",
example="Traduction de la diapositive 3/5"
)
file_name: Optional[str] = Field(
None,
description="Nom du fichier original",
example="presentation.pptx"
)
source_lang: Optional[str] = Field(
None,
description="Code langue source",
example="en"
)
target_lang: Optional[str] = Field(
None,
description="Code langue cible",
example="fr"
)
created_at: Optional[str] = Field(
None,
description="Date de création (ISO 8601)",
example="2024-01-15T10:30:00Z"
)
completed_at: Optional[str] = Field(
None,
description="Date de complétion (ISO 8601)",
example="2024-01-15T10:35:00Z"
)
failed_at: Optional[str] = Field(
None,
description="Date d'échec (ISO 8601)",
example=None
)
error_message: Optional[str] = Field(
None,
description="Message d'erreur si status='failed'",
example=None
)
class Config:
json_schema_extra = {
"example": {
"id": "tr_abc123def456",
"status": "processing",
"progress_percent": 65,
"current_step": "Traduction de la diapositive 3/5",
"file_name": "presentation.pptx",
"source_lang": "en",
"target_lang": "fr",
"created_at": "2024-01-15T10:30:00Z",
"completed_at": None,
"failed_at": None,
"error_message": None
}
}
class TranslationStatusMeta(BaseModel):
"""Metadata for translation status response"""
estimated_remaining_seconds: Optional[int] = Field(
default=None,
description="Temps restant estimé en secondes",
example=30
)
class TranslationStatusResponse(BaseModel):
"""Full response for translation status endpoint"""
data: TranslationStatusData
meta: Optional[TranslationStatusMeta] = None
class Config:
json_schema_extra = {
"example": {
"data": {
"id": "tr_abc123def456",
"status": "processing",
"progress_percent": 65,
"current_step": "Traduction de la diapositive 3/5",
"file_name": "presentation.pptx",
"source_lang": "en",
"target_lang": "fr",
"created_at": "2024-01-15T10:30:00Z"
},
"meta": {
"estimated_remaining_seconds": 30
}
}
}
class LanguageItem(BaseModel):
"""Single language entry"""
code: str = Field(
...,
description="Code langue ISO 639-1",
example="fr"
)
name: str = Field(
...,
description="Nom de la langue en français",
example="Français"
)
class LanguageResponse(BaseModel):
"""Response model for supported languages"""
supported_languages: Dict[str, str] = Field(
...,
description="Dictionnaire des langues supportées (code -> nom)",
example={
"fr": "French",
"de": "German",
"es": "Spanish",
"it": "Italian"
}
)
note: Optional[str] = Field(
None,
description="Note sur la disponibilité des langues",
example="Les langues supportées peuvent varier selon le service de traduction configuré"
)