From 88684dac43990078f37c133f762a5946f1a03cbe Mon Sep 17 00:00:00 2001 From: Pablo Moreno Date: Sat, 18 Jan 2025 20:07:55 +0100 Subject: [PATCH] feat: login redirection --- web/tests/test_login.py | 63 +++++++++++++++++++++++++++++++---------- web/views/users.py | 14 +++++---- web/views/web.py | 6 ++++ 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/web/tests/test_login.py b/web/tests/test_login.py index 4d39cb9..12d84ba 100644 --- a/web/tests/test_login.py +++ b/web/tests/test_login.py @@ -1,12 +1,11 @@ from django.contrib.auth import get_user_model from django.shortcuts import reverse -from rest_framework import status -from rest_framework.test import APITestCase +from django.test import TestCase User = get_user_model() -class TestLogin(APITestCase): +class TestLogin(TestCase): def setUp(self) -> None: self.password = "theonering" self.user = User.objects.create( @@ -26,12 +25,12 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") def test_login_get(self): response = self.client.get(reverse("web:login")) - assert response.status_code == status.HTTP_200_OK + assert response.status_code == 200 def test_login_already_logged_in(self): response = self.client.post( @@ -42,11 +41,11 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") response = self.client.get(reverse("web:login")) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") def test_login_failed(self): @@ -58,7 +57,7 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_400_BAD_REQUEST + assert response.status_code == 400 def test_login_then_logout(self): response = self.client.post( @@ -69,16 +68,16 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") response = self.client.post(reverse("web:logout")) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") def test_logout_already_logged_out(self): response = self.client.post(reverse("web:logout")) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") def test_login_then_get_logout(self): @@ -90,11 +89,11 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") response = self.client.get(reverse("web:logout")) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") def test_login_then_get_my_account(self): @@ -106,8 +105,42 @@ class TestLogin(APITestCase): }, ) - assert response.status_code == status.HTTP_302_FOUND + assert response.status_code == 302 assert response.url == reverse("web:index") response = self.client.get(reverse("web:my_account")) - assert response.status_code == status.HTTP_200_OK + assert response.status_code == 200 + + def test_login_redirection_to_my_account(self): + url = f'{reverse("web:login")}?next={reverse("web:my_account")}' + response = self.client.post( + url, + { + "username": self.user.username, + "password": self.password, + }, + ) + + assert response.status_code == 302 + assert response.url == f'{reverse("web:index")}?next={reverse("web:my_account")}' + + response = self.client.get(response.url) + assert response.status_code == 302 + assert response.url == reverse("web:my_account") + + def test_login_redirection_to_my_orders(self): + url = f'{reverse("web:login")}?next={reverse("web:orders")}' + response = self.client.post( + url, + { + "username": self.user.username, + "password": self.password, + }, + ) + + assert response.status_code == 302 + assert response.url == f'{reverse("web:index")}?next={reverse("web:orders")}' + + response = self.client.get(response.url) + assert response.status_code == 302 + assert response.url == reverse("web:orders") diff --git a/web/views/users.py b/web/views/users.py index bb01de1..d66b2fd 100644 --- a/web/views/users.py +++ b/web/views/users.py @@ -1,5 +1,3 @@ -import urllib - from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth import login as login_user @@ -32,8 +30,12 @@ class LoginView(View, RedirectionMixin): login_form_class = LoginForm def get_redirection(self): - query_param_string = urlencode(self.request.GET) - return f'{reverse(self.redirect_to)}?{query_param_string.join("")}' + next_page = self.request.GET.get('next', '') + + if next_page: + return f'{reverse(self.redirect_to)}?next={next_page}' + + return reverse(self.redirect_to) def get_login_form(self, request): return self.login_form_class(data=request.POST) @@ -42,7 +44,7 @@ class LoginView(View, RedirectionMixin): if request.user.is_authenticated: return redirect(self.get_redirection()) - settings = WebSettings.load() + web_settings = WebSettings.load() login_form = self.login_form_class() return render( @@ -50,7 +52,7 @@ class LoginView(View, RedirectionMixin): self.template_name, { "form": login_form, - "title": settings.web_title, + "title": web_settings.web_title, "description": _("inicio de sesión"), }, ) diff --git a/web/views/web.py b/web/views/web.py index d500980..0d3126a 100644 --- a/web/views/web.py +++ b/web/views/web.py @@ -35,6 +35,12 @@ class IndexView(TemplateView): "description": settings.web_description, } + def get(self, request, *args, **kwargs): + if self.request.GET.get('next'): + return redirect(self.request.GET.get('next')) + + return super().get(request, *args, **kwargs) + class CategoryView(TemplateView): template_name = "web/index.html"