Merge pull request #772 from alatja/login-url

Support for custom login by setting LOGIN_URL
This commit is contained in:
Garret Wassermann 2019-08-27 13:07:58 -04:00 committed by GitHub
commit 511f45d200
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 70 additions and 3 deletions

View File

@ -0,0 +1,45 @@
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')
@override_settings(LOGIN_URL='admin:login', SITE_ID=1)
def test_custom_login_view_with_name(self):
"""Test that LOGIN_URL can be a view name"""
response = self.client.get(reverse('helpdesk:login'))
home_url = reverse('helpdesk:home')
expected = reverse('admin:login') + "?next=" + home_url
self.assertRedirects(response, expected)

View File

@ -1,5 +1,7 @@
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^helpdesk/', include('helpdesk.urls', namespace='helpdesk')),
url(r'^admin/', admin.site.urls),
]

View File

@ -13,7 +13,7 @@ from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView
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):
@ -185,8 +185,7 @@ urlpatterns += [
urlpatterns += [
url(r'^login/$',
auth_views.LoginView.as_view(
template_name='helpdesk/registration/login.html'),
login.login,
name='login'),
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)