Add support for custom login handler

The custom login handler can be configured by setting the
settings.LOGIN_URL variable. If LOGIN_URL is None or 'helpdesk:login',
the app uses the default helpdesk login system. LOGIN_URL can be a view
name or raw url.
This commit is contained in:
Janne Alatalo 2019-08-22 15:16:51 +03:00
parent b41f95fd7e
commit 0a43b9a160
3 changed files with 60 additions and 3 deletions

View File

@ -0,0 +1,37 @@
from django.test import TestCase, override_settings
from django.urls import reverse
class TestLoginRedirect(TestCase):
@override_settings(LOGIN_URL='/custom/login/')
def test_custom_login_view_with_url(self):
"""Test login redirect when LOGIN_URL is set to custom url"""
response = self.client.get(reverse('helpdesk:login'))
# We expect that that helpdesk:home url is passed as next parameter in
# the redirect url, so that the custom login can redirect the browser
# back to helpdesk after the login.
home_url = reverse('helpdesk:home')
expected = '/custom/login/?next={}'.format(home_url)
self.assertRedirects(response, expected, fetch_redirect_response=False)
@override_settings(LOGIN_URL='/custom/login/')
def test_custom_login_next_param(self):
"""Test that the next url parameter is correctly relayed to custom login"""
next_param = "/redirect/back"
url = reverse('helpdesk:login') + "?next=" + next_param
response = self.client.get(url)
expected = '/custom/login/?next={}'.format(next_param)
self.assertRedirects(response, expected, fetch_redirect_response=False)
@override_settings(LOGIN_URL='helpdesk:login', SITE_ID=1)
def test_default_login_view(self):
"""Test that default login is used when LOGIN_URL is helpdesk:login"""
response = self.client.get(reverse('helpdesk:login'))
self.assertTemplateUsed(response, 'helpdesk/registration/login.html')
@override_settings(LOGIN_URL=None, SITE_ID=1)
def test_login_url_none(self):
"""Test that default login is used when LOGIN_URL is None"""
response = self.client.get(reverse('helpdesk:login'))
self.assertTemplateUsed(response, 'helpdesk/registration/login.html')

View File

@ -13,7 +13,7 @@ from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView from django.views.generic import TemplateView
from helpdesk import settings as helpdesk_settings from helpdesk import settings as helpdesk_settings
from helpdesk.views import feeds, staff, public, kb from helpdesk.views import feeds, staff, public, kb, login
class DirectTemplateView(TemplateView): class DirectTemplateView(TemplateView):
@ -185,8 +185,7 @@ urlpatterns += [
urlpatterns += [ urlpatterns += [
url(r'^login/$', url(r'^login/$',
auth_views.LoginView.as_view( login.login,
template_name='helpdesk/registration/login.html'),
name='login'), name='login'),
url(r'^logout/$', url(r'^logout/$',

21
helpdesk/views/login.py Normal file
View File

@ -0,0 +1,21 @@
from django.conf import settings
from django.contrib.auth import views as auth_views
from django.contrib.auth.views import redirect_to_login
from django.shortcuts import resolve_url
default_login_view = auth_views.LoginView.as_view(
template_name='helpdesk/registration/login.html')
def login(request):
login_url = settings.LOGIN_URL
# Prevent redirect loop by checking that LOGIN_URL is not this view's name
if login_url and login_url != request.resolver_match.view_name:
if 'next' in request.GET:
return_to = request.GET['next']
else:
return_to = resolve_url('helpdesk:home')
return redirect_to_login(return_to, login_url)
else:
return default_login_view(request)