diff --git a/docs/core_components/pages/advanced_topics/routable_page.rst b/docs/core_components/pages/advanced_topics/routable_page.rst index 438c9625e..95b859b72 100644 --- a/docs/core_components/pages/advanced_topics/routable_page.rst +++ b/docs/core_components/pages/advanced_topics/routable_page.rst @@ -86,3 +86,19 @@ The ``RoutablePage`` class .. code-block:: python url = page.url + page.reverse_subpage('events_for_year', args=('2014', )) + +The ``routablepageurl`` template tag +==================================== + +.. currentmodule:: wagtail.contrib.wagtailroutablepage.templatetags.wagtailroutablepage_tags +.. autofunction:: routablepageurl + + Example: + + .. code-block:: html+django + + {% load wagtailroutablepage_tags %} + + {% routablepageurl self "feed" %} + {% routablepageurl self "archive" 2014 08 14 %} + {% routablepageurl self "food" foo="bar" baz="quux" %} diff --git a/wagtail/contrib/wagtailroutablepage/templatetags/__init__.py b/wagtail/contrib/wagtailroutablepage/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py b/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py new file mode 100644 index 000000000..6af38c245 --- /dev/null +++ b/wagtail/contrib/wagtailroutablepage/templatetags/wagtailroutablepage_tags.py @@ -0,0 +1,24 @@ +from django import template + + +register = template.Library() + + +@register.simple_tag(takes_context=True) +def routablepageurl(context, page, url_name, *args, **kwargs): + """ + ``routablepageurl`` is similar to ``pageurl``, but works with + ``RoutablePage``\s. It behaves like a hybrid between the built-in + ``reverse``, and ``pageurl`` from Wagtail. + + ``page`` is the RoutablePage that URLs will be generated from. + + ``url_name`` is a URL name defined in ``page.subpage_urls``. + + Positional arguments and keyword arguments should be passed as normal + positional arguments and keyword arguments. + """ + request = context['request'] + base_url = page.relative_url(request.site) + routed_url = page.reverse_subpage(url_name, args=args, kwargs=kwargs) + return base_url + routed_url diff --git a/wagtail/contrib/wagtailroutablepage/tests.py b/wagtail/contrib/wagtailroutablepage/tests.py index 505df45b3..1aa8f53d1 100644 --- a/wagtail/contrib/wagtailroutablepage/tests.py +++ b/wagtail/contrib/wagtailroutablepage/tests.py @@ -1,7 +1,8 @@ -from django.test import TestCase +from django.test import TestCase, RequestFactory -from wagtail.wagtailcore.models import Page +from wagtail.wagtailcore.models import Page, Site from wagtail.tests.models import RoutablePageTest, routable_page_external_view +from wagtail.contrib.wagtailroutablepage.templatetags.wagtailroutablepage_tags import routablepageurl class TestRoutablePage(TestCase): @@ -80,3 +81,35 @@ class TestRoutablePage(TestCase): response = self.client.get(self.routable_page.url + 'external/joe-bloggs/') self.assertContains(response, "EXTERNAL VIEW: joe-bloggs") + + +class TestRoutablePageTemplateTag(TestRoutablePage): + def setUp(self): + super(TestRoutablePageTemplateTag, self).setUp() + 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} + + def test_templatetag_reverse_main_view(self): + url = routablepageurl(self.context, self.routable_page, + 'main') + self.assertEqual(url, self.routable_page.url) + + 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/') + + 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/') + + 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/')