o2o-site-AEO/solution/backend/router/v1/media/protocol.py
Mina Choi 11d30bb3d1 [chore] solution,admin,ontology: 코드 주석을 한 줄로 — 히스토리 주석 삭제
여러 줄 주석이 설명보다 경위(예전·실측·지적)를 적고 있어 읽는 사람이 결론을 찾기 어려웠다.

- 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>
2026-09-28 16:05:19 +09:00

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) — 결론이 '불가'면 통째로 빠질 사진 수