Files
Aislo/B01_Dashboard/B01_Dashboard_Schema.py
T
eomsangdonandClaude Opus 5 56aed2f2aa feat(B01,B07): 표지 연도·기번·사업량을 사람이 넣는 자리 신설
표제란에 남아 있던 빈칸 중 연도·기번과 사업량은 프로그램이 지어낼 수 없는 값이라
입력 자리를 만든다. 값의 출처를 정하지 않고 받을 칸만 세운다.

DB (`012_title_block_inputs.sql`, ADD COLUMN·NULL 허용)
- `projects.project_number` — 표지 연도·기번(실무문서 폴더명 관행:
  `2024년 간선임도(기번3-울진.대흥)`)
- `projects.work_amount` — 표지 사업량. 단위·표기가 사업 종류마다 달라 자유 문자열.

B01 프로젝트 수정
- 수정 모달에 시행청·연도기번·사업량 3칸 추가. 011 로 만든 시행청도 여기서 처음 입력
  가능해짐(그전에는 스크립트로만 넣었음).
- 목록·단건 조회 4곳과 UPDATE 에 세 칸을 함께 실음. USER 권한은 다른 칸과 같이 잠금.

B07
- `_title_block_fields` 가 연도기번·사업량도 실어 보냄. 비어 있으면 종전대로 빈칸.

검증: `pytest tmp/tests/ -q` 139 passed / 0 failed(표지 값 1건 신규), 루트 `tsc --noEmit`
통과. 실사용자 경로 실측(5174) — 대시보드 wdw 행 [수정] 클릭 → 모달 라벨 9개에 새 3칸
확인 → 연도기번·사업량 입력 → [확인] 저장 → 표지 도면 Text 7개 **빈칸 0 · `{{` 잔존 0**,
화면에도 연도기번·`wdw 설계도`·위치·사업량·시행청이 모두 그려짐.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 10:28:25 +09:00

59 lines
2.1 KiB
Python

"""B01_Dashboard 요청 스키마."""
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)
class AdminUpdateUserRequest(UpdateUserRequest):
status: str | None = Field(
default=None, pattern="^(NO_COMPANY|PENDING|ACTIVE|INACTIVE|REJECTED)$"
)