Browse Source

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

Samir Shah 5 years ago
parent
commit
0ee07dddff

+ 1 - 0
CHANGELOG.txt

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

+ 1 - 0
docs/releases/2.7.rst

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

+ 8 - 2
wagtail/core/templatetags/wagtailcore_tags.py

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

+ 17 - 0
wagtail/core/tests/tests.py

@@ -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']