misc: switch to class-based login/logout views (#41633)

This commit is contained in:
Frédéric Péters 2020-04-13 11:15:06 +02:00
parent 0729b3fb62
commit 90f1868bbc
3 changed files with 30 additions and 21 deletions

View File

@ -1,9 +1,10 @@
{% extends "bijoe/base.html" %}
{% load i18n %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" name="Login"/>
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="{% trans 'Log in' %}" />
</form>
{% endblock %}

View File

@ -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()

View File

@ -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):