misc: directly give redirect url as target if possible (#56308)

This commit is contained in:
Frédéric Péters 2021-08-22 17:16:29 +02:00
parent 5f34c09945
commit 85f3ac7733
4 changed files with 25 additions and 2 deletions

View File

@ -262,6 +262,10 @@ class Page(models.Model):
return list(reversed(pages))
def get_online_url(self):
if self.redirect_url and not (
utils.is_templated_url(self.redirect_url) or self.redirect_url.startswith('.')
):
return self.redirect_url
parts = [x.slug for x in self.get_parents_and_self()]
if parts[0] == 'index':
parts = parts[1:]

View File

@ -20,4 +20,4 @@ from .crypto import DecryptionError, aes_hex_decrypt, aes_hex_encrypt
from .misc import ellipsize, flatten_context
from .requests_wrapper import NothingInCacheException, requests
from .signature import check_query, check_request_signature, sign_url
from .urls import TemplateError, get_templated_url
from .urls import TemplateError, get_templated_url, is_templated_url

View File

@ -31,8 +31,12 @@ class TemplateError(Exception):
return self.msg % self.params
def is_templated_url(url):
return bool('{{' in url or '{%' in url or '[' in url)
def get_templated_url(url, context=None):
if '{{' not in url and '{%' not in url and '[' not in url:
if not is_templated_url(url):
return url
template_vars = Context(use_l10n=False)
if context:

View File

@ -37,6 +37,21 @@ def test_page_url():
page2.parent = page
assert page2.get_online_url() == '/foo/bar/'
# directly give redirect url of linked page
page2.redirect_url = 'https://www.example.org/test'
page2.save()
assert page2.get_online_url() == 'https://www.example.org/test'
# unless it is a relative path
page2.redirect_url = '../test'
page2.save()
assert page2.get_online_url() == '/foo/bar/'
# or if's a template
page2.redirect_url = '{{test_url}}plop'
page2.save()
assert page2.get_online_url() == '/foo/bar/'
def test_page_of_level():
parent_page = None