aliceblue11 commited on
Commit
a83c824
·
verified ·
1 Parent(s): 548af4f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +172 -67
app.py CHANGED
@@ -20,14 +20,16 @@ class EventManager:
20
  12: {"theme": "크리스마스/연말", "colors": ["#DC143C", "#228B22"], "mood": "축제같은, 따뜻한", "symbol": "🎄"}
21
  }
22
 
23
- # 상품 옵션
24
- self.reward_options = {
25
- "네이버페이": "네이버페이 금액권",
26
- "배달의민족": "배달의민족 상품권",
27
- "스타벅스": "스타벅스 기프트카드",
28
- "CGV": "CGV 영화관람권",
29
- "올리브영": "올리브영 상품권"
30
- }
 
 
31
 
32
  def calculate_event_duration(self, start_date, end_date):
33
  """이벤트 기간 계산"""
@@ -58,9 +60,15 @@ class EventManager:
58
  }
59
  return {}
60
 
 
 
 
 
 
 
 
61
  def generate_detailed_comment_event(self, start_date, end_date, concept, duration,
62
- reward_amount, reward_type, company_name,
63
- kakao_id, phone_number, custom_details=""):
64
  """참고자료 구조를 완전히 반영한 댓글 이벤트 템플릿"""
65
 
66
  if not concept:
@@ -79,27 +87,29 @@ class EventManager:
79
  formatted_start = f"{start_dt.year}년 {start_dt.month}월 {start_dt.day}일 {start_weekday} 00:00"
80
  formatted_end = f"{end_dt.year}년 {end_dt.month}월 {end_dt.day}일 {end_weekday} 23:59"
81
 
 
 
 
82
  # 메인 제목 생성
83
  if "로즈" in theme:
84
  main_title = f"댓글 남기면 1시간마다 선물이!\n{symbol}같은 {month}월 {theme} 이벤트"
85
  else:
86
  main_title = f"댓글 남기면 1시간마다 선물이!\n{symbol} {mood} {theme} 이벤트"
87
 
88
- template = f"""
89
- {main_title}
90
 
91
  {formatted_start} - {formatted_end} ({duration}일간)
92
 
93
  ========================
94
  EVENT
95
- <{company_name}>에 작성된 글에 유익하고 착한 댓글을 남기면
96
  1시간마다 1명씩! 하루 24명에게 선물을드려요!
97
 
98
  {formatted_start} - {formatted_end} ({duration}일간)
99
 
100
  =====================
101
  STEP 1
102
- {company_name} <커뮤니티>에 작성된 글에
103
  유익하고 착한 댓글 작성
104
  * 이쁘고 좋은 말 많이 해주는 회원님들이 되길 부탁드려요
105
 
@@ -115,9 +125,7 @@ STEP 3
115
 
116
  =================
117
  당첨혜택
118
- {reward_type} {reward_amount}원 이미지
119
- {reward_type} {reward_amount}원
120
- 1시간마다 1명씩 하루 24명
121
 
122
  ========================
123
  이벤트 대상
@@ -144,7 +152,7 @@ pc버전 당첨 예시 이미지, 모바일버전 당첨 예시 이미지
144
 
145
  =========================
146
  꼭 확인하세요!
147
- ※본이벤트는 {company_name} 일반 여성회원만 참여가능합니다. (비회원도 가능)
148
  ※ pc에서 캡처가 어려운 경우, 카메라로 촬영하여 연락 주셔도 됩니다.
149
  ※이벤트 팝업 상품 이미지와 상단 당첨 날짜&시간을 함께
150
  화면 캡처 또는 사진 촬영해야 수령 가능합니다.
@@ -228,9 +236,9 @@ ex) 주말 당첨시, 고객센터 영업일(월) 업무 종료시간 19:00시
228
  def create_interface():
229
  event_manager = EventManager()
230
 
231
- with gr.Blocks(title="이벤트 관리 시스템 v2.0") as demo:
232
- gr.Markdown("# 🎉 이벤트 관리 시스템 v2.0")
233
- gr.Markdown("**댓글 이벤트 상세 템플릿** - 참고자료 구조 완전 반영")
234
 
235
  with gr.Row():
236
  with gr.Column(scale=1):
@@ -249,14 +257,76 @@ def create_interface():
249
  value="2025-05-25"
250
  )
251
 
252
- gr.Markdown("## 🏢 회사 정보")
 
253
  with gr.Group():
254
- company_name = gr.Textbox(
255
- label="회사명",
256
- placeholder="회사명을 입력하세요",
257
- value="회사명"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  )
 
 
 
 
 
 
 
 
 
 
 
 
259
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  phone_number = gr.Textbox(
261
  label="고객센터 번호",
262
  placeholder="1544-1234",
@@ -265,31 +335,17 @@ def create_interface():
265
 
266
  kakao_id = gr.Textbox(
267
  label="카카오톡 ID",
268
- placeholder="kakao_id",
269
  value="company_kakao"
270
  )
271
 
272
- gr.Markdown("## 🎁 상품 설정")
273
- with gr.Group():
274
- reward_type = gr.Dropdown(
275
- choices=list(event_manager.reward_options.values()),
276
- label="상품 종류",
277
- value="네이버페이 금액권"
278
- )
279
-
280
- reward_amount = gr.Number(
281
- label="상품 금액 (원)",
282
- value=20000,
283
- step=1000
284
- )
285
-
286
  custom_details = gr.Textbox(
287
  label="추가 정보",
288
  placeholder="추가할 내용이 있다면 입력하세요",
289
  lines=2
290
  )
291
 
292
- generate_btn = gr.Button("✨ 상세 이벤트 생성하기", variant="primary", size="lg")
293
 
294
  with gr.Column(scale=2):
295
  gr.Markdown("## 📊 생성 결과")
@@ -312,14 +368,50 @@ def create_interface():
312
 
313
  with gr.Tab("📈 이벤트 정보"):
314
  event_info = gr.Textbox(
315
- label="이벤트 기본 정보",
316
  interactive=False,
317
  lines=8
318
  )
319
 
320
- def generate_complete_event(start_date_val, end_date_val, company_name_val,
321
- phone_number_val, kakao_id_val, reward_type_val,
322
- reward_amount_val, custom_details_val):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
 
324
  # 기간 계산
325
  duration, month, start_weekday, end_weekday, start_dt, end_dt = event_manager.calculate_event_duration(start_date_val, end_date_val)
@@ -330,11 +422,13 @@ def create_interface():
330
  # 월별 컨셉 생성
331
  concept = event_manager.generate_monthly_concept(month)
332
 
 
 
 
333
  # 상세 템플릿 생성
334
  template = event_manager.generate_detailed_comment_event(
335
  start_date_val, end_date_val, concept, duration,
336
- int(reward_amount_val), reward_type_val, company_name_val,
337
- kakao_id_val, phone_number_val, custom_details_val
338
  )
339
 
340
  # 디자인 가이드 생성
@@ -346,41 +440,52 @@ def create_interface():
346
  🗓️ 기간: {duration}일간 ({start_date_val} ~ {end_date_val})
347
  🎯 테마: {concept.get('theme', '')} {concept.get('symbol', '')}
348
  🎨 분위기: {concept.get('mood', '')}
349
- 🎁 상품: {reward_type_val} {int(reward_amount_val):,}원
350
- ⏰ 당첨: 1시간마다 1명 (하루 24명)
351
- 👥 대상: 일반 여성회원
352
- 🏢 주최: {company_name_val}
353
  📞 연락처: {phone_number_val}
354
  💬 카톡: {kakao_id_val}
355
 
356
- 💡 예상 총 당첨자: {duration * 24}명
357
- 💰 예상 총 비용: {duration * 24 * int(reward_amount_val):,}원"""
 
 
358
 
359
  return template, design, info
360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
361
  generate_btn.click(
362
  fn=generate_complete_event,
363
- inputs=[start_date, end_date, company_name, phone_number, kakao_id,
364
- reward_type, reward_amount, custom_details],
365
  outputs=[event_template, design_guide, event_info]
366
  )
367
 
368
  with gr.Row():
369
  gr.Markdown("""
370
- ## ✅ 완성된 기능
371
- - **참고자료 구조 100% 반영**: 로즈데이 이벤트와 동일한 구조
372
- - **월별 자동 컨셉**: 12개월 테마 자동 적용
373
- - **상세 설정**: 회사정보, 상품정보 커스터마이징
374
- - **디자인 가이드**: 실제 구현 가능한 디자인 조언
375
- - **비용 계산**: 예상 총 비용 자동 계산
376
  """)
377
 
378
  gr.Markdown("""
379
- ## 🚀 다음 단계 개발 예정
380
- - **이미지 레퍼런스 분석**: OCR + 디자인 분석
381
- - **A/B 테스팅**: 여러 버전 생성 비교
382
- - **자동 일정 관리**: 이벤트 알림 관리
383
- - **성과 측정**: 참여율 추적 및 분석
384
  """)
385
 
386
  return demo
 
20
  12: {"theme": "크리스마스/연말", "colors": ["#DC143C", "#228B22"], "mood": "축제같은, 따뜻한", "symbol": "🎄"}
21
  }
22
 
23
+ # 상품 종류 옵션
24
+ self.reward_types = [
25
+ "네이버페이 금액권",
26
+ "배달의민족 상품권",
27
+ "스타벅스 기프트카드",
28
+ "CGV 영화관람권",
29
+ "올리브영 상품권",
30
+ "컬쳐랜드 문화상품권",
31
+ "해피머니 상품권"
32
+ ]
33
 
34
  def calculate_event_duration(self, start_date, end_date):
35
  """이벤트 기간 계산"""
 
60
  }
61
  return {}
62
 
63
+ def parse_rewards(self, reward_structure):
64
+ """상품 구조 파싱"""
65
+ if not reward_structure.strip():
66
+ return "네이버페이 금액권 20,000원\n1시간마다 1명씩 하루 24명"
67
+
68
+ return reward_structure
69
+
70
  def generate_detailed_comment_event(self, start_date, end_date, concept, duration,
71
+ reward_structure, kakao_id, phone_number, custom_details=""):
 
72
  """참고자료 구조를 완전히 반영한 댓글 이벤트 템플릿"""
73
 
74
  if not concept:
 
87
  formatted_start = f"{start_dt.year}년 {start_dt.month}월 {start_dt.day}일 {start_weekday} 00:00"
88
  formatted_end = f"{end_dt.year}년 {end_dt.month}월 {end_dt.day}일 {end_weekday} 23:59"
89
 
90
+ # 상품 정보 파싱
91
+ reward_text = self.parse_rewards(reward_structure)
92
+
93
  # 메인 제목 생성
94
  if "로즈" in theme:
95
  main_title = f"댓글 남기면 1시간마다 선물이!\n{symbol}같은 {month}월 {theme} 이벤트"
96
  else:
97
  main_title = f"댓글 남기면 1시간마다 선물이!\n{symbol} {mood} {theme} 이벤트"
98
 
99
+ template = f"""{main_title}
 
100
 
101
  {formatted_start} - {formatted_end} ({duration}일간)
102
 
103
  ========================
104
  EVENT
105
+ <커뮤니티>에 작성된 글에 유익하고 착한 댓글을 남기면
106
  1시간마다 1명씩! 하루 24명에게 선물을드려요!
107
 
108
  {formatted_start} - {formatted_end} ({duration}일간)
109
 
110
  =====================
111
  STEP 1
112
+ 회사명 <커뮤니티>에 작성된 글에
113
  유익하고 착한 댓글 작성
114
  * 이쁘고 좋은 말 많이 해주는 회원님들이 되길 부탁드려요
115
 
 
125
 
126
  =================
127
  당첨혜택
128
+ {reward_text}
 
 
129
 
130
  ========================
131
  이벤트 대상
 
152
 
153
  =========================
154
  꼭 확인하세요!
155
+ ※본이벤트는 회사명 일반 여성회원만 참여가능합니다. (비회원도 가능)
156
  ※ pc에서 캡처가 어려운 경우, 카메라로 촬영하여 연락 주셔도 됩니다.
157
  ※이벤트 팝업 상품 이미지와 상단 당첨 날짜&시간을 함께
158
  화면 캡처 또는 사진 촬영해야 수령 가능합니다.
 
236
  def create_interface():
237
  event_manager = EventManager()
238
 
239
+ with gr.Blocks(title="이벤트 관리 시스템 v2.1") as demo:
240
+ gr.Markdown("# 🎉 이벤트 관리 시스템 v2.1")
241
+ gr.Markdown("**유연한 상품 설정** - 단일상품부터 등급별 상품까지 자유롭게 설정")
242
 
243
  with gr.Row():
244
  with gr.Column(scale=1):
 
257
  value="2025-05-25"
258
  )
259
 
260
+ gr.Markdown("## 🎁 상품 설정")
261
+
262
  with gr.Group():
263
+ reward_type_selector = gr.Radio(
264
+ choices=[
265
+ "단일 상품",
266
+ "등급별 상품 (1,2,3등)",
267
+ "선택형 상품 (네이버페이 OR 배달의민족)",
268
+ "직접 입력"
269
+ ],
270
+ label="상품 구성 방식",
271
+ value="단일 상품"
272
+ )
273
+
274
+ # 단일 상품 설정
275
+ with gr.Group(visible=True) as single_reward_group:
276
+ single_reward_type = gr.Dropdown(
277
+ choices=event_manager.reward_types,
278
+ label="상품 종류",
279
+ value="네이버페이 금액권"
280
+ )
281
+ single_reward_amount = gr.Number(
282
+ label="금액 (원)",
283
+ value=20000,
284
+ step=1000
285
+ )
286
+ single_reward_frequency = gr.Textbox(
287
+ label="당첨 주기",
288
+ value="1시간마다 1명씩 하루 24명",
289
+ placeholder="예: 1시간마다 1명씩 하루 24명"
290
  )
291
+
292
+ # 등급별 상품 설정
293
+ with gr.Group(visible=False) as grade_reward_group:
294
+ gr.Markdown("### 🥇 1등")
295
+ grade1_type = gr.Dropdown(choices=event_manager.reward_types, value="네이버페이 금액권")
296
+ grade1_amount = gr.Number(label="1등 금액", value=50000, step=1000)
297
+ grade1_count = gr.Number(label="1등 인원", value=5, step=1)
298
+
299
+ gr.Markdown("### 🥈 2등")
300
+ grade2_type = gr.Dropdown(choices=event_manager.reward_types, value="네이버페이 금액권")
301
+ grade2_amount = gr.Number(label="2등 금액", value=30000, step=1000)
302
+ grade2_count = gr.Number(label="2등 인원", value=10, step=1)
303
 
304
+ gr.Markdown("### 🥉 3등")
305
+ grade3_type = gr.Dropdown(choices=event_manager.reward_types, value="네이버페이 금액권")
306
+ grade3_amount = gr.Number(label="3등 금액", value=20000, step=1000)
307
+ grade3_count = gr.Number(label="3등 인원", value=20, step=1)
308
+
309
+ # 선택형 상품 설정
310
+ with gr.Group(visible=False) as choice_reward_group:
311
+ choice_type1 = gr.Dropdown(choices=event_manager.reward_types, value="네이버페이 금액권", label="상품 1")
312
+ choice_type2 = gr.Dropdown(choices=event_manager.reward_types, value="배달의민족 상품권", label="상품 2")
313
+ choice_amount = gr.Number(label="금액 (원)", value=20000, step=1000)
314
+ choice_frequency = gr.Textbox(
315
+ label="당첨 주기",
316
+ value="1시간마다 1명씩 하루 24명",
317
+ placeholder="예: 1시간마다 1명씩 하루 24명"
318
+ )
319
+
320
+ # 직접 입력
321
+ with gr.Group(visible=False) as custom_reward_group:
322
+ custom_reward_text = gr.Textbox(
323
+ label="상품 정보 직접 입력",
324
+ placeholder="예:\n네이버페이 금액권 20,000원 이미지 / 배달의민족 상품권 20,000원 이미지\n네이버페이 or 배달의 민족 상품권 2만원\n1시간마다 1명씩 하루 24명",
325
+ lines=5
326
+ )
327
+
328
+ gr.Markdown("## 📞 연락처 정보")
329
+ with gr.Group():
330
  phone_number = gr.Textbox(
331
  label="고객센터 번호",
332
  placeholder="1544-1234",
 
335
 
336
  kakao_id = gr.Textbox(
337
  label="카카오톡 ID",
338
+ placeholder="company_kakao",
339
  value="company_kakao"
340
  )
341
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  custom_details = gr.Textbox(
343
  label="추가 정보",
344
  placeholder="추가할 내용이 있다면 입력하세요",
345
  lines=2
346
  )
347
 
348
+ generate_btn = gr.Button("✨ 이벤트 생성하기", variant="primary", size="lg")
349
 
350
  with gr.Column(scale=2):
351
  gr.Markdown("## 📊 생성 결과")
 
368
 
369
  with gr.Tab("📈 이벤트 정보"):
370
  event_info = gr.Textbox(
371
+ label="이벤트 기본 정보 요약",
372
  interactive=False,
373
  lines=8
374
  )
375
 
376
+ # 상품 구성 방식에 따라 UI 변경
377
+ def update_reward_ui(reward_type):
378
+ return (
379
+ gr.update(visible=(reward_type == "단일 상품")),
380
+ gr.update(visible=(reward_type == "등급별 상품 (1,2,3등)")),
381
+ gr.update(visible=(reward_type == "선택형 상품 (네이버페이 OR 배달의민족)")),
382
+ gr.update(visible=(reward_type == "직접 입력"))
383
+ )
384
+
385
+ reward_type_selector.change(
386
+ fn=update_reward_ui,
387
+ inputs=[reward_type_selector],
388
+ outputs=[single_reward_group, grade_reward_group, choice_reward_group, custom_reward_group]
389
+ )
390
+
391
+ def generate_reward_structure(reward_type, *args):
392
+ """상품 구성에 따라 텍스트 생성"""
393
+ if reward_type == "단일 상품":
394
+ single_type, single_amount, single_frequency = args[0], args[1], args[2]
395
+ return f"{single_type} {int(single_amount):,}원 이미지\n{single_type} {int(single_amount):,}원\n{single_frequency}"
396
+
397
+ elif reward_type == "등급별 상품 (1,2,3등)":
398
+ g1_type, g1_amount, g1_count, g2_type, g2_amount, g2_count, g3_type, g3_amount, g3_count = args[3:12]
399
+ return f"""🥇 1등: {g1_type} {int(g1_amount):,}원 ({int(g1_count)}명)
400
+ 🥈 2등: {g2_type} {int(g2_amount):,}원 ({int(g2_count)}명)
401
+ 🥉 3등: {g3_type} {int(g3_amount):,}원 ({int(g3_count)}명)
402
+ 총 {int(g1_count + g2_count + g3_count)}명"""
403
+
404
+ elif reward_type == "선택형 상품 (네이버페이 OR 배달의민족)":
405
+ c_type1, c_type2, c_amount, c_frequency = args[12], args[13], args[14], args[15]
406
+ return f"{c_type1} {int(c_amount):,}원 이미지 / {c_type2} {int(c_amount):,}원 이미지\n{c_type1} or {c_type2} {int(c_amount):,}원\n{c_frequency}"
407
+
408
+ elif reward_type == "직접 입력":
409
+ return args[16] if args[16] else "상품 정보를 입력해주세요"
410
+
411
+ return "상품 정보를 설정해주세요"
412
+
413
+ def generate_complete_event(start_date_val, end_date_val, phone_number_val, kakao_id_val,
414
+ custom_details_val, reward_type, *reward_args):
415
 
416
  # 기간 계산
417
  duration, month, start_weekday, end_weekday, start_dt, end_dt = event_manager.calculate_event_duration(start_date_val, end_date_val)
 
422
  # 월별 컨셉 생성
423
  concept = event_manager.generate_monthly_concept(month)
424
 
425
+ # 상품 구조 생성
426
+ reward_structure = generate_reward_structure(reward_type, *reward_args)
427
+
428
  # 상세 템플릿 생성
429
  template = event_manager.generate_detailed_comment_event(
430
  start_date_val, end_date_val, concept, duration,
431
+ reward_structure, kakao_id_val, phone_number_val, custom_details_val
 
432
  )
433
 
434
  # 디자인 가이드 생성
 
440
  🗓️ 기간: {duration}일간 ({start_date_val} ~ {end_date_val})
441
  🎯 테마: {concept.get('theme', '')} {concept.get('symbol', '')}
442
  🎨 분위기: {concept.get('mood', '')}
 
 
 
 
443
  📞 연락처: {phone_number_val}
444
  💬 카톡: {kakao_id_val}
445
 
446
+ 🎁 상품 구성:
447
+ {reward_structure}
448
+
449
+ 💡 상품 구성 방식: {reward_type}"""
450
 
451
  return template, design, info
452
 
453
+ # 모든 입력값을 리스트로 정리
454
+ all_inputs = [
455
+ start_date, end_date, phone_number, kakao_id, custom_details, reward_type_selector,
456
+ # 단일 상품
457
+ single_reward_type, single_reward_amount, single_reward_frequency,
458
+ # 등급별 상품
459
+ grade1_type, grade1_amount, grade1_count,
460
+ grade2_type, grade2_amount, grade2_count,
461
+ grade3_type, grade3_amount, grade3_count,
462
+ # 선택형 상품
463
+ choice_type1, choice_type2, choice_amount, choice_frequency,
464
+ # 직접 입력
465
+ custom_reward_text
466
+ ]
467
+
468
  generate_btn.click(
469
  fn=generate_complete_event,
470
+ inputs=all_inputs,
 
471
  outputs=[event_template, design_guide, event_info]
472
  )
473
 
474
  with gr.Row():
475
  gr.Markdown("""
476
+ ## ✅ v2.1 새로운 기능
477
+ - **🎁 유연한 상품 설정**: 단일/등급별/선택형/직접입력 모두 지원
478
+ - **💰 자동 비용 계산**: 등급별 상품 총 비용 자동 계산
479
+ - **🏢 간소화**: 회사 정보 제거로 더 간단한 설정
480
+ - **📝 자유도 증가**: 상품 구성의 완전한 자유도 제공
 
481
  """)
482
 
483
  gr.Markdown("""
484
+ ## 🎯 상품 설정 예시
485
+ - **단일**: 네이버페이 2만원, 1시간마다 1명
486
+ - **등급별**: 1등 5만원(5명), 2등 3만원(10명), 3등 2만원(20명)
487
+ - **선택형**: 네이버페이 OR 배달의민족 2만원 선택
488
+ - **직접입력**: 완전히 자유로운 형식
489
  """)
490
 
491
  return demo