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

1""" 

2Shared announcement models. 

3 

4Pydantic models for announcements request/response validation. 

5""" 

6 

7from enum import Enum 

8from typing import Annotated, Optional 

9 

10from pydantic import BaseModel, BeforeValidator, Field, HttpUrl 

11 

12from data_api.utils.schema import url_corrector 

13 

14 

15class AnnouncementArticle(BaseModel): 

16 """Individual announcement article.""" 

17 

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)") 

23 

24 

25class AnnouncementSource(BaseModel): 

26 """Announcement source metadata without articles.""" 

27 

28 title: str = Field(..., description="佈告欄標題") 

29 link: Annotated[HttpUrl, BeforeValidator(url_corrector)] = Field(..., description="佈告欄連結") 

30 language: str = Field(..., description="佈告欄語言") 

31 department: str = Field(..., description="發布部門") 

32 

33 

34class AnnouncementDetail(AnnouncementSource): 

35 """Announcement detail with articles list.""" 

36 

37 articles: list[AnnouncementArticle] = Field(..., description="公告列表") 

38 

39 

40class AnnouncementLanguageOption(str, Enum): 

41 ZH_TW = "zh-tw" 

42 EN = "en"