From eb11afca1bca7e3af40b4f116c72fbafe98c8f34 Mon Sep 17 00:00:00 2001 From: Nicolas ROCHE Date: Wed, 15 Sep 2021 16:40:25 +0200 Subject: [PATCH] pwa: allow absolute redirection url from internal page (#56974) --- combo/apps/pwa/models.py | 8 +++- .../pwa/templates/combo/pwa/navigation.html | 4 +- tests/test_pwa.py | 41 +++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/combo/apps/pwa/models.py b/combo/apps/pwa/models.py index ff0c84dc..3b36909a 100644 --- a/combo/apps/pwa/models.py +++ b/combo/apps/pwa/models.py @@ -31,6 +31,7 @@ from py_vapid import Vapid from combo import utils from combo.data.fields import RichTextField +from combo.middleware import get_request class PwaSettings(models.Model): @@ -137,9 +138,12 @@ class PwaNavigationEntry(models.Model): def get_url(self): if self.link_page: - return self.link_page.get_online_url() + url = self.link_page.get_online_url() else: - return utils.get_templated_url(self.url) + url = utils.get_templated_url(self.url) + if get_request(): + url = get_request().build_absolute_uri(url) + return url def css_class_names(self): css_class_names = self.extra_css_class or '' diff --git a/combo/apps/pwa/templates/combo/pwa/navigation.html b/combo/apps/pwa/templates/combo/pwa/navigation.html index 3ce98275..2fcb108e 100644 --- a/combo/apps/pwa/templates/combo/pwa/navigation.html +++ b/combo/apps/pwa/templates/combo/pwa/navigation.html @@ -7,7 +7,7 @@ {% endfor %} @@ -36,4 +36,4 @@ $('body.authenticated-user li[data-notification-count-url]').each(function(idx, }}); }); -{% endif %} \ No newline at end of file +{% endif %} diff --git a/tests/test_pwa.py b/tests/test_pwa.py index 3adf0832..78654692 100644 --- a/tests/test_pwa.py +++ b/tests/test_pwa.py @@ -1,4 +1,5 @@ import base64 +from html.parser import HTMLParser from unittest import mock import pytest @@ -253,6 +254,46 @@ def test_pwa_navigation_templatetag(app): assert 'data-pwa-user-name="{% block placeholder-user-name %}' in nav +def test_pwa_navigation_templatetag_internal_redirection(app): + page1 = Page(title='One', slug='one') + page2 = Page(title='Two', slug='two', redirect_url='http://www.example.org/test') + page3 = Page(title='Three', slug='three', redirect_url='../test') + page4 = Page(title='Four', slug='four', redirect_url='{{test_url}}plop') + page1.save() + page2.save() + page3.save() + page4.save() + entry1 = PwaNavigationEntry(link_page=page1, order=1) + entry2 = PwaNavigationEntry(link_page=page2, order=2) + entry3 = PwaNavigationEntry(link_page=page3, order=3) + entry4 = PwaNavigationEntry(link_page=page4, order=4) + entry1.save() + entry2.save() + entry3.save() + entry4.save() + t = Template('{% load pwa %}{% pwa_navigation %}') + + with override_settings(TEMPLATE_VARS={'pwa_display': 'standalone'}): + request = RequestFactory().get('/') + with mock.patch('combo.apps.pwa.models.get_request', return_value=request): + nav = t.render(Context({'request': request})) + + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + if tag == 'a': + results.append(attrs[0][1]) + + parser = MyHTMLParser() + results = [] + parser.feed(nav) + assert results == [ + 'http://testserver/one/', + 'http://www.example.org/test', + 'http://testserver/three/', + 'http://testserver/four/', + ] + + def test_pwa_application_icon(app, admin_user): app = login(app) with override_settings(TEMPLATE_VARS={'pwa_display': 'standalone'}):