Skip to content

Commit 2016a83

Browse files
committed
Update save method and use transaction on email sending logic
1 parent 0940c2e commit 2016a83

File tree

5 files changed

+26
-19
lines changed

5 files changed

+26
-19
lines changed

docker-compose.yml

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ x-server: &base_server_setup
2222
APP_HTTP_PROTOCOL: ${APP_HTTP_PROTOCOL:-http}
2323
SESSION_COOKIE_DOMAIN: ${SESSION_COOKIE_DOMAIN:-localhost}
2424
#Email
25-
EMAIL_BACKEND : ${EMAIL_BACKEND:-SMTP}
2625
DEFAULT_FROM_EMAIL : ${DEFAULT_FROM_EMAIL:-fake}
2726
EMAIL_HOST : ${EMAIL_HOST:-fake}
2827
EMAIL_PORT : ${EMAIL_PORT:-1025}

main/settings.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@
7979
CELERY_RESULT_SERIALIZER=(str, "json"),
8080
CELERY_TIMEZONE=(str, "UTC"),
8181
# Email
82-
EMAIL_BACKEND=str,
83-
# -- SMTP
82+
EMAIL_BACKEND=(str, "django.core.mail.backends.smtp.EmailBackend"),
8483
EMAIL_HOST=str,
8584
EMAIL_USE_SSL=(bool, False),
8685
EMAIL_PORT=int,
@@ -333,9 +332,8 @@
333332
STATIC_ROOT = env("DJANGO_STATIC_ROOT")
334333
MEDIA_ROOT = env("DJANGO_MEDIA_ROOT")
335334
# Email
336-
EMAIL_BACKEND = env("EMAIL_BACKEND").upper()
337335
if env("EMAIL_HOST_USER"):
338-
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
336+
EMAIL_BACKEND = env("EMAIL_BACKEND")
339337
EMAIL_HOST = env("EMAIL_HOST")
340338
EMAIL_PORT = env("EMAIL_PORT")
341339
EMAIL_HOST_USER = env("EMAIL_HOST_USER")

user/serializers.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88

99
from main.token import TokenManager
1010
from user.models import User
11-
from user.tasks import resend_account_activation_task, send_account_creation_email_task
12-
from user.utils import send_password_reset_email
11+
from user.tasks import (
12+
resend_account_activation_task,
13+
send_account_creation_email_task,
14+
send_password_reset_email_task,
15+
)
1316

1417

1518
class LoginSerializer(serializers.Serializer):
@@ -97,7 +100,7 @@ def save(self, **_):
97100
user.department = self.validated_data["department"]
98101
user.set_password(self.validated_data["password"])
99102
user.is_active = True
100-
user.save()
103+
user.save(update_fields=("first_name", "last_name", "department", "password", "is_active"))
101104
return user
102105

103106

@@ -117,7 +120,7 @@ def validate(self, attrs):
117120
def save(self, **_):
118121
assert isinstance(self.validated_data, dict)
119122
user_id = self.validated_data["user_id"]
120-
resend_account_activation_task.delay(user_id)
123+
transaction.on_commit(lambda: resend_account_activation_task.delay(user_id))
121124

122125

123126
class UserActivationSerializer(serializers.Serializer):
@@ -164,13 +167,13 @@ def validate(self, attrs):
164167
raise serializers.ValidationError(gettext("User with that email doesn't exists!!"))
165168
return {
166169
**attrs,
167-
"user": user,
170+
"user_id": user.id,
168171
}
169172

170173
def save(self, **_):
171174
assert isinstance(self.validated_data, dict)
172-
user = self.validated_data["user"]
173-
send_password_reset_email(user=user)
175+
user_id = self.validated_data["user_id"]
176+
transaction.on_commit(lambda: send_password_reset_email_task.delay(user_id))
174177

175178

176179
class UserPasswordResetConfirmSerializer(serializers.Serializer):

user/tasks.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
from django.contrib.auth import get_user_model
55
from django.shortcuts import get_object_or_404
66

7-
from user.utils import resend_account_activation, send_account_creation_email
7+
from user.utils import (
8+
resend_account_activation,
9+
send_account_creation_email,
10+
send_password_reset_email,
11+
)
812

913
User = get_user_model()
1014

@@ -28,3 +32,10 @@ def resend_account_activation_task(user_id):
2832
f"Invitation resent to {user.email}"
2933
else:
3034
logger.error(f"User with this {user.email} is already active")
35+
36+
37+
@shared_task
38+
def send_password_reset_email_task(user_id):
39+
user = get_object_or_404(User, id=user_id)
40+
send_password_reset_email(user)
41+
logger.info(f"Password reset email sent to {user.email}")

user/utils.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,10 @@
55

66
from main.permalink import Permalink
77
from main.token import TokenManager
8-
from user.models import User
98

109

1110
def send_account_creation_email(user):
12-
# user = User.objects.filter(id=user_id).first() # Fetch the user instance
13-
# if not user:
14-
# print(f"User with ID {user_id} not found")
15-
# return
11+
1612
uid = urlsafe_base64_encode(force_bytes(user.pk))
1713
token = TokenManager.account_registration_token_generator.make_token(user)
1814
activation_url = Permalink.user_activation(uid, token)
@@ -33,7 +29,7 @@ def resend_account_activation(user):
3329
send_mail(subject, message, settings.EMAIL_HOST_USER, [user.email])
3430

3531

36-
def send_password_reset_email(user: User):
32+
def send_password_reset_email(user):
3733

3834
uid = urlsafe_base64_encode(force_bytes(user.pk))
3935
token = TokenManager.password_reset_token_generator.make_token(user)

0 commit comments

Comments
 (0)