Coverage for src/data_api/models/departments.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-11-13 19:28 +0000

1"""Shared department and directory models.""" 

2 

3from typing import Optional 

4 

5from pydantic import BaseModel, BeforeValidator, Field 

6from pydantic.networks import HttpUrl 

7from typing_extensions import Annotated 

8 

9from data_api.utils.schema import url_corrector 

10 

11 

12class DepartmentPerson(BaseModel): 

13 name: str = Field(..., description="姓名") 

14 title: Optional[str] = Field(None, description="職稱") 

15 extension: Optional[str] = Field(None, description="分機") 

16 note: Optional[str] = Field(None, description="備註") 

17 email: Optional[str] = Field(None, description="電子郵件") 

18 

19 

20class DepartmentContact(BaseModel): 

21 extension: Optional[str] = None 

22 phone: Optional[str] = None 

23 fax: Optional[str] = None 

24 email: Optional[str] = None 

25 website: Optional[Annotated[HttpUrl, BeforeValidator(url_corrector)]] = None 

26 

27 

28class DepartmentDetails(BaseModel): 

29 departments: list[dict] = Field(default_factory=list) 

30 contact: DepartmentContact = Field(default_factory=DepartmentContact) 

31 people: list[DepartmentPerson] = Field(default_factory=list) 

32 

33 

34class Department(BaseModel): 

35 index: str = Field(..., description="系所代碼") 

36 name: str = Field(..., description="系所名稱") 

37 parent_name: Optional[str] = Field(None, description="上層系所名稱") 

38 url: Optional[Annotated[HttpUrl, BeforeValidator(url_corrector)]] = Field( 

39 None, description="系所網站" 

40 ) 

41 details: DepartmentDetails = Field(default_factory=DepartmentDetails)