"""B02_ProjRegister 요청/응답 스키마.""" from datetime import date from pydantic import BaseModel, Field class CreateProjectRequest(BaseModel): """신규 프로젝트 생성 요청.""" name: str = Field(..., min_length=1, max_length=255) region: str = Field(..., min_length=1, max_length=100) # 화면 선택지와 같은 3종 — 간선·산불진화·작업임도 (지선임도 폐지, 계류보전은 사방사업). # 옛 값(branch·stream)을 받고 work 를 막고 있어 「작업임도」 등록이 422 로 떨어졌다. road_type: str = Field(..., pattern="^(main|fire|work)$") project_year: int = Field(..., ge=2000, le=2100) estimated_length_m: float | None = Field(default=None, ge=0) # 계획노선 자료가 공사지 전체일 수 있어 쓸 구간을 받는다 (2026-09-04 사용자 지시). # 둘 다 비우면 전 구간. 시작 >= 종료 는 라우터에서 막는다. route_start_m: float | None = Field(default=None, ge=0) route_end_m: float | None = Field(default=None, ge=0) memo: str | None = Field(default=None, max_length=1000) # 도면 표제란·표지 값 — 등록 때부터 받는다 (2026-09-02 사용자 지시). # 프로젝트 수정 모달(B01)과 같은 칸이며, 비워 두면 도면에 빈칸으로 나간다. client_org: str | None = Field(default=None, max_length=255) project_number: str | None = Field(default=None, max_length=100) work_amount: str | None = Field(default=None, max_length=100) design_date: date | None = None pm_user_id: int | None = Field(default=None, gt=0) field_lead_user_id: int | None = Field(default=None, gt=0) designer_user_id: int | None = Field(default=None, gt=0) logo_asset_id: int | None = Field(default=None, gt=0) class CreateProjectResponse(BaseModel): """신규 프로젝트 생성 응답.""" project_id: str name: str region: str | None road_type: str | None project_year: int | None estimated_length_m: float | None route_start_m: float | None = None route_end_m: float | None = None memo: str | None status: str storage_path: str created_at: str