feat(roadmap): implementar Sprints 1, 2 y 3 (MVC, Stateless JWT API y Spring Security)

This commit is contained in:
Carlos Tello
2026-09-05 01:46:57 -03:00
parent fa878cb0d5
commit 69b8b7ccef
34 changed files with 1750 additions and 21 deletions
+44
View File
@@ -0,0 +1,44 @@
from typing import Optional
from pydantic import BaseModel, Field, field_validator
class ClassroomBaseDTO(BaseModel):
code: str = Field(..., min_length=1, max_length=50, description="Código o nombre del aula (ej: Aula 101, VIRTUAL-A)")
floor: str = Field(default="PB", max_length=50, description="Piso o nivel (PB, Piso 1, etc.)")
capacity: int = Field(default=30, ge=1, le=10000, description="Capacidad máxima de estudiantes")
description: Optional[str] = Field(default=None, max_length=500, description="Detalles o equipamiento")
is_active: bool = Field(default=True, description="Estado operativo del aula")
@field_validator('code')
@classmethod
def clean_code(cls, v: str) -> str:
v = v.strip()
if not v:
raise ValueError("El código del aula no puede estar vacío.")
return v
@field_validator('floor')
@classmethod
def clean_floor(cls, v: str) -> str:
return str(v).strip() or "PB"
class ClassroomCreateDTO(ClassroomBaseDTO):
building_id: Optional[int] = Field(default=None, description="ID del edificio asignado")
building_name: Optional[str] = Field(default=None, description="Nombre de edificio (para creación dinámica)")
class ClassroomUpdateDTO(BaseModel):
building_id: Optional[int] = None
code: Optional[str] = None
floor: Optional[str] = None
capacity: Optional[int] = None
description: Optional[str] = None
is_active: Optional[bool] = None
class ClassroomResponseDTO(ClassroomBaseDTO):
id: int
building_id: Optional[int] = None
building_name: str
is_virtual: bool
location_display: str
class Config:
from_attributes = True