Coverage for src/data_api/models/announcements.py: 100%
18 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-11-13 19:28 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-11-13 19:28 +0000
1"""
2Shared announcement models.
4Pydantic models for announcements request/response validation.
5"""
7from enum import Enum
8from typing import Annotated, Optional
10from pydantic import BaseModel, BeforeValidator, Field, HttpUrl
12from data_api.utils.schema import url_corrector
15class AnnouncementArticle(BaseModel):
16 """Individual announcement article."""
18 title: Optional[str] = Field(None, description="公告標題")
19 link: Optional[Annotated[HttpUrl, BeforeValidator(url_corrector)]] = Field(
20 None, description="公告連結"
21 )
22 date: Optional[str] = Field(None, description="公告日期 (YYYY-MM-DD)")
25class AnnouncementSource(BaseModel):
26 """Announcement source metadata without articles."""
28 title: str = Field(..., description="佈告欄標題")
29 link: Annotated[HttpUrl, BeforeValidator(url_corrector)] = Field(..., description="佈告欄連結")
30 language: str = Field(..., description="佈告欄語言")
31 department: str = Field(..., description="發布部門")
34class AnnouncementDetail(AnnouncementSource):
35 """Announcement detail with articles list."""
37 articles: list[AnnouncementArticle] = Field(..., description="公告列表")
40class AnnouncementLanguageOption(str, Enum):
41 ZH_TW = "zh-tw"
42 EN = "en"