33from enum import Enum
44from typing import Callable
55
6+ from mailing .rendering import render_template_value
67from partner_programs .models import PartnerProgram
78from users .models import CustomUser
89
1213class TriggerType (Enum ):
1314 PROGRAM_SUBMISSION_DEADLINE = "program_submission_deadline"
1415 PROGRAM_REGISTRATION_DATE = "program_registration_date"
16+ PROGRAM_REGISTRATION_END = "program_registration_end"
1517
1618
1719class RecipientRule (Enum ):
1820 ALL_PARTICIPANTS = "all_participants"
1921 NO_PROJECT_IN_PROGRAM = "no_project_in_program"
2022 NO_PROJECT_IN_PROGRAM_REGISTERED_ON_DATE = "no_project_in_program_registered_on_date"
2123 PROJECT_NOT_SUBMITTED = "project_not_submitted"
24+ INACTIVE_ACCOUNT_IN_PROGRAM = "inactive_account_in_program"
25+ INACTIVE_ACCOUNT_IN_PROGRAM_REGISTERED_ON_DATE = (
26+ "inactive_account_in_program_registered_on_date"
27+ )
2228
2329
2430ContextBuilder = Callable [[PartnerProgram , CustomUser , date ], dict ]
@@ -35,46 +41,25 @@ class Scenario:
3541 context_builder : ContextBuilder
3642
3743
38- def _build_submission_deadline_context (offset_days : int ) -> ContextBuilder :
39- def _builder (program : PartnerProgram , user : CustomUser , deadline_date : date ) -> dict :
40- return {
41- "preview_text" : "Кейс-чемпионат уже стартовал" ,
42- "title" : "Время начинать!" ,
43- "text" : (
44- "Кейс-чемпионат уже стартовал. Скорее заходите на платформу, "
45- "создавайте проект и подключайте команду к работе.\n \n "
46- "Вас ждет много интересного ⚡"
47- ),
48- "button_text" : "Подать проект" ,
49- "button_link" : f"{ FRONTEND_BASE_URL } /office/program/{ program .id } " ,
50- }
51-
52- return _builder
53-
54-
55- def _build_registration_plus_5_context () -> ContextBuilder :
44+ def _build_context (
45+ * ,
46+ preview_text : str ,
47+ title : str ,
48+ text : str ,
49+ button_text : str | None = None ,
50+ button_link : str | None = None ,
51+ ) -> ContextBuilder :
5652 def _builder (program : PartnerProgram , user : CustomUser , _ref_date : date ) -> dict :
57- return {
58- "preview_text" : "Сделайте первый шаг в программе" ,
59- "title" : "Сделать первый шаг" ,
60- "text" : (
61- "Когда непонятно с чего начать — стоит начать с самого простого. "
62- "На раз-два-три: зайти на платформу — создать проект — "
63- "пригласить команду.\n \n "
64- "И вот, первый шаг уже сделан"
65- ),
66- }
67-
68- return _builder
69-
70-
71- def _build_project_not_submitted_context (title : str , text : str ) -> ContextBuilder :
72- def _builder (program : PartnerProgram , user : CustomUser , _ref_date : date ) -> dict :
73- return {
74- "preview_text" : title ,
75- "title" : title ,
76- "text" : text ,
53+ context = {
54+ "preview_text" : render_template_value (preview_text , program , user ),
55+ "title" : render_template_value (title , program , user ),
56+ "text" : render_template_value (text , program , user ),
7757 }
58+ if button_text is not None :
59+ context ["button_text" ] = render_template_value (button_text , program , user )
60+ if button_link is not None :
61+ context ["button_link" ] = render_template_value (button_link , program , user )
62+ return context
7863
7964 return _builder
8065
@@ -85,61 +70,137 @@ def _builder(program: PartnerProgram, user: CustomUser, _ref_date: date) -> dict
8570 trigger = TriggerType .PROGRAM_SUBMISSION_DEADLINE ,
8671 offset_days = 10 ,
8772 template_name = "email/generic-template-0.html" ,
88- subject = "Время начинать! " ,
73+ subject = "{program_name}: важное сообщение " ,
8974 recipient_rule = RecipientRule .NO_PROJECT_IN_PROGRAM ,
90- context_builder = _build_submission_deadline_context (10 ),
75+ context_builder = _build_context (
76+ preview_text = "Кейс-чемпионат уже стартовал" ,
77+ title = "Время начинать!" ,
78+ text = (
79+ "Кейс-чемпионат уже стартовал. Скорее заходите на платформу, "
80+ "создавайте проект и подключайте команду к работе.\n \n "
81+ "Вас ждет много интересного ⚡"
82+ ),
83+ button_text = "Создать проект" ,
84+ button_link = f"{ FRONTEND_BASE_URL } /office/projects" ,
85+ ),
9186 ),
9287 Scenario (
9388 code = "program_registration_plus_5_no_project" ,
9489 trigger = TriggerType .PROGRAM_REGISTRATION_DATE ,
9590 offset_days = 5 ,
9691 template_name = "email/generic-template-0.html" ,
97- subject = "Сделать первый шаг " ,
92+ subject = "{program_name}: важное сообщение " ,
9893 recipient_rule = RecipientRule .NO_PROJECT_IN_PROGRAM_REGISTERED_ON_DATE ,
99- context_builder = _build_registration_plus_5_context (),
94+ context_builder = _build_context (
95+ preview_text = "Сделать первый шаг" ,
96+ title = "Сделать первый шаг" ,
97+ text = (
98+ "Когда непонятно с чего начать — стоит начать с самого простого. "
99+ "Например, зайти на платформу, создать проект или вступить в уже "
100+ "созданный лидером вашей команды.\n \n "
101+ "И вот, первый шаг уже сделан!"
102+ ),
103+ button_text = "Зайти на платформу" ,
104+ button_link = f"{ FRONTEND_BASE_URL } /office/projects" ,
105+ ),
106+ ),
107+ Scenario (
108+ code = "program_registration_plus_3_inactive_account" ,
109+ trigger = TriggerType .PROGRAM_REGISTRATION_DATE ,
110+ offset_days = 3 ,
111+ template_name = "email/generic-template-0.html" ,
112+ subject = "{program_name}: важное сообщение" ,
113+ recipient_rule = RecipientRule .INACTIVE_ACCOUNT_IN_PROGRAM_REGISTERED_ON_DATE ,
114+ context_builder = _build_context (
115+ preview_text = "Поздравляем!" ,
116+ title = "Поздравляем!" ,
117+ text = (
118+ "Вы зарегистрировались на {program_name}. "
119+ "Заходите на платформу, чтобы оформить свой профиль участника "
120+ "и вступить в закрытую группу программы.\n \n "
121+ "Увидимся на платформе ⚡"
122+ ),
123+ button_text = "Оформить профиль" ,
124+ button_link = f"{ FRONTEND_BASE_URL } /office/profile/{{user_id}}/" ,
125+ ),
126+ ),
127+ Scenario (
128+ code = "program_registration_end_plus_3_inactive_account" ,
129+ trigger = TriggerType .PROGRAM_REGISTRATION_END ,
130+ offset_days = 3 ,
131+ template_name = "email/generic-template-0.html" ,
132+ subject = "{program_name}: важное сообщение" ,
133+ recipient_rule = RecipientRule .INACTIVE_ACCOUNT_IN_PROGRAM ,
134+ context_builder = _build_context (
135+ preview_text = "Без вас совсем не то" ,
136+ title = "Без вас совсем не то" ,
137+ text = (
138+ "Мы так обрадовались, увидев вашу регистрацию, но, кажется, "
139+ "вы еще не заходили на платформу.\n \n "
140+ "Скорее заходите на procollab, чтобы стать активным участником "
141+ "программы и забрать максимум полезного для себя ⚡"
142+ ),
143+ button_text = "Зайти на платформу" ,
144+ button_link = f"{ FRONTEND_BASE_URL } /office/profile/{{user_id}}/" ,
145+ ),
100146 ),
101147 Scenario (
102148 code = "program_submission_deadline_minus_9_project_not_submitted" ,
103149 trigger = TriggerType .PROGRAM_SUBMISSION_DEADLINE ,
104150 offset_days = 9 ,
105151 template_name = "email/generic-template-0.html" ,
106- subject = "Кейс-задания опубликованы " ,
152+ subject = "{program_name}: важное сообщение " ,
107153 recipient_rule = RecipientRule .PROJECT_NOT_SUBMITTED ,
108- context_builder = _build_project_not_submitted_context (
109- "Кейс-задания опубликованы" ,
110- "Заходите на платформу, чтобы познакомиться с кейсами первого этапа "
111- "кейс-чемпионата. Кейсы загружены в материалы закрытой группы.\n \n "
112- "Приступайте к работе уже сегодня, чтобы успеть подготовить итоговое "
113- "решение в срок ⚡" ,
154+ context_builder = _build_context (
155+ preview_text = "Кейс-задания опубликованы" ,
156+ title = "Кейс-задания опубликованы" ,
157+ text = (
158+ "Заходите на платформу, чтобы познакомиться с кейсами первого этапа "
159+ "кейс-чемпионата. Кейсы загружены в материалы закрытой группы.\n \n "
160+ "Приступайте к работе уже сегодня, чтобы успеть подготовить итоговое "
161+ "решение в срок ⚡"
162+ ),
163+ button_text = "Познакомиться с кейсом" ,
164+ button_link = f"{ FRONTEND_BASE_URL } /office/program/{{program_id}}" ,
114165 ),
115166 ),
116167 Scenario (
117168 code = "program_submission_deadline_minus_3_project_not_submitted" ,
118169 trigger = TriggerType .PROGRAM_SUBMISSION_DEADLINE ,
119170 offset_days = 3 ,
120171 template_name = "email/generic-template-0.html" ,
121- subject = "До сдачи итогового решения осталось 3 дня " ,
172+ subject = "{program_name}: важное сообщение " ,
122173 recipient_rule = RecipientRule .PROJECT_NOT_SUBMITTED ,
123- context_builder = _build_project_not_submitted_context (
124- "До сдачи итогового решения осталось 3 дня" ,
125- "Работа в самом разгаре, и мы запускаем обратный отсчет. "
126- "Осталось всего 3 дня, чтобы доработать проект, оформить презентацию "
127- "и загрузить итоговое решение на платформу." ,
174+ context_builder = _build_context (
175+ preview_text = "До сдачи итогового решения осталось 3 дня" ,
176+ title = "До сдачи итогового решения осталось 3 дня" ,
177+ text = (
178+ "Работа в самом разгаре, и мы запускаем обратный отсчет. "
179+ "Осталось всего 3 дня, чтобы доработать проект, оформить презентацию "
180+ "и загрузить итоговое решение на платформу."
181+ ),
182+ button_text = "Загрузить решение" ,
183+ button_link = f"{ FRONTEND_BASE_URL } /office/projects" ,
128184 ),
129185 ),
130186 Scenario (
131187 code = "program_submission_deadline_minus_1_project_not_submitted" ,
132188 trigger = TriggerType .PROGRAM_SUBMISSION_DEADLINE ,
133189 offset_days = 1 ,
134190 template_name = "email/generic-template-0.html" ,
135- subject = "1 день до сдачи итогового решения " ,
191+ subject = "{program_name}: важное сообщение " ,
136192 recipient_rule = RecipientRule .PROJECT_NOT_SUBMITTED ,
137- context_builder = _build_project_not_submitted_context (
138- "1 день до сдачи итогового решения" ,
139- "День X совсем скоро. Осталось только внести последние штрихи и "
140- "загрузить итоговое решение на платформу.\n \n "
141- "По любым техническим вопросам всегда на связи @procollab_support\n \n "
142- "Удачи!" ,
193+ context_builder = _build_context (
194+ preview_text = "1 день до сдачи итогового решения" ,
195+ title = "1 день до сдачи итогового решения" ,
196+ text = (
197+ "День X совсем скоро. Осталось только внести последние штрихи и "
198+ "загрузить итоговое решение на платформу.\n \n "
199+ "По любым техническим вопросам всегда на связи @procollab_support\n \n "
200+ "Удачи!"
201+ ),
202+ button_text = "Загрузить решение" ,
203+ button_link = f"{ FRONTEND_BASE_URL } /office/program/{{program_id}}" ,
143204 ),
144205 ),
145206)
0 commit comments