-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathscenarios.py
More file actions
206 lines (191 loc) · 9.62 KB
/
scenarios.py
File metadata and controls
206 lines (191 loc) · 9.62 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
from dataclasses import dataclass
from datetime import date
from enum import Enum
from typing import Callable
from mailing.rendering import render_template_value
from partner_programs.models import PartnerProgram
from users.models import CustomUser
FRONTEND_BASE_URL = "https://app.procollab.ru"
class TriggerType(Enum):
PROGRAM_SUBMISSION_DEADLINE = "program_submission_deadline"
PROGRAM_REGISTRATION_DATE = "program_registration_date"
PROGRAM_REGISTRATION_END = "program_registration_end"
class RecipientRule(Enum):
ALL_PARTICIPANTS = "all_participants"
NO_PROJECT_IN_PROGRAM = "no_project_in_program"
NO_PROJECT_IN_PROGRAM_REGISTERED_ON_DATE = "no_project_in_program_registered_on_date"
PROJECT_NOT_SUBMITTED = "project_not_submitted"
INACTIVE_ACCOUNT_IN_PROGRAM = "inactive_account_in_program"
INACTIVE_ACCOUNT_IN_PROGRAM_REGISTERED_ON_DATE = (
"inactive_account_in_program_registered_on_date"
)
ContextBuilder = Callable[[PartnerProgram, CustomUser, date], dict]
@dataclass(frozen=True)
class Scenario:
code: str
trigger: TriggerType
offset_days: int
template_name: str
subject: str
recipient_rule: RecipientRule
context_builder: ContextBuilder
def _build_context(
*,
preview_text: str,
title: str,
text: str,
button_text: str | None = None,
button_link: str | None = None,
) -> ContextBuilder:
def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict:
context = {
"preview_text": render_template_value(preview_text, program, user),
"title": render_template_value(title, program, user),
"text": render_template_value(text, program, user),
}
if button_text is not None:
context["button_text"] = render_template_value(button_text, program, user)
if button_link is not None:
context["button_link"] = render_template_value(button_link, program, user)
return context
return _builder
SCENARIOS: tuple[Scenario, ...] = (
Scenario(
code="program_submission_deadline_minus_10_no_project",
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
offset_days=10,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.NO_PROJECT_IN_PROGRAM,
context_builder=_build_context(
preview_text="Кейс-чемпионат уже стартовал",
title="Время начинать!",
text=(
"Кейс-чемпионат уже стартовал. Скорее заходите на платформу, "
"создавайте проект и подключайте команду к работе.\n\n"
"Вас ждет много интересного ⚡"
),
button_text="Создать проект",
button_link=f"{FRONTEND_BASE_URL}/office/projects",
),
),
Scenario(
code="program_registration_plus_5_no_project",
trigger=TriggerType.PROGRAM_REGISTRATION_DATE,
offset_days=5,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.NO_PROJECT_IN_PROGRAM_REGISTERED_ON_DATE,
context_builder=_build_context(
preview_text="Сделать первый шаг",
title="Сделать первый шаг",
text=(
"Когда непонятно с чего начать — стоит начать с самого простого. "
"Например, зайти на платформу, создать проект или вступить в уже "
"созданный лидером вашей команды.\n\n"
"И вот, первый шаг уже сделан!"
),
button_text="Зайти на платформу",
button_link=f"{FRONTEND_BASE_URL}/office/projects",
),
),
Scenario(
code="program_registration_plus_3_inactive_account",
trigger=TriggerType.PROGRAM_REGISTRATION_DATE,
offset_days=3,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.INACTIVE_ACCOUNT_IN_PROGRAM_REGISTERED_ON_DATE,
context_builder=_build_context(
preview_text="Поздравляем!",
title="Поздравляем!",
text=(
"Вы зарегистрировались на {program_name}. "
"Заходите на платформу, чтобы оформить свой профиль участника "
"и вступить в закрытую группу программы.\n\n"
"Увидимся на платформе ⚡"
),
button_text="Оформить профиль",
button_link=f"{FRONTEND_BASE_URL}/office/profile/{{user_id}}/",
),
),
Scenario(
code="program_registration_end_plus_3_inactive_account",
trigger=TriggerType.PROGRAM_REGISTRATION_END,
offset_days=3,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.INACTIVE_ACCOUNT_IN_PROGRAM,
context_builder=_build_context(
preview_text="Без вас совсем не то",
title="Без вас совсем не то",
text=(
"Мы так обрадовались, увидев вашу регистрацию, но, кажется, "
"вы еще не заходили на платформу.\n\n"
"Скорее заходите на procollab, чтобы стать активным участником "
"программы и забрать максимум полезного для себя ⚡"
),
button_text="Зайти на платформу",
button_link=f"{FRONTEND_BASE_URL}/office/profile/{{user_id}}/",
),
),
Scenario(
code="program_submission_deadline_minus_9_project_not_submitted",
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
offset_days=9,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
context_builder=_build_context(
preview_text="Кейс-задания опубликованы",
title="Кейс-задания опубликованы",
text=(
"Заходите на платформу, чтобы познакомиться с кейсами первого этапа "
"кейс-чемпионата. Кейсы загружены в материалы закрытой группы.\n\n"
"Приступайте к работе уже сегодня, чтобы успеть подготовить итоговое "
"решение в срок ⚡"
),
button_text="Познакомиться с кейсом",
button_link=f"{FRONTEND_BASE_URL}/office/program/{{program_id}}",
),
),
Scenario(
code="program_submission_deadline_minus_3_project_not_submitted",
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
offset_days=3,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
context_builder=_build_context(
preview_text="До сдачи итогового решения осталось 3 дня",
title="До сдачи итогового решения осталось 3 дня",
text=(
"Работа в самом разгаре, и мы запускаем обратный отсчет. "
"Осталось всего 3 дня, чтобы доработать проект, оформить презентацию "
"и загрузить итоговое решение на платформу."
),
button_text="Загрузить решение",
button_link=f"{FRONTEND_BASE_URL}/office/projects",
),
),
Scenario(
code="program_submission_deadline_minus_1_project_not_submitted",
trigger=TriggerType.PROGRAM_SUBMISSION_DEADLINE,
offset_days=1,
template_name="email/generic-template-0.html",
subject="{program_name}: важное сообщение",
recipient_rule=RecipientRule.PROJECT_NOT_SUBMITTED,
context_builder=_build_context(
preview_text="1 день до сдачи итогового решения",
title="1 день до сдачи итогового решения",
text=(
"День X совсем скоро. Осталось только внести последние штрихи и "
"загрузить итоговое решение на платформу.\n\n"
"По любым техническим вопросам всегда на связи @procollab_support\n\n"
"Удачи!"
),
button_text="Загрузить решение",
button_link=f"{FRONTEND_BASE_URL}/office/program/{{program_id}}",
),
),
)