Source code for pydotorg.domains.banners.schemas

"""Banners domain Pydantic schemas."""

from __future__ import annotations

import datetime
from enum import Enum
from typing import Annotated
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


[docs] class BannerTypeEnum(str, Enum): """Banner display type for styling.""" INFO = "info" SUCCESS = "success" WARNING = "warning" ERROR = "error"
[docs] class BannerBase(BaseModel): """Base Banner schema with common fields.""" name: Annotated[str, Field(min_length=1, max_length=255)] title: Annotated[str, Field(min_length=1, max_length=500)] message: str link: str | None = None link_text: str | None = None banner_type: BannerTypeEnum = BannerTypeEnum.INFO is_active: bool = False is_dismissible: bool = True is_sitewide: bool = True start_date: datetime.date | None = None end_date: datetime.date | None = None
[docs] class BannerCreate(BannerBase): """Schema for creating a new Banner."""
[docs] class BannerUpdate(BaseModel): """Schema for updating a Banner.""" name: Annotated[str, Field(min_length=1, max_length=255)] | None = None title: Annotated[str, Field(min_length=1, max_length=500)] | None = None message: str | None = None link: str | None = None link_text: str | None = None banner_type: BannerTypeEnum | None = None is_active: bool | None = None is_dismissible: bool | None = None is_sitewide: bool | None = None start_date: datetime.date | None = None end_date: datetime.date | None = None
[docs] class BannerRead(BannerBase): """Schema for reading Banner data.""" id: UUID created_at: datetime.datetime updated_at: datetime.datetime model_config = ConfigDict(from_attributes=True)
[docs] class BannerList(BaseModel): """Schema for Banner list items.""" id: UUID name: str title: str banner_type: BannerTypeEnum is_active: bool is_dismissible: bool is_sitewide: bool start_date: datetime.date | None end_date: datetime.date | None model_config = ConfigDict(from_attributes=True)
[docs] class BannerSitewideRead(BaseModel): """Schema for reading sitewide banner data (minimal for frontend).""" id: UUID title: str message: str link: str | None = None link_text: str | None = None banner_type: BannerTypeEnum is_dismissible: bool model_config = ConfigDict(from_attributes=True)