Files
admin-edu-space/app/schemas/optimizer_dto.py
T

50 lines
2.1 KiB
Python

from pydantic import BaseModel, Field, field_validator
from typing import List, Optional, Dict, Any
from datetime import datetime
class OptimizerJobRequestDTO(BaseModel):
"""Contrato de solicitud para iniciar una optimización heurística."""
commission_ids: List[int] = Field(..., min_length=1, description="Lista de IDs de comisiones a programar")
start_date: Optional[datetime] = Field(None, description="Fecha de inicio (ISO format)")
end_date: Optional[datetime] = Field(None, description="Fecha de fin (ISO format)")
generations: int = Field(default=80, ge=10, le=500, description="Cantidad de generaciones genéticas")
population_size: int = Field(default=40, ge=10, le=200, description="Tamaño de la población de cromosomas")
workers: int = Field(default=4, ge=1, le=16, description="Cantidad de hilos o workers concurrentes")
@field_validator('commission_ids')
@classmethod
def validate_ids(cls, v):
if not v or len(v) == 0:
raise ValueError("Debe suministrar al menos una comisión para optimizar.")
return list(set(v))
class SpringBootCommissionDTO(BaseModel):
"""Contrato de comisión en formato Spring Boot."""
commissionId: int
subjectCode: str
subjectName: str
expectedAttendees: int = Field(default=30, ge=1)
preferredShift: Optional[str] = "NOCHE"
preferredStart: datetime
preferredEnd: datetime
class SpringBootClassroomDTO(BaseModel):
"""Contrato de aula en formato Spring Boot."""
classroomId: int
roomNumber: str
capacity: int = Field(default=30, ge=1)
building: Optional[str] = "Edificio Central"
isVirtual: bool = False
class SpringBootSyncPayloadDTO(BaseModel):
"""Carga útil de sincronización interoperable con microservicios Spring Boot."""
requestId: str = Field(..., description="Identificador único de la petición externa")
campusCode: Optional[str] = "CENTRAL"
academicTerm: Optional[str] = "2026-1C"
commissions: List[SpringBootCommissionDTO] = Field(..., min_length=1)
classrooms: Optional[List[SpringBootClassroomDTO]] = None
options: Optional[Dict[str, Any]] = None