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
« prev ^ index » next coverage.py v7.16.2, created at 2026-11-13 19:28 +0000
1"""Shared department and directory models."""
3from typing import Optional
5from pydantic import BaseModel, BeforeValidator, Field
6from pydantic.networks import HttpUrl
7from typing_extensions import Annotated
9from data_api.utils.schema import url_corrector
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="電子郵件")
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
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)
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)