Skip to content

Commit 8bf250d

Browse files
committed
Added request to backend by monkey patch.
Added get_context to email backend. Pass extra context to email template rendering
1 parent 0c29277 commit 8bf250d

4 files changed

Lines changed: 37 additions & 9 deletions

File tree

trench/backends/basic_mail.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,38 @@
1212
FailedDispatchResponse,
1313
SuccessfulDispatchResponse,
1414
)
15-
from trench.settings import EMAIL_HTML_TEMPLATE, EMAIL_PLAIN_TEMPLATE, EMAIL_SUBJECT
15+
from trench.settings import EMAIL_HTML_TEMPLATE, EMAIL_PLAIN_TEMPLATE, EMAIL_SUBJECT_TEMPLATE, EMAIL_SUBJECT
1616

1717

1818
class SendMailMessageDispatcher(AbstractMessageDispatcher):
1919
_KEY_MESSAGE = "message"
2020
_SUCCESS_DETAILS = _("Email message with MFA code has been sent.")
2121

22+
def get_context(self, request):
23+
return {}
24+
25+
def get_from_email(self, request):
26+
return settings.DEFAULT_FROM_EMAIL
27+
2228
def dispatch_message(self) -> DispatchResponse:
23-
context = {"code": self.create_code()}
29+
request = self.request
30+
context = self.get_context(request)
31+
context.update({"code": self.create_code()})
32+
email_subject = self._config[EMAIL_SUBJECT]
33+
email_subject_template = self._config[EMAIL_SUBJECT_TEMPLATE]
2434
email_plain_template = self._config[EMAIL_PLAIN_TEMPLATE]
2535
email_html_template = self._config[EMAIL_HTML_TEMPLATE]
36+
from_email = self.get_from_email(request)
37+
if not email_subject:
38+
email_subject = get_template(email_subject_template).render(context).replace('\n','')
39+
email_plain = get_template(email_plain_template).render(context)
40+
email_html = get_template(email_html_template).render(context)
2641
try:
2742
send_mail(
28-
subject=self._config.get(EMAIL_SUBJECT),
29-
message=get_template(email_plain_template).render(context),
30-
html_message=get_template(email_html_template).render(context),
31-
from_email=settings.DEFAULT_FROM_EMAIL,
43+
subject=email_subject,
44+
message=email_plain,
45+
html_message=email_html,
46+
from_email=from_email,
3247
recipient_list=(self._to,),
3348
fail_silently=False,
3449
)

trench/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def __getitem__(self, attr: str) -> Any:
4646
VALIDITY_PERIOD = "VALIDITY_PERIOD"
4747
VERBOSE_NAME = "VERBOSE_NAME"
4848
EMAIL_SUBJECT = "EMAIL_SUBJECT"
49+
EMAIL_SUBJECT_TEMPLATE = "EMAIL_SUBJECT_TEMPLATE"
4950
EMAIL_PLAIN_TEMPLATE = "EMAIL_PLAIN_TEMPLATE"
5051
EMAIL_HTML_TEMPLATE = "EMAIL_HTML_TEMPLATE"
5152
SMSAPI_ACCESS_TOKEN = "SMSAPI_ACCESS_TOKEN"
@@ -88,6 +89,7 @@ def __getitem__(self, attr: str) -> Any:
8889
HANDLER: "trench.backends.basic_mail.SendMailMessageDispatcher",
8990
SOURCE_FIELD: "email",
9091
EMAIL_SUBJECT: _("Your verification code"),
92+
EMAIL_SUBJECT_TEMPLATE: "trench/backends/email/code_subject.txt",
9193
EMAIL_PLAIN_TEMPLATE: "trench/backends/email/code.txt",
9294
EMAIL_HTML_TEMPLATE: "trench/backends/email/code.html",
9395
},
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% load i18n %}
2+
{% blocktrans %}
3+
Your verification code
4+
{% endblocktrans %}

trench/views/base.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ def post(self, request: Request) -> Response:
6565
try:
6666
mfa_model = get_mfa_model()
6767
mfa_method = mfa_model.objects.get_primary_active(user_id=user.id)
68-
get_mfa_handler(mfa_method=mfa_method).dispatch_message()
68+
mfa_methods = mfa_model.objects.list_active(user_id=user.id)
69+
mfa_backend = get_mfa_handler(mfa_method=mfa_method)
70+
mfa_backend.request = request
71+
mfa_backend.dispatch_message()
6972
return Response(
7073
data={
7174
"ephemeral_token": user_token_generator.make_token(user),
@@ -114,7 +117,9 @@ def post(request: Request, method: str) -> Response:
114117
)
115118
except MFAValidationError as cause:
116119
return ErrorResponse(error=cause)
117-
return get_mfa_handler(mfa_method=mfa).dispatch_message()
120+
mfa_backend = get_mfa_handler(mfa_method=mfa)
121+
mfa_backend.request = request
122+
return mfa_backend.dispatch_message()
118123

119124

120125
class MFAMethodConfirmActivationView(APIView):
@@ -221,7 +226,9 @@ def post(request: Request) -> Response:
221226
user_id=request.user.id
222227
)
223228
mfa = mfa_model.objects.get_by_name(user_id=request.user.id, name=method)
224-
return get_mfa_handler(mfa_method=mfa).dispatch_message()
229+
mfa_backend = get_mfa_handler(mfa_method=mfa)
230+
mfa_backend.request = request
231+
return mfa_backend.dispatch_message()
225232
except MFAValidationError as cause:
226233
return ErrorResponse(error=cause)
227234

0 commit comments

Comments
 (0)