- 계획노선 사용 범위: B02 등록에 시작·종료 누가거리 두 칸 추가, B01 수정 모달에서도 변경. projects.route_start_m·route_end_m 신설(015_route_range.sql). load_design_route 가 범위 절단 → 서피스 트림 순서로 적용. 시작 >= 종료는 화면·서버 양쪽에서 차단. 비우면 전 구간으로 종전과 같음. - 서피스 절단 여유 기본값 30m → 3m (SURFACE_ROUTE_EDGE_TRIM_M). - B04 지도·B05 배수유역도 줌 상한을 「화면 폭 20m」 기준으로 계산(고정 8배·16배 폐지). 4배를 넘으면 배경 그림 흐림 보간 해제. - 계획선 위 측점 눈금·번호 표기(측점번호+잔여거리). 관 마커와 겹치면 반대쪽으로 밀고, 되꺾임 구간에서 라벨이 겹치면 건너뜀. 그리기 코드는 두 화면 공용. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
"""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
|