-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
112 lines (91 loc) · 4.18 KB
/
app.py
File metadata and controls
112 lines (91 loc) · 4.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import pandas as pd
import datetime
from flask import Flask, render_template, request
import io
app = Flask(__name__)
# --- 설정 ---
MEMBERS_FILE = 'members.csv'
ACTIVITIES_FILE = 'activities.csv'
DAYS_TO_LOOK_BACK = 7
# --- 데이터 처리 및 뉴스레터 생성 로직 (기존 스크립트에서 가져옴) ---
def load_data(members_path, activities_path):
try:
members_df = pd.read_csv(members_path)
activities_df = pd.read_csv(activities_path)
return members_df, activities_df
except FileNotFoundError as e:
return None, None
def filter_recent_activities(activities_df, days):
if activities_df is None:
return pd.DataFrame()
activities_df['date'] = pd.to_datetime(activities_df['date'])
end_date = datetime.datetime.now()
start_date = end_date - datetime.timedelta(days=days)
recent_activities = activities_df[(activities_df['date'] >= start_date) & (activities_df['date'] <= end_date)]
return recent_activities
def summarize_with_llm(activities):
# TODO: 실제 LLM API 연동 부분
if activities.empty:
return "지난 주에 기록된 활동이 없습니다."
summary = "지난 주 팀 활동 요약:\n\n"
for index, row in activities.iterrows():
summary += f"- 활동명: {row['activity_name']} ({row['date'].strftime('%Y-%m-%d')})\n"
summary += f" - 참여자: {row['participants']}\n"
summary += f" - 내용: {row['notes']}\n"
if pd.notna(row['photo_url']):
summary += f" - 관련 사진: {row['photo_url']}\n"
summary += "\n"
return summary
def generate_newsletter_html(summary_text):
html_content = summary_text.replace('\n', '<br>')
html = f'''
<html><head></head><body>
<div style="font-family: Arial, sans-serif; line-height: 1.6;">
<h2>주간 팀 활동 뉴스레터</h2>
<p>안녕하세요, 팀 멤버 여러분!</p>
<p>지난 주 팀 활동들을 아래와 같이 공유드립니다.</p>
<hr>
<div style="background-color: #f9f9f9; border-left: 5px solid #ccc; padding: 10px 20px; margin: 20px 0;">
<p>{html_content}</p>
</div>
<hr>
<p>이번 주도 활기찬 한 주 되시길 바랍니다!</p>
</div>
</body></html>
'''
return html
def get_simulated_email_content(recipients, subject, html_body):
# 이메일 발송 대신 텍스트로 된 결과물을 반환
output = io.StringIO()
output.write("--- 이메일 발송 시뮬레이션 ---\n")
output.write(f"수신자: {', '.join(recipients)}\n")
output.write(f"제목: {subject}\n")
output.write("--- 본문 (HTML 미리보기) ---\n")
output.write(html_body)
output.write("\n-----------------------\n")
return output.getvalue()
def run_newsletter_process():
"""메인 워크플로를 실행하고 결과 문자열을 반환합니다."""
members_df, activities_df = load_data(MEMBERS_FILE, ACTIVITIES_FILE)
if members_df is None or activities_df is None:
return "오류: 데이터 파일(members.csv 또는 activities.csv)을 찾을 수 없습니다."
recent_activities = filter_recent_activities(activities_df, days=DAYS_TO_LOOK_BACK)
if recent_activities.empty:
return "뉴스레터에 포함할 최근 활동이 없습니다."
summary = summarize_with_llm(recent_activities)
newsletter_html = generate_newsletter_html(summary)
recipient_list = members_df['email'].tolist()
subject = f"[{datetime.datetime.now().strftime('%Y-%m-%d')}] 주간 팀 활동 뉴스레터"
# 이메일 발송 대신 시뮬레이션 결과를 반환
return get_simulated_email_content(recipient_list, subject, newsletter_html)
# --- Flask 라우팅 ---
@app.route('/', methods=['GET', 'POST'])
def index():
result = None
if request.method == 'POST':
# '뉴스레터 생성 실행' 버튼이 클릭되면 실행
result = run_newsletter_process()
return render_template('index.html', result=result)
if __name__ == '__main__':
# host='0.0.0.0'으로 설정하여 외부에서도 접속 가능하게 함
app.run(debug=True, host='0.0.0.0')