From 6f06ea547a5d8798545afe5ec19beafc0c3187a5 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Sat, 22 Apr 2023 20:58:42 +0500 Subject: [PATCH 1/4] login with email added --- src/apps/profiles/backends.py | 31 ++++++++++++++++++++++++++ src/apps/profiles/forms.py | 6 +++++ src/apps/profiles/urls_accounts.py | 3 ++- src/apps/profiles/views.py | 32 +++++++++++++++++++++++++-- src/templates/registration/login.html | 2 +- 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/apps/profiles/backends.py diff --git a/src/apps/profiles/backends.py b/src/apps/profiles/backends.py new file mode 100644 index 000000000..74cf22693 --- /dev/null +++ b/src/apps/profiles/backends.py @@ -0,0 +1,31 @@ +from django.contrib.auth.backends import ModelBackend +from django.core.exceptions import ObjectDoesNotExist +from django.contrib.auth import get_user_model + +User = get_user_model() + + +class EmailAuthenticationBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + try: + user = User.objects.get(email=username) + if user.check_password(password): + return user + else: + return None + except ObjectDoesNotExist: + return None + + + def get_user(self, user_id): + try: + user = User.objects.get(id=user_id) + return user + except ObjectDoesNotExist: + return None + + +AUTHENTICATION_BACKENDS = ( + "django.contrib.auth.backends.ModelBackend", + "profile.backends.EmailAuthenticationBackend" +) \ No newline at end of file diff --git a/src/apps/profiles/forms.py b/src/apps/profiles/forms.py index c2b0b43cc..f7c9ade63 100644 --- a/src/apps/profiles/forms.py +++ b/src/apps/profiles/forms.py @@ -23,3 +23,9 @@ class Meta: model = User fields = ("username", "email", "password1", "password2") + + +class LoginForm(forms.Form): + + username = forms.CharField(max_length=150) + password = forms.CharField(max_length=150, widget=forms.PasswordInput) \ No newline at end of file diff --git a/src/apps/profiles/urls_accounts.py b/src/apps/profiles/urls_accounts.py index 86321d24e..03acf8254 100644 --- a/src/apps/profiles/urls_accounts.py +++ b/src/apps/profiles/urls_accounts.py @@ -7,9 +7,10 @@ urlpatterns = [ url(r'^signup', views.sign_up, name="signup"), + path('login/', views.log_in, name='login'), # url(r'^user_profile', views.user_profile, name="user_profile"), # path('login/', auth_views.LoginView.as_view(extra_context=extra_context), name='login'), - path('login/', views.LoginView.as_view(), name='login'), + # path('login/', views.LoginView.as_view(), name='login'), # path('logout/', auth_views.LogoutView.as_view(), name='logout'), path('logout/', views.LogoutView.as_view(), name='logout'), path('password_reset/', views.CustomPasswordResetView.as_view(), name='password_reset'), diff --git a/src/apps/profiles/views.py b/src/apps/profiles/views.py index fe02bdee9..18cacb9a2 100644 --- a/src/apps/profiles/views.py +++ b/src/apps/profiles/views.py @@ -3,7 +3,7 @@ from django.conf import settings from django.contrib import messages -from django.contrib.auth import authenticate +from django.contrib.auth import authenticate, login from django.contrib.sites.shortcuts import get_current_site from django.core.mail import EmailMessage, EmailMultiAlternatives from django.http import Http404 @@ -18,7 +18,7 @@ from api.serializers.profiles import UserSerializer, OrganizationDetailSerializer, OrganizationEditSerializer, \ UserNotificationSerializer -from .forms import SignUpForm +from .forms import SignUpForm, LoginForm from .models import User, Organization, Membership from .tokens import account_activation_token @@ -128,6 +128,34 @@ def sign_up(request): return render(request, 'registration/signup.html', context) +def log_in(request): + + context = {} + context['chahub_signup_url'] = "{}/profiles/signup?next={}/social/login/chahub".format( + settings.SOCIAL_AUTH_CHAHUB_BASE_URL, + settings.SITE_DOMAIN + ) + if request.method == 'POST': + form = LoginForm(request.POST) + + if form.is_valid(): + username = form.cleaned_data.get('username') + password = form.cleaned_data.get('password') + user = authenticate(username=username, password=password) + if user: + login(request, user) + return redirect('pages:home') + else: + messages.error(request, "Wrong Credentials!") + else: + context['form'] = form + + if not context.get('form'): + context['form'] = LoginForm() + return render(request, 'registration/login.html', context) + + + # Password Reset views/forms below # auth_forms class CustomPasswordResetForm(auth_forms.PasswordResetForm): diff --git a/src/templates/registration/login.html b/src/templates/registration/login.html index f4b802cb2..55d8f10cf 100644 --- a/src/templates/registration/login.html +++ b/src/templates/registration/login.html @@ -24,7 +24,7 @@

Date: Tue, 25 Apr 2023 20:44:34 +0500 Subject: [PATCH 2/4] User can login through email and username --- src/settings/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/settings/base.py b/src/settings/base.py index 79e1d2381..64ab54589 100644 --- a/src/settings/base.py +++ b/src/settings/base.py @@ -117,6 +117,7 @@ 'utils.oauth_backends.ChahubOAuth2', 'django.contrib.auth.backends.ModelBackend', 'django_su.backends.SuBackend', + 'profiles.backends.EmailAuthenticationBackend', ) SOCIAL_AUTH_PIPELINE = ( From 2ccbb9ac01e6ad18dff5974ca82bf7a704619673 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Tue, 25 Apr 2023 20:45:45 +0500 Subject: [PATCH 3/4] extra code removed --- src/apps/profiles/backends.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/apps/profiles/backends.py b/src/apps/profiles/backends.py index 74cf22693..aa2693d4f 100644 --- a/src/apps/profiles/backends.py +++ b/src/apps/profiles/backends.py @@ -23,9 +23,3 @@ def get_user(self, user_id): return user except ObjectDoesNotExist: return None - - -AUTHENTICATION_BACKENDS = ( - "django.contrib.auth.backends.ModelBackend", - "profile.backends.EmailAuthenticationBackend" -) \ No newline at end of file From 42bfc5c929267c9942117aa4019c14b20658f63f Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Tue, 25 Apr 2023 21:02:18 +0500 Subject: [PATCH 4/4] linebreaks and whitespaces removed --- src/apps/profiles/backends.py | 3 +-- src/apps/profiles/forms.py | 4 ++-- src/apps/profiles/views.py | 7 +++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/apps/profiles/backends.py b/src/apps/profiles/backends.py index aa2693d4f..dd5cdd502 100644 --- a/src/apps/profiles/backends.py +++ b/src/apps/profiles/backends.py @@ -12,11 +12,10 @@ def authenticate(self, request, username=None, password=None, **kwargs): if user.check_password(password): return user else: - return None + return None except ObjectDoesNotExist: return None - def get_user(self, user_id): try: user = User.objects.get(id=user_id) diff --git a/src/apps/profiles/forms.py b/src/apps/profiles/forms.py index f7c9ade63..625b775c4 100644 --- a/src/apps/profiles/forms.py +++ b/src/apps/profiles/forms.py @@ -26,6 +26,6 @@ class Meta: class LoginForm(forms.Form): - + username = forms.CharField(max_length=150) - password = forms.CharField(max_length=150, widget=forms.PasswordInput) \ No newline at end of file + password = forms.CharField(max_length=150, widget=forms.PasswordInput) diff --git a/src/apps/profiles/views.py b/src/apps/profiles/views.py index 18cacb9a2..8abbf94b2 100644 --- a/src/apps/profiles/views.py +++ b/src/apps/profiles/views.py @@ -137,7 +137,7 @@ def log_in(request): ) if request.method == 'POST': form = LoginForm(request.POST) - + if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') @@ -149,12 +149,11 @@ def log_in(request): messages.error(request, "Wrong Credentials!") else: context['form'] = form - + if not context.get('form'): context['form'] = LoginForm() return render(request, 'registration/login.html', context) - - + # Password Reset views/forms below # auth_forms