o2o-site-AEO/solution/backend/services/activity_feed.py
Mina Choi 18a287451e [feat] solution/site,shared: 새 템플릿 8종을 카페·음식점·병원에도 연다 — 객실 문구를 업종별로
새 템플릿을 숙박에만 등록해서 음식점 사장님 화면에는 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>
2026-09-30 14:57:02 +09:00

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))