Skip to content

Commit 4de1068

Browse files
committed
Изменены тексты писем для сценариев рассылки согласно шаблону
1 parent ba4630a commit 4de1068

2 files changed

Lines changed: 114 additions & 101 deletions

File tree

mailing/scenarios.py

Lines changed: 109 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -40,82 +40,33 @@ class Scenario:
4040
context_builder: ContextBuilder
4141

4242

43-
def _build_submission_deadline_context(offset_days: int) -> ContextBuilder:
44-
def _builder(program: PartnerProgram, user: CustomUser, deadline_date: date) -> dict:
45-
return {
46-
"preview_text": "Кейс-чемпионат уже стартовал",
47-
"title": "Время начинать!",
48-
"text": (
49-
"Кейс-чемпионат уже стартовал. Скорее заходите на платформу, "
50-
"создавайте проект и подключайте команду к работе.\n\n"
51-
"Вас ждет много интересного ⚡"
52-
),
53-
"button_text": "Подать проект",
54-
"button_link": f"{FRONTEND_BASE_URL}/office/program/{program.id}",
55-
}
56-
57-
return _builder
58-
59-
60-
def _build_registration_plus_5_context() -> ContextBuilder:
61-
def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict:
62-
return {
63-
"preview_text": "Сделайте первый шаг в программе",
64-
"title": "Сделать первый шаг",
65-
"text": (
66-
"Когда непонятно с чего начать — стоит начать с самого простого. "
67-
"На раз-два-три: зайти на платформу — создать проект — "
68-
"пригласить команду.\n\n"
69-
"И вот, первый шаг уже сделан"
70-
),
71-
}
72-
73-
return _builder
74-
75-
76-
def _build_project_not_submitted_context(title: str, text: str) -> ContextBuilder:
77-
def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict:
78-
return {
79-
"preview_text": title,
80-
"title": title,
81-
"text": text,
82-
}
83-
84-
return _builder
85-
86-
87-
def _build_registration_plus_3_inactive_context() -> ContextBuilder:
88-
def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict:
89-
return {
90-
"preview_text": "Поздравляем!",
91-
"title": "Поздравляем!",
92-
"text": (
93-
f"Вы зарегистрировались на кейс-чемпионат {program.name}. "
94-
"Заходите на платформу, чтобы оформить свой профиль участника "
95-
"и вступить в закрытую группу программы.\n\n"
96-
"Увидимся на платформе ⚡"
97-
),
98-
"button_text": "Оформить профиль",
99-
"button_link": f"{FRONTEND_BASE_URL}/office/profile/{user.id}/",
100-
}
101-
102-
return _builder
43+
def _render_context_value(value: str, program: PartnerProgram, user: CustomUser) -> str:
44+
return (
45+
value.replace("{program_name}", program.name)
46+
.replace("{program_id}", str(program.id))
47+
.replace("{user_id}", str(user.id))
48+
)
10349

10450

105-
def _build_registration_end_plus_3_inactive_context() -> ContextBuilder:
51+
def _build_context(
52+
*,
53+
preview_text: str,
54+
title: str,
55+
text: str,
56+
button_text: str | None = None,
57+
button_link: str | None = None,
58+
) -> ContextBuilder:
10659
def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict:
107-
return {
108-
"preview_text": "Без вас совсем не то",
109-
"title": "Без вас совсем не то",
110-
"text": (
111-
"Мы так обрадовались, увидев вашу регистрацию, но, кажется, "
112-
"вы еще не заходили на платформу.\n\n"
113-
"Скорее заходите на procollab, чтобы стать активным участником "
114-
"всероссийского кейс-чемпионата и забрать максимум полезного для себя ⚡"
115-
),
116-
"button_text": "Зайти на платформу",
117-
"button_link": f"{FRONTEND_BASE_URL}/office/profile/{user.id}/",
60+
context = {
61+
"preview_text": _render_context_value(preview_text, program, user),
62+
"title": _render_context_value(title, program, user),
63+
"text": _render_context_value(text, program, user),
11864
}
65+
if button_text is not None:
66+
context["button_text"] = _render_context_value(button_text, program, user)
67+
if button_link is not None:
68+
context["button_link"] = _render_context_value(button_link, program, user)
69+
return context
11970

12071
return _builder
12172

@@ -126,79 +77,137 @@ def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict
12677
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
12778
offset_days=10,
12879
template_name="email/generic-template-0.html",
129-
subject="Время начинать!",
80+
subject="{program_name}: важное сообщение",
13081
recipient_rule=RecipientRule.NO_PROJECT_IN_PROGRAM,
131-
context_builder=_build_submission_deadline_context(10),
82+
context_builder=_build_context(
83+
preview_text="Кейс-чемпионат уже стартовал",
84+
title="Время начинать!",
85+
text=(
86+
"Кейс-чемпионат уже стартовал. Скорее заходите на платформу, "
87+
"создавайте проект и подключайте команду к работе.\n\n"
88+
"Вас ждет много интересного ⚡"
89+
),
90+
button_text="Создать проект",
91+
button_link=f"{FRONTEND_BASE_URL}/office/projects",
92+
),
13293
),
13394
Scenario(
13495
code="program_registration_plus_5_no_project",
13596
trigger=TriggerType.PROGRAM_REGISTRATION_DATE,
13697
offset_days=5,
13798
template_name="email/generic-template-0.html",
138-
subject="Сделать первый шаг",
99+
subject="{program_name}: важное сообщение",
139100
recipient_rule=RecipientRule.NO_PROJECT_IN_PROGRAM_REGISTERED_ON_DATE,
140-
context_builder=_build_registration_plus_5_context(),
101+
context_builder=_build_context(
102+
preview_text="Сделать первый шаг",
103+
title="Сделать первый шаг",
104+
text=(
105+
"Когда непонятно с чего начать — стоит начать с самого простого. "
106+
"Например, зайти на платформу, создать проект или вступить в уже "
107+
"созданный лидером вашей команды.\n\n"
108+
"И вот, первый шаг уже сделан!"
109+
),
110+
button_text="Зайти на платформу",
111+
button_link=f"{FRONTEND_BASE_URL}/office/projects",
112+
),
141113
),
142114
Scenario(
143115
code="program_registration_plus_3_inactive_account",
144116
trigger=TriggerType.PROGRAM_REGISTRATION_DATE,
145117
offset_days=3,
146118
template_name="email/generic-template-0.html",
147-
subject="Поздравляем!",
119+
subject="{program_name}: важное сообщение",
148120
recipient_rule=RecipientRule.INACTIVE_ACCOUNT_IN_PROGRAM_REGISTERED_ON_DATE,
149-
context_builder=_build_registration_plus_3_inactive_context(),
121+
context_builder=_build_context(
122+
preview_text="Поздравляем!",
123+
title="Поздравляем!",
124+
text=(
125+
"Вы зарегистрировались на {program_name}. "
126+
"Заходите на платформу, чтобы оформить свой профиль участника "
127+
"и вступить в закрытую группу программы.\n\n"
128+
"Увидимся на платформе ⚡"
129+
),
130+
button_text="Оформить профиль",
131+
button_link=f"{FRONTEND_BASE_URL}/office/profile/{{user_id}}/",
132+
),
150133
),
151134
Scenario(
152135
code="program_registration_end_plus_3_inactive_account",
153136
trigger=TriggerType.PROGRAM_REGISTRATION_END,
154137
offset_days=3,
155138
template_name="email/generic-template-0.html",
156-
subject="Без вас совсем не то",
139+
subject="{program_name}: важное сообщение",
157140
recipient_rule=RecipientRule.INACTIVE_ACCOUNT_IN_PROGRAM,
158-
context_builder=_build_registration_end_plus_3_inactive_context(),
141+
context_builder=_build_context(
142+
preview_text="Без вас совсем не то",
143+
title="Без вас совсем не то",
144+
text=(
145+
"Мы так обрадовались, увидев вашу регистрацию, но, кажется, "
146+
"вы еще не заходили на платформу.\n\n"
147+
"Скорее заходите на procollab, чтобы стать активным участником "
148+
"программы и забрать максимум полезного для себя ⚡"
149+
),
150+
button_text="Зайти на платформу",
151+
button_link=f"{FRONTEND_BASE_URL}/office/profile/{{user_id}}/",
152+
),
159153
),
160154
Scenario(
161155
code="program_submission_deadline_minus_9_project_not_submitted",
162156
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
163157
offset_days=9,
164158
template_name="email/generic-template-0.html",
165-
subject="Кейс-задания опубликованы",
159+
subject="{program_name}: важное сообщение",
166160
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
167-
context_builder=_build_project_not_submitted_context(
168-
"Кейс-задания опубликованы",
169-
"Заходите на платформу, чтобы познакомиться с кейсами первого этапа "
170-
"кейс-чемпионата. Кейсы загружены в материалы закрытой группы.\n\n"
171-
"Приступайте к работе уже сегодня, чтобы успеть подготовить итоговое "
172-
"решение в срок ⚡",
161+
context_builder=_build_context(
162+
preview_text="Кейс-задания опубликованы",
163+
title="Кейс-задания опубликованы",
164+
text=(
165+
"Заходите на платформу, чтобы познакомиться с кейсами первого этапа "
166+
"кейс-чемпионата. Кейсы загружены в материалы закрытой группы.\n\n"
167+
"Приступайте к работе уже сегодня, чтобы успеть подготовить итоговое "
168+
"решение в срок ⚡"
169+
),
170+
button_text="Познакомиться с кейсом",
171+
button_link=f"{FRONTEND_BASE_URL}/office/program/{{program_id}}",
173172
),
174173
),
175174
Scenario(
176175
code="program_submission_deadline_minus_3_project_not_submitted",
177176
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
178177
offset_days=3,
179178
template_name="email/generic-template-0.html",
180-
subject="До сдачи итогового решения осталось 3 дня",
179+
subject="{program_name}: важное сообщение",
181180
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
182-
context_builder=_build_project_not_submitted_context(
183-
"До сдачи итогового решения осталось 3 дня",
184-
"Работа в самом разгаре, и мы запускаем обратный отсчет. "
185-
"Осталось всего 3 дня, чтобы доработать проект, оформить презентацию "
186-
"и загрузить итоговое решение на платформу.",
181+
context_builder=_build_context(
182+
preview_text="До сдачи итогового решения осталось 3 дня",
183+
title="До сдачи итогового решения осталось 3 дня",
184+
text=(
185+
"Работа в самом разгаре, и мы запускаем обратный отсчет. "
186+
"Осталось всего 3 дня, чтобы доработать проект, оформить презентацию "
187+
"и загрузить итоговое решение на платформу."
188+
),
189+
button_text="Загрузить решение",
190+
button_link=f"{FRONTEND_BASE_URL}/office/projects",
187191
),
188192
),
189193
Scenario(
190194
code="program_submission_deadline_minus_1_project_not_submitted",
191195
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
192196
offset_days=1,
193197
template_name="email/generic-template-0.html",
194-
subject="1 день до сдачи итогового решения",
198+
subject="{program_name}: важное сообщение",
195199
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
196-
context_builder=_build_project_not_submitted_context(
197-
"1 день до сдачи итогового решения",
198-
"День X совсем скоро. Осталось только внести последние штрихи и "
199-
"загрузить итоговое решение на платформу.\n\n"
200-
"По любым техническим вопросам всегда на связи @procollab_support\n\n"
201-
"Удачи!",
200+
context_builder=_build_context(
201+
preview_text="1 день до сдачи итогового решения",
202+
title="1 день до сдачи итогового решения",
203+
text=(
204+
"День X совсем скоро. Осталось только внести последние штрихи и "
205+
"загрузить итоговое решение на платформу.\n\n"
206+
"По любым техническим вопросам всегда на связи @procollab_support\n\n"
207+
"Удачи!"
208+
),
209+
button_text="Загрузить решение",
210+
button_link=f"{FRONTEND_BASE_URL}/office/program/{{program_id}}",
202211
),
203212
),
204213
)

mailing/tasks.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
logger = logging.getLogger(__name__)
2424

2525

26+
def _build_subject(scenario, program) -> str:
27+
return scenario.subject.replace("{program_name}", program.name)
28+
29+
2630
def _get_programs_for_scenario(scenario, target_date):
2731
match scenario.trigger:
2832
case TriggerType.PROGRAM_SUBMISSION_DEADLINE:
@@ -212,7 +216,7 @@ def status_callback(user, msg):
212216
try:
213217
num_sent = send_mass_mail_from_template(
214218
recipients_to_send,
215-
scenario.subject,
219+
_build_subject(scenario, program),
216220
scenario.template_name,
217221
context_builder=context_builder,
218222
status_callback=status_callback,

0 commit comments

Comments
 (0)