- 계획노선 사용 범위: 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>
89 lines
3.8 KiB
Python
89 lines
3.8 KiB
Python
"""B01_Dashboard 요청 스키마."""
|
|
|
|
from datetime import date
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class UpdateUserRequest(BaseModel):
|
|
name: str = Field(min_length=1, max_length=100)
|
|
position: str | None = Field(default=None, max_length=100)
|
|
department: str | None = Field(default=None, max_length=100)
|
|
phone: str | None = Field(default=None, max_length=50)
|
|
|
|
|
|
class CreateCompanyRequest(BaseModel):
|
|
name: str = Field(min_length=1, max_length=255)
|
|
business_registration_number: str = Field(min_length=1, max_length=20)
|
|
business_address: str | None = Field(default=None, max_length=500)
|
|
business_owner: str | None = Field(default=None, max_length=100)
|
|
|
|
|
|
class JoinCompanyRequest(BaseModel):
|
|
company_id: int = Field(gt=0)
|
|
|
|
|
|
class AddMemberRequest(BaseModel):
|
|
email: str = Field(min_length=3, max_length=255)
|
|
# 계정이 아직 없는 사람도 담당자로 넣는다 (2026-09-02 사용자 확정) — 이름이 있으면
|
|
# 그 자리에서 계정을 만든다. 비어 있으면 기존 사용자를 회사에 붙이는 옛 동작이다.
|
|
name: str | None = Field(default=None, max_length=100)
|
|
position: str | None = Field(default=None, max_length=100)
|
|
department: str | None = Field(default=None, max_length=100)
|
|
|
|
|
|
class UpdateCompanyLogoRequest(BaseModel):
|
|
# 회사 대표 로고 (company_assets.id, kind=LOGO). None 이면 지정을 지운다.
|
|
logo_asset_id: int | None = Field(default=None, gt=0)
|
|
|
|
|
|
class ProcessJoinRequest(BaseModel):
|
|
action: str = Field(pattern="^(APPROVE|REJECT)$")
|
|
reason: str | None = Field(default=None, max_length=500)
|
|
|
|
|
|
class ChangeUserRoleRequest(BaseModel):
|
|
role: str = Field(pattern="^(SYSTEM_ADMIN|ADMIN|USER)$")
|
|
|
|
|
|
class AssignCompanyRequest(BaseModel):
|
|
company_id: int | None = Field(default=None, gt=0)
|
|
|
|
|
|
class UpdateProjectRequest(BaseModel):
|
|
name: str = Field(min_length=1, max_length=255)
|
|
region: str | None = Field(default=None, max_length=100)
|
|
road_type: str | None = Field(default=None, max_length=100)
|
|
project_year: int | None = Field(default=None, ge=1900, 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=5000)
|
|
status: str | None = Field(default=None, max_length=50)
|
|
# 도면 표제란·표지에 실리는 값 (2026-09-02). 프로그램이 지어낼 수 없어 사람이 넣는다.
|
|
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)
|
|
# 설계일자는 확정일 자동이 아니라 사용자 지정이다 (2026-09-02 사용자 확정).
|
|
design_date: date | None = None
|
|
# 담당자는 회사 구성원(users) 중에서, 로고·서명은 회사 공유 자산(company_assets) 중에서
|
|
# 고른다 — 같은 회사 것인지는 라우터가 확인한다.
|
|
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)
|
|
signature_asset_id: int | None = Field(default=None, gt=0)
|
|
|
|
|
|
class AdminUpdateUserRequest(UpdateUserRequest):
|
|
status: str | None = Field(
|
|
default=None, pattern="^(NO_COMPANY|PENDING|ACTIVE|INACTIVE|REJECTED)$"
|
|
)
|
|
|
|
|
|
class UpdateCompanyAssetRequest(BaseModel):
|
|
label: str = Field(min_length=1, max_length=100)
|
|
# 사용자 계정에 물릴 수도(개인 서명) 아닐 수도(회사 공용 직인) 있다.
|
|
user_id: int | None = Field(default=None, gt=0)
|