From 90f1868bbc8886b6e912619d0a9e6fd0df6ec49f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 13 Apr 2020 11:15:06 +0200 Subject: [PATCH] misc: switch to class-based login/logout views (#41633) --- bijoe/templates/bijoe/login.html | 7 +++--- bijoe/views.py | 41 +++++++++++++++++++------------- tests/test_views.py | 3 +-- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/bijoe/templates/bijoe/login.html b/bijoe/templates/bijoe/login.html index 8760270..1fb12c8 100644 --- a/bijoe/templates/bijoe/login.html +++ b/bijoe/templates/bijoe/login.html @@ -1,9 +1,10 @@ {% extends "bijoe/base.html" %} +{% load i18n %} {% block content %}
- {% csrf_token %} - {{ form }} - +{% csrf_token %} +{{ form.as_p }} +
{% endblock %} diff --git a/bijoe/views.py b/bijoe/views.py index f2b3115..a7b6c95 100644 --- a/bijoe/views.py +++ b/bijoe/views.py @@ -21,12 +21,14 @@ from django.shortcuts import resolve_url from django.urls import reverse from django.views.generic import ListView, View from django.http import HttpResponse, HttpResponseRedirect +from django.utils.decorators import method_decorator from django.utils.http import quote from django.utils.translation import ugettext as _ from django.contrib.auth import logout as auth_logout from django.contrib.auth import views as auth_views from django.contrib.auth.views import redirect_to_login from django.core.exceptions import PermissionDenied +from django.views.decorators.cache import never_cache try: from mellon.utils import get_idps @@ -96,21 +98,28 @@ homepage = HomepageView.as_view() menu_json = MenuJSONView.as_view() -def login(request, *args, **kwargs): - if any(get_idps()): - if not 'next' in request.GET: - return HttpResponseRedirect(resolve_url('mellon_login')) - return HttpResponseRedirect(resolve_url('mellon_login') + '?next=' - + quote(request.GET.get('next'))) - return auth_views.login(request, template_name='bijoe/login.html') +class LoginView(auth_views.LoginView): + template_name = 'bijoe/login.html' + + def get(self, request, *args, **kwargs): + if any(get_idps()): + if 'next' not in request.GET: + return HttpResponseRedirect(resolve_url('mellon_login')) + return HttpResponseRedirect( + resolve_url('mellon_login') + '?next=' + quote(request.GET.get('next')) + ) + return super(LoginView, self).get(request, *args, **kwargs) -def logout(request, next_page=None): - if any(get_idps()): - return HttpResponseRedirect(resolve_url('mellon_logout')) - auth_logout(request) - if next_page is not None: - next_page = resolve_url(next_page) - else: - next_page = '/' - return HttpResponseRedirect(next_page) +login = LoginView.as_view() + + +class LogoutView(auth_views.LogoutView): + @method_decorator(never_cache) + def dispatch(self, request, *args, **kwargs): + if any(get_idps()): + return HttpResponseRedirect(resolve_url('mellon_logout')) + return super(LogoutView, self).dispatch(request, *args, **kwargs) + + +logout = LogoutView.as_view() diff --git a/tests/test_views.py b/tests/test_views.py index 9952823..42a66ce 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -61,8 +61,7 @@ def test_superuser(app, admin): assert 'foo([{' in resp.text app.get('/', status=200) app.get('/visualization/', status=200) - resp = app.get('/accounts/logout/', status=302) - assert resp.location == '/' + resp = app.get('/accounts/logout/', status=(200, 302)) def test_visualizations_json_api(schema1, app, admin, settings):