Skip to content

Commit 5cf7c36

Browse files
committed
new email feature
1 parent f185f81 commit 5cf7c36

5 files changed

Lines changed: 55 additions & 24 deletions

File tree

partner_programs/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
)
2121
from vacancy.mapping import (
2222
MessageTypeEnum,
23-
UserProgramRegisterParamsDict,
23+
UserProgramRegisterParams,
2424
)
2525
from vacancy.tasks import send_email
2626

@@ -130,7 +130,7 @@ def post(self, request, *args, **kwargs):
130130
)
131131

132132
send_email.delay(
133-
UserProgramRegisterParamsDict(
133+
UserProgramRegisterParams(
134134
message_type=MessageTypeEnum.REGISTERED_PROGRAM_USER.value,
135135
user_id=user.id,
136136
program_name=program.name,
@@ -172,7 +172,7 @@ def post(self, request, *args, **kwargs):
172172
added_user_profile.save()
173173

174174
send_email.delay(
175-
UserProgramRegisterParamsDict(
175+
UserProgramRegisterParams(
176176
message_type=MessageTypeEnum.REGISTERED_PROGRAM_USER.value,
177177
user_id=user_to_add.id,
178178
program_name=program.name,

project_rates/views.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
)
1818
from users.models import Expert
1919
from users.permissions import IsExpert, IsExpertPost
20+
from vacancy.mapping import ProjectRatedParams, MessageTypeEnum
21+
from vacancy.tasks import send_email
2022

2123
User = get_user_model()
2224

@@ -59,6 +61,18 @@ def create(self, request, *args, **kwargs) -> Response:
5961
unique_fields=["criteria", "user", "project"],
6062
)
6163

64+
project = Project.objects.select_related("leader").get(id=data[0]["project"])
65+
66+
send_email.delay(
67+
ProjectRatedParams(
68+
message_type=MessageTypeEnum.PROJECT_RATED.value,
69+
user_id=project.leader.name,
70+
project_name=project.name,
71+
project_id=project.id,
72+
schema_id=2,
73+
)
74+
)
75+
6276
return Response({"success": True}, status=status.HTTP_201_CREATED)
6377
except Expert.DoesNotExist:
6478
return Response(
@@ -78,12 +92,9 @@ class ProjectListForRate(generics.ListAPIView):
7892

7993
def get_queryset(self) -> QuerySet[Project]:
8094
projects_ids = PartnerProgramUserProfile.objects.filter(
81-
project__isnull=False,
82-
partner_program__id=self.kwargs.get("program_id")
95+
project__isnull=False, partner_program__id=self.kwargs.get("program_id")
8396
).values_list("project__id", flat=True)
8497
# `Count` the easiest way to check for rate exist (0 -> does not exist).
85-
return (
86-
Project.objects
87-
.filter(draft=False, id__in=projects_ids)
88-
.annotate(scored=Count("scores"))
98+
return Project.objects.filter(draft=False, id__in=projects_ids).annotate(
99+
scored=Count("scores")
89100
)

vacancy/mapping.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Literal, TypeAlias, TypedDict, Annotated
33

44
EmailTextTypes: TypeAlias = Literal[
5-
"accepted", "outdated", "responded", "rejected", "registered_program"
5+
"accepted", "outdated", "responded", "rejected", "registered_program", "project_rated"
66
]
77

88

@@ -14,30 +14,43 @@ class MessageTypeEnum(Enum):
1414

1515
REGISTERED_PROGRAM_USER = "registered_program"
1616

17+
PROJECT_RATED = "project_rated"
1718

18-
class BaseEmailCeleryParamsDict(TypedDict):
19+
20+
class BaseEmailCeleryParams(TypedDict):
1921
message_type: EmailTextTypes
2022
user_id: int
2123
schema_id: int # = 2
2224

2325

24-
class CeleryEmailParamsDict(BaseEmailCeleryParamsDict):
26+
class CeleryEmailParams(BaseEmailCeleryParams):
2527
project_name: str
2628
project_id: int
2729
vacancy_role: str
2830

2931

30-
class UserProgramRegisterParamsDict(BaseEmailCeleryParamsDict):
32+
class UserProgramRegisterParams(BaseEmailCeleryParams):
3133
program_name: str
3234
program_id: int
3335

3436

37+
class ProjectRatedParams(BaseEmailCeleryParams):
38+
program_name: str
39+
project_name: str
40+
project_id: int
41+
42+
43+
EmailParamsType: TypeAlias = (
44+
CeleryEmailParams | ProjectRatedParams | UserProgramRegisterParams
45+
)
46+
3547
message_type_to_button_text: dict[Annotated[str, EmailTextTypes], str] = {
3648
MessageTypeEnum.ACCEPTED.value: "Посмотреть на проект",
3749
MessageTypeEnum.RESPONDED.value: "Посмотреть на отклики",
3850
MessageTypeEnum.OUTDATED.value: "Посмотреть на вакансию",
3951
MessageTypeEnum.REJECTED.value: "Посмотреть на проект",
4052
MessageTypeEnum.REGISTERED_PROGRAM_USER.value: "Посмотреть на программу",
53+
MessageTypeEnum.PROJECT_RATED.value: "Посмотреть на проект",
4154
}
4255

4356
message_type_to_title: dict[Annotated[str, EmailTextTypes], str] = {
@@ -49,7 +62,7 @@ class UserProgramRegisterParamsDict(BaseEmailCeleryParamsDict):
4962
}
5063

5164

52-
def get_link(data: CeleryEmailParamsDict | UserProgramRegisterParamsDict):
65+
def get_link(data: EmailParamsType):
5366
match data["message_type"]:
5467
case MessageTypeEnum.ACCEPTED.value:
5568
return f"https://app.procollab.ru/office/projects/{data['project_id']}"
@@ -61,13 +74,15 @@ def get_link(data: CeleryEmailParamsDict | UserProgramRegisterParamsDict):
6174
return f"https://app.procollab.ru/office/projects/{data['project_id']}/edit"
6275
case MessageTypeEnum.REJECTED.value:
6376
return f"https://app.procollab.ru/office/projects/{data['project_id']}"
77+
6478
case MessageTypeEnum.REGISTERED_PROGRAM_USER.value:
6579
return f"https://app.procollab.ru/office/program/{data['program_id']}"
6680

81+
case MessageTypeEnum.PROJECT_RATED.value:
82+
return f"https://app.procollab.ru/office/projects/{data['project_id']}"
83+
6784

68-
def create_text_for_email(
69-
data: CeleryEmailParamsDict | UserProgramRegisterParamsDict,
70-
) -> str:
85+
def create_text_for_email(data: EmailParamsType) -> str:
7186
match data["message_type"]:
7287
case MessageTypeEnum.ACCEPTED.value:
7388
return f"""
@@ -90,3 +105,8 @@ def create_text_for_email(
90105
return f"""
91106
Вы успешно зарегистрировались на программу {data['program_name']}
92107
"""
108+
case MessageTypeEnum.PROJECT_RATED.value:
109+
return f"""
110+
Ваш проект '{data["project_name"]}' был оценён экспертом по программе '{data["program_name"]}'!
111+
Скоро будут результаты.
112+
"""

vacancy/tasks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from mailing.utils import send_mass_mail, prepare_mail_data
55
from procollab.celery import app
66
from vacancy.mapping import (
7-
CeleryEmailParamsDict,
7+
CeleryEmailParams,
88
create_text_for_email,
99
message_type_to_button_text,
1010
get_link,
@@ -15,7 +15,7 @@
1515

1616

1717
@app.task
18-
def send_email(data: CeleryEmailParamsDict):
18+
def send_email(data: CeleryEmailParams):
1919
context_data = ContextDataDict(
2020
text=create_text_for_email(data),
2121
title=message_type_to_title[data["message_type"]],
@@ -44,7 +44,7 @@ def email_notificate_vacancy_outdated():
4444

4545
for vacancy in outdated_active_vacancies:
4646
project = vacancy.project
47-
data_to_send = CeleryEmailParamsDict(
47+
data_to_send = CeleryEmailParams(
4848
message_type=MessageTypeEnum.OUTDATED.value,
4949
user_id=project.leader.id,
5050
project_name=project.name,

vacancy/views.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from projects.models import Collaborator, Project
1212
from vacancy.filters import VacancyFilter
13-
from vacancy.mapping import CeleryEmailParamsDict, MessageTypeEnum
13+
from vacancy.mapping import CeleryEmailParams, MessageTypeEnum
1414
from vacancy.models import Vacancy, VacancyResponse
1515
from vacancy.pagination import VacancyPagination
1616
from vacancy.permissions import (
@@ -107,7 +107,7 @@ def post(self, request, vacancy_id):
107107
project = queryset.vacancy.project
108108

109109
send_email.delay(
110-
CeleryEmailParamsDict(
110+
CeleryEmailParams(
111111
message_type=MessageTypeEnum.RESPONDED.value,
112112
user_id=project.leader.id,
113113
project_name=project.name,
@@ -158,7 +158,7 @@ def post(self, request, pk):
158158
)
159159

160160
send_email.delay(
161-
CeleryEmailParamsDict(
161+
CeleryEmailParams(
162162
message_type=MessageTypeEnum.ACCEPTED.value,
163163
user_id=user_to_add.id,
164164
project_name=project_add_in.name,
@@ -192,7 +192,7 @@ def post(self, request, pk):
192192

193193
project = vacancy_request.vacancy.project
194194
send_email.delay(
195-
CeleryEmailParamsDict(
195+
CeleryEmailParams(
196196
message_type=MessageTypeEnum.REJECTED.value,
197197
user_id=project.leader.id,
198198
project_name=project.name,

0 commit comments

Comments
 (0)