diff --git a/apps/auth/forms.py b/apps/auth/forms.py index e369a8f9..0baea362 100644 --- a/apps/auth/forms.py +++ b/apps/auth/forms.py @@ -6,3 +6,8 @@ class LearnerRegistrationForm(forms.Form): last_name = forms.CharField() email = forms.EmailField() password = forms.CharField() + + +class LoginForm(forms.Form): + email = forms.CharField() + password = forms.CharField() diff --git a/apps/auth/templates/auth/login.html b/apps/auth/templates/auth/login.html new file mode 100644 index 00000000..e69de29b diff --git a/apps/auth/tests/test_login.py b/apps/auth/tests/test_login.py new file mode 100644 index 00000000..a1144f5c --- /dev/null +++ b/apps/auth/tests/test_login.py @@ -0,0 +1,20 @@ +from django.contrib.auth import get_user_model +from django.test import TestCase, Client +from django.urls import reverse + +User = get_user_model() + + +class LoginTest(TestCase): + def setUp(self): + self.url = reverse("lilcity:login") + self.user = User.objects.create_user(username='Alice', password='1234') + self.client = Client() + + def test_login(self): + response = self.client.post(self.url, {"username": self.user.username, "password": '1234'}) + self.assertTrue(response.json()['success']) + + def test_should_errors_if_fail_login(self): + response = self.client.post(self.url, {"username": self.user.username, "password": 'incorrect password'}) + self.assertFalse(response.json()['success']) diff --git a/apps/auth/urls.py b/apps/auth/urls.py index 8ea22d9b..27e5a38f 100644 --- a/apps/auth/urls.py +++ b/apps/auth/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = [ path('registration/learner/', views.LearnerRegistrationView.as_view(), name="registration-learner"), path('logout/', views.LogoutView.as_view(), name="logout"), + path('login/', views.LoginView.as_view(), name="login"), ] diff --git a/apps/auth/views.py b/apps/auth/views.py index ab6123f6..4dd37c3c 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -1,10 +1,10 @@ -from django.views.generic import FormView, View +from django.contrib.auth import get_user_model, logout, login +from django.contrib.auth.forms import AuthenticationForm from django.http import JsonResponse -from django.contrib.auth import get_user_model, logout +from django.views.generic import FormView, View from .forms import LearnerRegistrationForm - User = get_user_model() @@ -30,3 +30,15 @@ class LogoutView(View): def post(self, request, *args, **kwargs): logout(request) return JsonResponse({"success": True}) + + +class LoginView(FormView): + form_class = AuthenticationForm + template_name = "auth/login.html" + + def form_valid(self, form): + login(self.request, form.get_user()) + return JsonResponse({"success": True}) + + def form_invalid(self, form): + return JsonResponse({"success": False, "errors": form.errors.get_json_data(escape_html=True)}, status=400)