여러 줄 주석이 설명보다 경위(예전·실측·지적)를 적고 있어 읽는 사람이 결론을 찾기 어려웠다. - ts·tsx·js·mjs·css·py 478개: 여러 줄 주석은 첫 문장 한 줄로, 과거형·날짜 문장은 삭제 - 주석 위치는 TypeScript 파서·파이썬 tokenize/ast 로 찾는다 — 문자열 안의 # · /* 는 건드리지 않는다 - eslint·ts·noqa·type: ignore 같은 지시 주석은 그대로 둔다 파이썬 275개 정리 전후 AST 동일, TS 298개 주석 뺀 토큰 동일(빈 JSX 주석 10곳만 차이). site·frontend·admin tsc, site vitest 105 passed Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
46 lines
2.0 KiB
Python
46 lines
2.0 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from decimal import Decimal
|
|
from typing import Optional
|
|
|
|
from pydantic import ConfigDict
|
|
|
|
from common.enums import MediaStatus, SourceType
|
|
from common.models.gmodel import Res_WebPacketProtocol, WebPacketProtocol
|
|
|
|
|
|
# 라우터 폴더마다 protocol.py 를 두고 Req_/Res_ 를 정의한다 (protocol 규약).
|
|
class MediaProtocol(WebPacketProtocol):
|
|
pass
|
|
|
|
|
|
class MediaData(WebPacketProtocol):
|
|
"""사진 1건."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
media_id: uuid.UUID
|
|
place_id: uuid.UUID
|
|
unit_id: Optional[uuid.UUID] = None # 객실·메뉴 사진이면 연결
|
|
url: str # 우리가 보관하는 접근 URL
|
|
origin_url: Optional[str] = None # 수집 원본 이미지 URL — 권리 판단의 근거
|
|
source_type: SourceType # OWNER 업로드 / CRAWL 수집 — 발행 필터 키
|
|
source_url: Optional[str] = None # 수집한 페이지 URL
|
|
label: Optional[str] = None # Vision 분류 라벨 (예: "A동 침실")
|
|
alt_text: Optional[str] = None # Vision 생성 alt
|
|
vision_confidence: Optional[Decimal] = None # 0.000~1.000
|
|
status: MediaStatus # PENDING_REVIEW 는 사람 확인 큐에 남아 있다는 뜻
|
|
width: Optional[int] = None
|
|
height: Optional[int] = None
|
|
sort_order: int = 0
|
|
created_at: Optional[datetime] = None
|
|
# DB 컬럼이 아니라 계산값이다 — '지금 발행하면 이 사진이 사이트에 실리는가'.
|
|
publishable: bool = False
|
|
|
|
|
|
class Res_MediaList(Res_WebPacketProtocol):
|
|
media: list[MediaData] = []
|
|
publishable: int = 0 # 실제로 사이트에 나갈 수 있는 사진 수(승인 + alt 있음)
|
|
pending_review: int = 0 # 사람 확인 큐에 남은 사진 수(관리 화면 배지)
|
|
crawled: int = 0 # 재게시 권리 미결(1-2) — 결론이 '불가'면 통째로 빠질 사진 수
|