새 템플릿을 숙박에만 등록해서 음식점 사장님 화면에는 4종만 보였다. - templates.json: cafe · restaurant · clinic 에 라운드~솔숲 8종 추가 - kit/unitWord.ts: Room / Menu / Program — 코랄·미니멀·시네마·부티크·빅타이포의 영문 라벨 - 각 Rooms.tsx: 객실별 '예약 요청' 버튼은 숙박일 때만(예약 시트가 숙박에만 있어 누르면 무반응) - 이용안내 머리말 · 미니 블로그 설명을 업종 중립 문구로, 부티크 탭 'Stay' → 비숙박은 'Guide' - docs/TEMPLATES.md: 업종별 사용 범위 eslint·tsc 통과, vitest 123 passed, 숙박 9 + 카페·음식점·병원 각 8 = 33개 사이트 굽기 성공 · 숙박 전용 문구(객실·체크인·Room·예약 요청) 0건 · 간격 검사 0건 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""크롤링 · 사진 분석 · 빌드 진행 이벤트를 Teams 로 보낸다."""
|
|
from common.enums import LinkChannel, PlaceCategory
|
|
from services import alert_service
|
|
|
|
KIND = "activity"
|
|
|
|
_CHANNEL_NAMES = {
|
|
LinkChannel.YANOLJA.value: "야놀자",
|
|
LinkChannel.GOODCHOICE.value: "여기어때",
|
|
LinkChannel.NAVER_PLACE.value: "네이버 플레이스",
|
|
LinkChannel.INSTAGRAM.value: "인스타그램",
|
|
LinkChannel.OFFICIAL_SITE.value: "홈페이지",
|
|
LinkChannel.BLOG.value: "블로그",
|
|
LinkChannel.NAVER_BOOKING.value: "네이버 예약",
|
|
LinkChannel.ETC.value: "기타",
|
|
}
|
|
|
|
_CATEGORY_NAMES = {
|
|
PlaceCategory.LODGING.value: "숙박",
|
|
PlaceCategory.CAFE.value: "카페",
|
|
PlaceCategory.RESTAURANT.value: "음식점",
|
|
PlaceCategory.CLINIC.value: "피부과·성형외과",
|
|
}
|
|
|
|
|
|
def channel_name(code) -> str:
|
|
return _CHANNEL_NAMES.get(code, f"채널{code}")
|
|
|
|
|
|
def category_name(code) -> str:
|
|
return _CATEGORY_NAMES.get(code, f"업종{code}")
|
|
|
|
|
|
def place_label(place) -> str:
|
|
return f"{place.name}({category_name(place.category)})"
|
|
|
|
|
|
async def post(title: str, lines: list[str]) -> None:
|
|
await alert_service.send_alert(KIND, title, "\n\n".join(line for line in lines if line))
|