사용자 확정(2026-09-02): 설계일자는 확정일 자동이 아니라 **사용자가 넣는다**. 도면번호는 Claude 판단으로 목록 순번을 쓴다. 설계일자 - `013_company_assets.sql` 로 `projects.design_date DATE` 추가(같은 마이그레이션에 로고·서명 공유 테이블 자리도 함께 만들었음 — 배선은 다음 커밋). - B01 프로젝트 수정 모달에 날짜 칸. 공용 `createInputField` 가 `type="date"` 를 받게 넓힘. - 표제란에는 도면 표기 관행대로 `2026. 09. 02.` 꼴로 적는다. 도면번호 - 단건 조회는 목록 순서를 모른다 — 알려면 횡단 장 계획을 다시 계산해야 하고 도면을 열 때마다 그러면 비싸다. **목록이 매긴 번호를 manifest 에 적어 두고** 단건 조회가 읽는다. 목록은 화면 진입 때 늘 먼저 뜨므로 성립하고, 목록이 바뀌면 다음 조회에서 다시 적힌다. - `add_title_fields()` 신설 — 도면을 읽는 도중에 아는 값을 문맥에 얹는 창구. 검증: `pytest tmp/tests/ -q` 139 passed / 0 failed, 루트 `tsc --noEmit` 통과. 실사용자 경로(5174, wdw) — 대시보드 [수정] 모달 라벨 10개(설계일자 칸 추가 확인) → `2026-09-02` 입력 → [확인] → 종단면도 표제란에 `2026. 09. 02.`. 도면번호는 목록 13건 기준 종단 1 · 유역도 6 · 용지도 13 이 도각에 그대로 실림 (표지는 도각을 두르지 않아 번호 칸이 없다). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
2.3 KiB
Python
63 lines
2.3 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)
|
|
|
|
|
|
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)
|
|
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
|
|
|
|
|
|
class AdminUpdateUserRequest(UpdateUserRequest):
|
|
status: str | None = Field(
|
|
default=None, pattern="^(NO_COMPANY|PENDING|ACTIVE|INACTIVE|REJECTED)$"
|
|
)
|