From d37ce9f699223d92c88fad93aad19a5e7f9ec998 Mon Sep 17 00:00:00 2001 From: Gassan Gousseinov Date: Sun, 24 Feb 2019 12:37:50 +0100 Subject: [PATCH] routablepageurl returns urls only for default site on multisite installation (#5102) --- CHANGELOG.txt | 1 + CONTRIBUTORS.rst | 1 + docs/releases/2.5.rst | 1 + .../templatetags/wagtailroutablepage_tags.py | 2 +- wagtail/contrib/routable_page/tests.py | 127 +++++++++++++++++- 5 files changed, 126 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 12b77dfddd..2ad30b3eb4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -18,6 +18,7 @@ Changelog * Fix: Rich text to contentstate conversion now ignores stray closing tags (frmdstryr) * Fix: Escape backslashes in `postgres_search` queries (Hammy Goonan) * Fix: Parent page link in page chooser search results no longer navigates away (Asanka Lihiniyagoda, Sævar Öfjörð Magnússon) + * Fix: `routablepageurl` tag now correctly omits domain part when multiple sites exist at the same root (Gassan Gousseinov) 2.4 (19.12.2018) diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index a368bc262b..4d11838d37 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -350,6 +350,7 @@ Contributors * damianosSemmle * Evan Winter * Neil Lyons +* Gassan Gousseinov Translators =========== diff --git a/docs/releases/2.5.rst b/docs/releases/2.5.rst index 8a1b0d7aac..278d042740 100644 --- a/docs/releases/2.5.rst +++ b/docs/releases/2.5.rst @@ -33,6 +33,7 @@ Bug fixes * Rich text to contentstate conversion now ignores stray closing tags (frmdstryr) * Escape backslashes in ``postgres_search`` queries (Hammy Goonan) * Parent page link in page chooser search results no longer navigates away (Asanka Lihiniyagoda, Sævar Öfjörð Magnússon) + * ``routablepageurl`` tag now correctly omits domain part when multiple sites exist at the same root (Gassan Gousseinov) Upgrade considerations diff --git a/wagtail/contrib/routable_page/templatetags/wagtailroutablepage_tags.py b/wagtail/contrib/routable_page/templatetags/wagtailroutablepage_tags.py index 53e4e3e9b0..08625b4297 100644 --- a/wagtail/contrib/routable_page/templatetags/wagtailroutablepage_tags.py +++ b/wagtail/contrib/routable_page/templatetags/wagtailroutablepage_tags.py @@ -18,7 +18,7 @@ def routablepageurl(context, page, url_name, *args, **kwargs): positional arguments and keyword arguments. """ request = context['request'] - base_url = page.relative_url(request.site) + base_url = page.relative_url(request.site, request) routed_url = page.reverse_subpage(url_name, args=args, kwargs=kwargs) if not base_url.endswith('/'): base_url += '/' diff --git a/wagtail/contrib/routable_page/tests.py b/wagtail/contrib/routable_page/tests.py index beff1100f9..67a21fe0e9 100644 --- a/wagtail/contrib/routable_page/tests.py +++ b/wagtail/contrib/routable_page/tests.py @@ -165,30 +165,147 @@ class TestRoutablePageTemplateTag(TestCase): def test_templatetag_reverse_index_route(self): url = routablepageurl(self.context, self.routable_page, 'index_route') - self.assertEqual(url, self.routable_page.url) + self.assertEqual(url, '/%s/' % self.routable_page.slug) def test_templatetag_reverse_archive_by_year_view(self): url = routablepageurl(self.context, self.routable_page, 'archive_by_year', '2014') - self.assertEqual(url, self.routable_page.url + 'archive/year/2014/') + self.assertEqual(url, '/%s/archive/year/2014/' % self.routable_page.slug) def test_templatetag_reverse_archive_by_author_view(self): url = routablepageurl(self.context, self.routable_page, 'archive_by_author', author_slug='joe-bloggs') - self.assertEqual(url, self.routable_page.url + 'archive/author/joe-bloggs/') + self.assertEqual(url, '/%s/archive/author/joe-bloggs/' % self.routable_page.slug) def test_templatetag_reverse_external_view(self): url = routablepageurl(self.context, self.routable_page, 'external_view', 'joe-bloggs') - self.assertEqual(url, self.routable_page.url + 'external/joe-bloggs/') + self.assertEqual(url, '/%s/external/joe-bloggs/' % self.routable_page.slug) def test_templatetag_reverse_external_view_without_append_slash(self): with mock.patch('wagtail.core.models.WAGTAIL_APPEND_SLASH', False): url = routablepageurl(self.context, self.routable_page, 'external_view', 'joe-bloggs') - expected = self.routable_page.url + '/' + 'external/joe-bloggs/' + expected = '/' + self.routable_page.slug + '/' + 'external/joe-bloggs/' + + self.assertEqual(url, expected) + + +class TestRoutablePageTemplateTagForSecondSiteAtSameRoot(TestCase): + """ + When multiple sites exist on the same root page, relative URLs within that subtree should + omit the domain, in line with #4390 + """ + def setUp(self): + default_site = Site.objects.get(is_default_site=True) + second_site = Site.objects.create( # add another site with the same root page + hostname='development.local', + port=default_site.port, + root_page_id=default_site.root_page_id, + ) + + self.home_page = Page.objects.get(id=2) + self.routable_page = self.home_page.add_child(instance=RoutablePageTest( + title="Routable Page", + live=True, + )) + + self.rf = RequestFactory() + self.request = self.rf.get(self.routable_page.url) + self.request.site = Site.find_for_request(self.request) + self.context = {'request': self.request} + + self.request.site = second_site + + def test_templatetag_reverse_index_route(self): + url = routablepageurl(self.context, self.routable_page, + 'index_route') + self.assertEqual(url, '/%s/' % self.routable_page.slug) + + def test_templatetag_reverse_archive_by_year_view(self): + url = routablepageurl(self.context, self.routable_page, + 'archive_by_year', '2014') + + self.assertEqual(url, '/%s/archive/year/2014/' % self.routable_page.slug) + + def test_templatetag_reverse_archive_by_author_view(self): + url = routablepageurl(self.context, self.routable_page, + 'archive_by_author', author_slug='joe-bloggs') + + self.assertEqual(url, '/%s/archive/author/joe-bloggs/' % self.routable_page.slug) + + def test_templatetag_reverse_external_view(self): + url = routablepageurl(self.context, self.routable_page, + 'external_view', 'joe-bloggs') + + self.assertEqual(url, '/%s/external/joe-bloggs/' % self.routable_page.slug) + + def test_templatetag_reverse_external_view_without_append_slash(self): + with mock.patch('wagtail.core.models.WAGTAIL_APPEND_SLASH', False): + url = routablepageurl(self.context, self.routable_page, + 'external_view', 'joe-bloggs') + expected = '/' + self.routable_page.slug + '/' + 'external/joe-bloggs/' + + self.assertEqual(url, expected) + + +class TestRoutablePageTemplateTagForSecondSiteAtDifferentRoot(TestCase): + """ + When multiple sites exist, relative URLs between such sites should include the domain portion + """ + def setUp(self): + self.home_page = Page.objects.get(id=2) + + events_page = self.home_page.add_child(instance=Page(title='Events', live=True)) + + second_site = Site.objects.create( + hostname='events.local', + port=80, + root_page=events_page, + ) + + self.routable_page = self.home_page.add_child(instance=RoutablePageTest( + title="Routable Page", + live=True, + )) + + self.rf = RequestFactory() + self.request = self.rf.get(self.routable_page.url) + self.request.site = Site.find_for_request(self.request) + self.context = {'request': self.request} + + self.request.site = second_site + + def test_templatetag_reverse_index_route(self): + url = routablepageurl(self.context, self.routable_page, + 'index_route') + self.assertEqual(url, 'http://localhost/%s/' % self.routable_page.slug) + + def test_templatetag_reverse_archive_by_year_view(self): + url = routablepageurl(self.context, self.routable_page, + 'archive_by_year', '2014') + + self.assertEqual(url, 'http://localhost/%s/archive/year/2014/' % self.routable_page.slug) + + def test_templatetag_reverse_archive_by_author_view(self): + url = routablepageurl(self.context, self.routable_page, + 'archive_by_author', author_slug='joe-bloggs') + + self.assertEqual(url, 'http://localhost/%s/archive/author/joe-bloggs/' % self.routable_page.slug) + + def test_templatetag_reverse_external_view(self): + url = routablepageurl(self.context, self.routable_page, + 'external_view', 'joe-bloggs') + + self.assertEqual(url, 'http://localhost/%s/external/joe-bloggs/' % self.routable_page.slug) + + def test_templatetag_reverse_external_view_without_append_slash(self): + with mock.patch('wagtail.core.models.WAGTAIL_APPEND_SLASH', False): + url = routablepageurl(self.context, self.routable_page, + 'external_view', 'joe-bloggs') + expected = 'http://localhost/' + self.routable_page.slug + '/' + 'external/joe-bloggs/' self.assertEqual(url, expected)