Skip to content

Commit

Permalink
Fixed #22261 -- Fixed resolving namespaced URLs for flatpages.
Browse files Browse the repository at this point in the history
  • Loading branch information
hramezani authored and felixxm committed Jan 28, 2020
1 parent e2fab0b commit 2633c53
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 4 deletions.
9 changes: 8 additions & 1 deletion django/contrib/flatpages/models.py
@@ -1,6 +1,6 @@
from django.contrib.sites.models import Site
from django.db import models
from django.urls import get_script_prefix
from django.urls import NoReverseMatch, get_script_prefix, reverse
from django.utils.encoding import iri_to_uri
from django.utils.translation import gettext_lazy as _

Expand Down Expand Up @@ -36,5 +36,12 @@ def __str__(self):
return "%s -- %s" % (self.url, self.title)

def get_absolute_url(self):
from .views import flatpage

for url in (self.url.lstrip('/'), self.url):
try:
return reverse(flatpage, kwargs={'url': url})
except NoReverseMatch:
pass
# Handle script prefix manually because we bypass reverse()
return iri_to_uri(get_script_prefix().rstrip('/') + self.url)
6 changes: 6 additions & 0 deletions tests/flatpages_tests/absolute_urls.py
@@ -0,0 +1,6 @@
from django.contrib.flatpages import views
from django.urls import path

urlpatterns = [
path('flatpage/', views.flatpage, {'url': '/hardcoded/'}),
]
5 changes: 5 additions & 0 deletions tests/flatpages_tests/no_slash_urls.py
@@ -0,0 +1,5 @@
from django.urls import include, path

urlpatterns = [
path('flatpage', include('django.contrib.flatpages.urls')),
]
15 changes: 14 additions & 1 deletion tests/flatpages_tests/test_models.py
@@ -1,5 +1,5 @@
from django.contrib.flatpages.models import FlatPage
from django.test import SimpleTestCase
from django.test import SimpleTestCase, override_settings
from django.test.utils import override_script_prefix


Expand All @@ -17,3 +17,16 @@ def test_get_absolute_url_honors_script_prefix(self):

def test_str(self):
self.assertEqual(str(self.page), '/café/ -- Café!')

@override_settings(ROOT_URLCONF='flatpages_tests.urls')
def test_get_absolute_url_include(self):
self.assertEqual(self.page.get_absolute_url(), '/flatpage_root/caf%C3%A9/')

@override_settings(ROOT_URLCONF='flatpages_tests.no_slash_urls')
def test_get_absolute_url_include_no_slash(self):
self.assertEqual(self.page.get_absolute_url(), '/flatpagecaf%C3%A9/')

@override_settings(ROOT_URLCONF='flatpages_tests.absolute_urls')
def test_get_absolute_url_with_hardcoded_url(self):
fp = FlatPage(title='Test', url='/hardcoded/')
self.assertEqual(fp.get_absolute_url(), '/flatpage/')
7 changes: 5 additions & 2 deletions tests/flatpages_tests/test_sitemaps.py
Expand Up @@ -31,5 +31,8 @@ def setUpTestData(cls):

def test_flatpage_sitemap(self):
response = self.client.get('/flatpages/sitemap.xml')
self.assertIn(b'<url><loc>http://example.com/foo/</loc></url>', response.getvalue())
self.assertNotIn(b'<url><loc>http://example.com/private-foo/</loc></url>', response.getvalue())
self.assertIn(b'<url><loc>http://example.com/flatpage_root/foo/</loc></url>', response.getvalue())
self.assertNotIn(
b'<url><loc>http://example.com/flatpage_root/private-foo/</loc></url>',
response.getvalue(),
)

0 comments on commit 2633c53

Please sign in to comment.