merge: feat/templates-all-industries(새 템플릿 전 업종) 을 main 에 병합
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
commit
8219d3f45e
@ -66,7 +66,12 @@ HTML 안에 있고 보이는 묶음만 바뀐다. 검색엔진은 네 묶음을
|
|||||||
거의 없는 집을 위한 것이라, 첫 화면과 객실 카드를 그림으로 채운다.
|
거의 없는 집을 위한 것이라, 첫 화면과 객실 카드를 그림으로 채운다.
|
||||||
|
|
||||||
업종마다 쓸 수 있는 템플릿과 기본 템플릿은 같은 파일의 `industries`에 적는다. 숙박은 레트로가
|
업종마다 쓸 수 있는 템플릿과 기본 템플릿은 같은 파일의 `industries`에 적는다. 숙박은 레트로가
|
||||||
기본이고, 병원은 심플과 매거진만 쓸 수 있다.
|
기본이다. 새 템플릿 8종(라운드 ~ 솔숲)은 네 업종 모두 쓸 수 있다. 병원은 그 밖에 심플과
|
||||||
|
매거진만 쓴다(고택·레트로는 숙박·음식점 느낌이 강해 뺐다).
|
||||||
|
|
||||||
|
★ 새 템플릿은 숙박 기준으로 만들었다. 숙박이 아니면 객실 자리가 메뉴·시술로 바뀌고
|
||||||
|
(`kit/unitWord.ts`, `UNIT_SPEC`), 객실별 '예약 요청' 버튼은 숨긴다 — 예약 시트가 숙박에만
|
||||||
|
있어서 누르면 아무 일도 안 일어났다.
|
||||||
|
|
||||||
### 뼈대(레이아웃)는 필요한 것만 바꾼다
|
### 뼈대(레이아웃)는 필요한 것만 바꾼다
|
||||||
|
|
||||||
|
|||||||
39
solution/backend/services/activity_feed.py
Normal file
39
solution/backend/services/activity_feed.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
"""크롤링 · 사진 분석 · 빌드 진행 이벤트를 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))
|
||||||
12
solution/site/src/layouts/kit/unitWord.ts
Normal file
12
solution/site/src/layouts/kit/unitWord.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import {PlaceCategory} from '@o2o/shared';
|
||||||
|
|
||||||
|
const WORD: Record<number, string> = {
|
||||||
|
[PlaceCategory.LODGING]: 'Room',
|
||||||
|
[PlaceCategory.CAFE]: 'Menu',
|
||||||
|
[PlaceCategory.RESTAURANT]: 'Menu',
|
||||||
|
[PlaceCategory.CLINIC]: 'Program',
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unitWord(category: number): string {
|
||||||
|
return WORD[category] ?? 'Menu';
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user