Fix pageurl and slugurl handling of situations where request.site is null (#5501)

pull/5446/head^2
Samir Shah 2019-08-14 05:53:04 +03:00 zatwierdzone przez Matt Westcott
rodzic 7c3418f99e
commit 0ee07dddff
4 zmienionych plików z 27 dodań i 2 usunięć

Wyświetl plik

@ -16,6 +16,7 @@ Changelog
* Fix: Middleware responses during page preview are now properly returned to the user (Matt Westcott)
* Fix: Default text of page links in rich text uses the public page title rather than the admin display title (Andy Chosak)
* Fix: Specific page permission checks are now enforced when viewing a page revision (Andy Chosak)
* Fix: `pageurl` and `slugurl` tags no longer fail when `request.site` is `None` (Samir Shah)
2.6.1 (05.08.2019)

Wyświetl plik

@ -34,6 +34,7 @@ Bug fixes
* Middleware responses during page preview are now properly returned to the user (Matt Westcott)
* Default text of page links in rich text uses the public page title rather than the admin display title (Andy Chosak)
* Specific page permission checks are now enforced when viewing a page revision (Andy Chosak)
* ``pageurl`` and ``slugurl`` tags no longer fail when ``request.site`` is ``None`` (Samir Shah)
Upgrade considerations

Wyświetl plik

@ -31,6 +31,10 @@ def pageurl(context, page, fallback=None):
# request.site not available in the current context; fall back on page.url
return page.url
if current_site is None:
# request.site is set to None; fall back on page.url
return page.url
# Pass page.relative_url the request object, which may contain a cached copy of
# Site.get_site_root_paths()
# This avoids page.relative_url having to make a database/cache fetch for this list
@ -48,13 +52,15 @@ def slugurl(context, slug):
that matches the slug on any site.
"""
page = None
try:
current_site = context['request'].site
except (KeyError, AttributeError):
# No site object found - allow the fallback below to take place.
page = None
pass
else:
page = Page.objects.in_site(current_site).filter(slug=slug).first()
if current_site is not None:
page = Page.objects.in_site(current_site).filter(slug=slug).first()
# If no page is found, fall back to searching the whole tree.
if page is None:

Wyświetl plik

@ -48,6 +48,16 @@ class TestPageUrlTags(TestCase):
result = tpl.render(template.Context({'page': page, 'request': HttpRequest()}))
self.assertIn('<a href="/events/">Events</a>', result)
def test_pageurl_with_null_site_in_request(self):
page = Page.objects.get(url_path='/home/events/')
tpl = template.Template('''{% load wagtailcore_tags %}<a href="{% pageurl page %}">{{ page.title }}</a>''')
# 'request' object in context, but site is None
request = HttpRequest()
request.site = None
result = tpl.render(template.Context({'page': page, 'request': request}))
self.assertIn('<a href="/events/">Events</a>', result)
def test_bad_pageurl(self):
tpl = template.Template('''{% load wagtailcore_tags %}<a href="{% pageurl page %}">{{ page.title }}</a>''')
@ -96,6 +106,13 @@ class TestPageUrlTags(TestCase):
result = slugurl(template.Context({'request': HttpRequest()}), 'events')
self.assertEqual(result, '/events/')
def test_slugurl_with_null_site_in_request(self):
# 'request' object in context, but site is None
request = HttpRequest()
request.site = None
result = slugurl(template.Context({'request': request}), 'events')
self.assertEqual(result, '/events/')
class TestSiteRootPathsCache(TestCase):
fixtures = ['test.json']