diff --git a/src/apps/profiles/backends.py b/src/apps/profiles/backends.py new file mode 100644 index 000000000..dd5cdd502 --- /dev/null +++ b/src/apps/profiles/backends.py @@ -0,0 +1,24 @@ +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 diff --git a/src/apps/profiles/forms.py b/src/apps/profiles/forms.py index c2b0b43cc..625b775c4 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) 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..8abbf94b2 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,33 @@ 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/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 = ( 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 @@