Skip to content

Commit e5bedca

Browse files
committed
chore(passport): add reactive
1 parent 9a54022 commit e5bedca

6 files changed

Lines changed: 42 additions & 19 deletions

File tree

rootfs/api/forms.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from django.utils.translation import gettext_lazy as _
2+
from django.core.exceptions import ValidationError
3+
from django.contrib.auth.forms import AuthenticationForm as _AuthenticationForm
4+
5+
from api.utils import send_activation_email
6+
7+
8+
class AuthenticationForm(_AuthenticationForm):
9+
10+
def confirm_login_allowed(self, user):
11+
if not user.is_active and user.last_login is None:
12+
send_activation_email(self.request, user)
13+
raise ValidationError(
14+
_('The account is not activated, please check the activation email.'),
15+
code="inactive",
16+
)
17+
return super().confirm_login_allowed(user)

rootfs/api/settings/production.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@
105105
'django.contrib.humanize',
106106
# Third-party apps
107107
'corsheaders',
108-
'guardian',
109108
'gunicorn',
110109
'rest_framework',
111110
'oauth2_provider',
@@ -117,8 +116,7 @@
117116
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
118117

119118
AUTHENTICATION_BACKENDS = (
120-
"django.contrib.auth.backends.ModelBackend",
121-
"guardian.backends.ObjectPermissionBackend",
119+
"django.contrib.auth.backends.AllowAllUsersModelBackend",
122120
)
123121

124122
ANONYMOUS_USER_ID = -1

rootfs/api/templates/user/login.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{% load static %}
2-
32
<link rel="stylesheet" href="{% static 'css/main.css' %}" type="text/css">
43
<head>
54
<meta charset="UTF-8">
@@ -13,7 +12,11 @@ <h2 class="h3">Log in to your account</h2>
1312
<form method="post" action="{% url 'user_login' %}">
1413
{% csrf_token %}
1514
{% if form.errors %}
16-
<div class="alert alert-danger">There was a problem with your login.</div>
15+
{% for error in form.non_field_errors %}
16+
<div class="alert alert-danger">
17+
<strong>{{ error|escape }}</strong>
18+
</div>
19+
{% endfor %}
1720
{% endif %}
1821
<div class="form-group">
1922
<label for="username">{{ form.username.label_tag }}</label>

rootfs/api/utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import six
66
import datetime
77

8+
from django.utils.encoding import force_bytes
9+
from django.template.loader import render_to_string
10+
from django.utils.http import urlsafe_base64_encode
811
from django.contrib.auth.tokens import PasswordResetTokenGenerator
912
from django.shortcuts import render
1013

@@ -48,6 +51,18 @@ def get_local_host(request):
4851
return uri[0:uri.find(request.path)]
4952

5053

54+
def send_activation_email(request, user):
55+
domain = get_local_host(request)
56+
mail_subject = 'Activate your account.'
57+
message = render_to_string(
58+
'user/account_activation_email.html', {
59+
'user': user,
60+
'domain': domain,
61+
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
62+
'token': token_generator.make_token(user),
63+
})
64+
user.email_user(mail_subject, message, fail_silently=True)
65+
5166
if __name__ == "__main__":
5267
import doctest
5368

rootfs/api/views.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@
2525
from rest_framework.viewsets import ModelViewSet
2626

2727
from api import serializers
28+
from api.forms import AuthenticationForm
2829
from api.exceptions import ServiceUnavailable, DryccException
2930
from api.serializers import RegistrationForm
30-
from api.utils import token_generator, get_local_host
31+
from api.utils import token_generator, get_local_host, send_activation_email
3132
from api.viewset import NormalUserViewSet
3233

3334
User = get_user_model()
@@ -81,19 +82,9 @@ def post(self, request, *args, **kwargs):
8182
self.object = None
8283
if form.is_valid():
8384
user = form.save(commit=False)
84-
user.is_staff = False
8585
user.is_active = False
8686
user.save()
87-
domain = get_local_host(request)
88-
mail_subject = 'Activate your account.'
89-
message = render_to_string(
90-
'user/account_activation_email.html', {
91-
'user': user,
92-
'domain': domain,
93-
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
94-
'token': token_generator.make_token(user),
95-
})
96-
user.email_user(mail_subject, message, fail_silently=True)
87+
send_activation_email(request, user)
9788
messages.success(request, (
9889
'Please Confirm your email to complete registration.'))
9990
return self.form_valid(form)
@@ -117,7 +108,6 @@ def get(self, request, uidb64, token, *args, **kwargs):
117108
if user is not None and token_generator.check_token(
118109
user, token):
119110
user.is_active = True
120-
user.is_staff = True
121111
user.save()
122112
login(request, user, backend='django.contrib.auth.backends.ModelBackend')
123113
messages.success(request, 'Your account have been confirmed.')
@@ -139,6 +129,7 @@ class ActivateAccountFailView(TemplateView):
139129

140130

141131
class UserLoginView(views.LoginView):
132+
form_class = AuthenticationForm
142133
extra_context = {
143134
"registration_enabled": settings.REGISTRATION_ENABLED,
144135
"password_reset_enabled": True if settings.EMAIL_HOST else False,

rootfs/requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
django==3.2.5
33
django-auth-ldap==3.0.0
44
django-cors-headers==3.7.0
5-
django-guardian==2.4.0
65
djangorestframework==3.12.4
76
gunicorn==20.1.0
87
psycopg2-binary==2.9.1

0 commit comments

Comments
 (0)