Skip to content

Commit

Permalink
Merge pull request #772 from alatja/login-url
Browse files Browse the repository at this point in the history
Support for custom login by setting LOGIN_URL
  • Loading branch information
gwasser committed Aug 27, 2019
2 parents b41f95f + e9fc53d commit 511f45d
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 3 deletions.
45 changes: 45 additions & 0 deletions helpdesk/tests/test_login.py
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 2 additions & 0 deletions helpdesk/tests/urls.py
Original file line number Diff line number Diff line change
@@ -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),
]
5 changes: 2 additions & 3 deletions helpdesk/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
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):
Expand Down Expand Up @@ -185,8 +185,7 @@ def get_context_data(self, **kwargs):

urlpatterns += [
url(r'^login/$',
auth_views.LoginView.as_view(
template_name='helpdesk/registration/login.html'),
login.login,
name='login'),

url(r'^logout/$',
Expand Down
21 changes: 21 additions & 0 deletions helpdesk/views/login.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 511f45d

Please sign in to comment.