Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/core/templatetags/fqdn.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django import template
from django.conf import settings
from django.urls import reverse, NoReverseMatch
from django.urls.resolvers import get_resolver

register = template.Library()

Expand Down Expand Up @@ -47,7 +49,7 @@ def site_url(context, url_name=None, *args):


@register.simple_tag
def stateless_site_url(site, url_name=None, query=None, *args):
def stateless_site_url(site, url_name=None, query=None, *args, **kwargs):
"""A tag for constructing a url for a site without global request state
This should eventually become the canonical site builder for all other
tags in this file
Expand All @@ -60,7 +62,9 @@ def stateless_site_url(site, url_name=None, query=None, *args):
:param *args: additional arguments for reversing the url by name
"""
if url_name is not None:
path = reverse(url_name, args=args)
# avoid leaking script_prefix across sites
resolver = get_resolver()
path = resolver._reverse_with_prefix(url_name, "/", *args, **kwargs)
else:
path = None

Expand Down
27 changes: 20 additions & 7 deletions src/core/tests/test_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import pytz
from django.utils import timezone
from django.test import TestCase, override_settings
from django.urls import set_script_prefix
from freezegun import freeze_time

from utils.testing import helpers
Expand All @@ -13,9 +14,9 @@ class TestFqdn(TestCase):
@classmethod
def setUpTestData(cls):
cls.press = helpers.create_press()
cls.journal_one, cls.journal_two = helpers.create_journals()
cls.journal_two.domain = None
cls.journal_two.save()
cls.domain_journal, cls.path_journal = helpers.create_journals()
cls.path_journal.domain = None
cls.path_journal.save()

def test_stateless_site_url_for_press(self):
url_name = "press_all_users"
Expand All @@ -25,16 +26,28 @@ def test_stateless_site_url_for_press(self):
@override_settings(URL_CONFIG="domain")
def test_stateless_site_url_for_journal_domain(self):
url_name = "journal_users"
url = fqdn.stateless_site_url(self.journal_one, url_name)
self.assertEqual(url, f"http://{self.journal_one.domain}/user/all/")
url = fqdn.stateless_site_url(self.domain_journal, url_name)
self.assertEqual(url, f"http://{self.domain_journal.domain}/user/all/")

@override_settings(URL_CONFIG="path")
def test_stateless_site_url_for_journal_path(self):
url_name = "journal_users"
url = fqdn.stateless_site_url(self.journal_two, url_name)
url = fqdn.stateless_site_url(self.path_journal, url_name)
self.assertEqual(
url,
f"http://{self.journal_two.press.domain}/{self.journal_two.code}/user/all/",
f"http://{self.path_journal.press.domain}/{self.path_journal.code}/user/all/",
)

@override_settings(URL_CONFIG="path")
def test_stateless_site_url_across_journals(self):
url_name = "journal_users"
fake_code = "fake_code"
set_script_prefix(f"/{fake_code}")
url = fqdn.stateless_site_url(self.path_journal, url_name)
self.assertFalse(fake_code in url)
self.assertEqual(
url,
f"http://{self.path_journal.press.domain}/{self.path_journal.code}/user/all/",
)


Expand Down
Loading