Skip to content

Commit 7dab0a9

Browse files
authored
Merge pull request #421 from PROCOLLAB-github/feature/email-program-user-register
Feature/email program user register
2 parents f2bd6ad + 90499e6 commit 7dab0a9

2 files changed

Lines changed: 62 additions & 15 deletions

File tree

partner_programs/views.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
PartnerProgramNewUserSerializer,
1919
PartnerProgramUserSerializer,
2020
)
21+
from vacancy.mapping import (
22+
MessageTypeEnum,
23+
UserProgramRegisterParamsDict,
24+
)
25+
from vacancy.tasks import send_email
2126

2227
User = get_user_model()
2328

@@ -103,7 +108,7 @@ def post(self, request, *args, **kwargs):
103108
"onboarding_stage": None, # bypass onboarding
104109
"verification_date": timezone.now(), # bypass ClickUp verification
105110
**{field_name: data.get(field_name, "") for field_name in user_fields},
106-
}
111+
},
107112
)
108113
if created: # Only when registering a new user.
109114
user.set_password(password)
@@ -123,6 +128,16 @@ def post(self, request, *args, **kwargs):
123128
data={"detail": "User has already registered in this program."},
124129
status=status.HTTP_400_BAD_REQUEST,
125130
)
131+
132+
send_email.delay(
133+
UserProgramRegisterParamsDict(
134+
message_type=MessageTypeEnum.REGISTERED_PROGRAM_USER.value,
135+
user_id=user.id,
136+
program_name=program.name,
137+
program_id=program.id,
138+
schema_id=2,
139+
)
140+
)
126141
return Response(status=status.HTTP_201_CREATED)
127142

128143
def get(self, request, *args, **kwargs):
@@ -134,7 +149,7 @@ class PartnerProgramRegister(generics.GenericAPIView):
134149
Register user to program and save additional program data
135150
"""
136151

137-
queryset = PartnerProgram.objects.none()
152+
queryset = PartnerProgram.objects.all()
138153
permission_classes = [IsAuthenticated]
139154
serializer_class = PartnerProgramUserSerializer
140155

@@ -156,6 +171,16 @@ def post(self, request, *args, **kwargs):
156171
)
157172
added_user_profile.save()
158173

174+
send_email.delay(
175+
UserProgramRegisterParamsDict(
176+
message_type=MessageTypeEnum.REGISTERED_PROGRAM_USER.value,
177+
user_id=user_to_add.id,
178+
program_name=program.name,
179+
program_id=program.id,
180+
schema_id=2,
181+
)
182+
)
183+
159184
return Response(status=status.HTTP_201_CREATED)
160185
except PartnerProgram.DoesNotExist:
161186
return Response(status=status.HTTP_404_NOT_FOUND)

vacancy/mapping.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from enum import Enum
22
from typing import Literal, TypeAlias, TypedDict, Annotated
33

4-
EmailTextTypes: TypeAlias = Literal["accepted", "outdated", "responded", "rejected"]
4+
EmailTextTypes: TypeAlias = Literal[
5+
"accepted", "outdated", "responded", "rejected", "registered_program"
6+
]
57

68

79
class MessageTypeEnum(Enum):
@@ -10,61 +12,81 @@ class MessageTypeEnum(Enum):
1012
RESPONDED = "responded"
1113
REJECTED = "rejected"
1214

15+
REGISTERED_PROGRAM_USER = "registered_program"
1316

14-
class CeleryEmailParamsDict(TypedDict):
17+
18+
class BaseEmailCeleryParamsDict(TypedDict):
1519
message_type: EmailTextTypes
1620
user_id: int
21+
schema_id: int # = 2
22+
23+
24+
class CeleryEmailParamsDict(BaseEmailCeleryParamsDict):
1725
project_name: str
1826
project_id: int
1927
vacancy_role: str
20-
schema_id: int # = 2
28+
29+
30+
class UserProgramRegisterParamsDict(BaseEmailCeleryParamsDict):
31+
program_name: str
32+
program_id: int
2133

2234

2335
message_type_to_button_text: dict[Annotated[str, EmailTextTypes], str] = {
2436
MessageTypeEnum.ACCEPTED.value: "Посмотреть на проект",
2537
MessageTypeEnum.RESPONDED.value: "Посмотреть на отклики",
2638
MessageTypeEnum.OUTDATED.value: "Посмотреть на вакансию",
2739
MessageTypeEnum.REJECTED.value: "Посмотреть на проект",
40+
MessageTypeEnum.REGISTERED_PROGRAM_USER.value: "Посмотреть на программу",
2841
}
2942

3043
message_type_to_title: dict[Annotated[str, EmailTextTypes], str] = {
3144
MessageTypeEnum.ACCEPTED.value: "На ваш отклик ответили",
3245
MessageTypeEnum.RESPONDED.value: "На вашу вакансию откликнулись",
3346
MessageTypeEnum.OUTDATED.value: "У вашей вакансии истёк срок годности",
3447
MessageTypeEnum.REJECTED.value: "На ваш отклик ответили отказом",
48+
MessageTypeEnum.REGISTERED_PROGRAM_USER.value: "Вы зарегистрировались на программу",
3549
}
3650

3751

38-
def get_link(data: CeleryEmailParamsDict):
52+
def get_link(data: CeleryEmailParamsDict | UserProgramRegisterParamsDict):
3953
match data["message_type"]:
40-
case "accepted":
54+
case MessageTypeEnum.ACCEPTED.value:
4155
return f"https://app.procollab.ru/office/projects/{data['project_id']}"
42-
case "responded":
56+
case MessageTypeEnum.RESPONDED.value:
4357
return (
4458
f"https://app.procollab.ru/office/projects/{data['project_id']}/responses"
4559
)
46-
case "outdated":
60+
case MessageTypeEnum.OUTDATED.value:
4761
return f"https://app.procollab.ru/office/projects/{data['project_id']}/edit"
48-
case "rejected":
62+
case MessageTypeEnum.REJECTED.value:
4963
return f"https://app.procollab.ru/office/projects/{data['project_id']}"
64+
case MessageTypeEnum.REGISTERED_PROGRAM_USER.value:
65+
return f"https://app.procollab.ru/office/program/{data['program_id']}"
5066

5167

52-
def create_text_for_email(data: CeleryEmailParamsDict) -> str:
68+
def create_text_for_email(
69+
data: CeleryEmailParamsDict | UserProgramRegisterParamsDict,
70+
) -> str:
5371
match data["message_type"]:
54-
case "accepted":
72+
case MessageTypeEnum.ACCEPTED.value:
5573
return f"""
5674
Ваш отклик на роль {data["vacancy_role"]} в проекте "{data["project_name"]}" не остался незамеченным.
5775
Вас готовы принять в команду!
5876
"""
59-
case "responded":
77+
case MessageTypeEnum.RESPONDED.value:
6078
return f"На вакансию {data['vacancy_role']} для проекта '{data['project_name']}' оставили отклик."
61-
case "outdated":
79+
case MessageTypeEnum.OUTDATED.value:
6280
return f"""
6381
У вакансии {data["vacancy_role"]} для проекта '{data["project_name"]}' истёк срок годности.\n
6482
Она более не будет показываться в поиске.
6583
"""
66-
case "rejected":
84+
case MessageTypeEnum.REJECTED.value:
6785
return f"""
6886
К сожалению, на ваш отклик на вакансию {data['vacancy_role']}
6987
для проекта '{data['project_name']}' ответили отказом.
7088
"""
89+
case MessageTypeEnum.REGISTERED_PROGRAM_USER.value:
90+
return f"""
91+
Вы успешно зарегистрировались на программу {data['program_name']}
92+
"""

0 commit comments

Comments
 (0)