236 lines
6.5 KiB
Python
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é"
|
|
) |