CCCPaste

empleado.py

import re

from pydantic import BaseModel, EmailStr, HttpUrl, field_validator


class Empleado(BaseModel):
    dni: str
    nombre: str
    correo: EmailStr
    carnet: str
    url_foto: HttpUrl

    @field_validator("dni")
    @classmethod
    def validar_dni(cls, valor: str) -> str:
        if not re.fullmatch(r"[A-Za-z0-9]+", valor):
            raise ValueError("El DNI solo puede contener letras y números")
        return valor

    @field_validator("nombre")
    @classmethod
    def validar_nombre(cls, valor: str) -> str:
        # Permite letras, espacios, tildes, ü/Ü y ñ/Ñ.
        if not re.fullmatch(
            r"[A-Za-zÁÉÍÓÚáéíóúÜüÑñ]+(?: [A-Za-zÁÉÍÓÚáéíóúÜüÑñ]+)*",
            valor,
        ):
            raise ValueError(
                "El nombre solo puede contener letras, espacios, tildes y eñes"
            )
        return valor

    @field_validator("carnet")
    @classmethod
    def validar_carnet(cls, valor: str) -> str:
        # Ejemplo válido: AB12345#-
        if not re.fullmatch(r"[A-Za-z]{2}\d{5}#-", valor):
            raise ValueError(
                "El carnet debe contener 2 letras, 5 dígitos y terminar en #-"
            )
        return valor

    @field_validator("url_foto")
    @classmethod
    def validar_url_foto(cls, valor: HttpUrl) -> HttpUrl:
        if valor.scheme != "https":
            raise ValueError("La URL de la foto debe utilizar HTTPS")
        return valor