From f03b2984277f9c7d38f688acc03815b6da71db5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 13 Dec 2018 11:16:31 +0100 Subject: [PATCH] general: refine navigation/menu page visibility (#28963) --- combo/data/models.py | 5 ++++ combo/public/menu.py | 6 ++-- .../public/templates/combo/page_template.html | 2 +- combo/public/templatetags/combo.py | 4 +-- tests/test_cells.py | 29 ++++++++++++++++++- tests/test_public.py | 22 ++++++++++++++ 6 files changed, 61 insertions(+), 7 deletions(-) diff --git a/combo/data/models.py b/combo/data/models.py index c3c52aab..893f7550 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -786,6 +786,11 @@ class MenuCell(CellBase): root_page=self.root_page, depth=self.depth) return ctx + def render(self, context): + if context.get('render_skeleton') and not context.get('synchronous'): + raise NothingInCacheException() + return super(MenuCell, self).render(context) + def render_for_search(self): return '' diff --git a/combo/public/menu.py b/combo/public/menu.py index db6df724..3a8aba2f 100644 --- a/combo/public/menu.py +++ b/combo/public/menu.py @@ -19,7 +19,7 @@ from django.template.loader import get_template from combo.data.models import Page -def render_menu(context, level=0, root_page=None, depth=1): +def render_menu(context, level=0, root_page=None, depth=1, ignore_visibility=False): context['root_page'] = root_page if root_page: level = len(root_page.get_parents_and_self()) @@ -27,7 +27,7 @@ def render_menu(context, level=0, root_page=None, depth=1): template = get_template('combo/menu.html') return template.render(context) -def get_menu_context(context, level=0, current_page=None, depth=1): +def get_menu_context(context, level=0, current_page=None, depth=1, ignore_visibility=False): if 'hierarchical_pages_by_id' not in context: context['hierarchical_pages_by_id'] = Page.get_with_hierarchy_attributes() pages_by_id = context['hierarchical_pages_by_id'] @@ -68,7 +68,7 @@ def get_menu_context(context, level=0, current_page=None, depth=1): for element in elements: if element.exclude_from_navigation: continue - if not context.get('render_skeleton'): + if not (ignore_visibility or context.get('render_skeleton')): if not element.is_visible(context['request'].user): continue menuitem = {'page': element} diff --git a/combo/public/templates/combo/page_template.html b/combo/public/templates/combo/page_template.html index 6ffd86be..7d8d9561 100644 --- a/combo/public/templates/combo/page_template.html +++ b/combo/public/templates/combo/page_template.html @@ -15,7 +15,7 @@ {% if check_badges %}data-check-badges="true"{% endif %} data-api-root="{{ site_base }}/api/">

{{ page.title }}

- +
{% block messages %} diff --git a/combo/public/templatetags/combo.py b/combo/public/templatetags/combo.py index 792567a9..4f77f12e 100644 --- a/combo/public/templatetags/combo.py +++ b/combo/public/templatetags/combo.py @@ -146,7 +146,7 @@ class ExtraPlaceholderNode(template.Node): return skeleton_text(context, self.placeholder_name, content=self.content) @register.inclusion_tag('combo/menu.html', takes_context=True) -def show_menu(context, level=0, current_page=None, depth=1, reduce_depth=False): +def show_menu(context, level=0, current_page=None, depth=1, ignore_visibility=False, reduce_depth=False): if reduce_depth: depth -= 1 new_context = { @@ -154,7 +154,7 @@ def show_menu(context, level=0, current_page=None, depth=1, reduce_depth=False): 'render_skeleton': context.get('render_skeleton'), 'request': context['request']} return get_menu_context(new_context, level=level, current_page=current_page, - depth=depth) + depth=depth, ignore_visibility=ignore_visibility) @register.simple_tag(takes_context=True) def page_absolute_url(context, page): diff --git a/tests/test_cells.py b/tests/test_cells.py index f1d4eef6..31150558 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -4,7 +4,7 @@ import os import pytest import requests -from combo.data.models import Page, CellBase, TextCell, LinkCell, JsonCellBase, JsonCell, ConfigJsonCell +from combo.data.models import Page, CellBase, TextCell, LinkCell, MenuCell, JsonCellBase, JsonCell, ConfigJsonCell from django.conf import settings from django.db import connection from django.forms.widgets import Media @@ -109,6 +109,33 @@ def test_link_cell(): assert cell.render(ctx).strip() == 'altertitle' +def test_menu_cell(): + Page.objects.all().delete() + parent = page = Page(title='Page1', slug='page1', template_name='standard') + page.save() + page = Page(title='Page2', slug='page2', template_name='standard', + parent=parent) + page.save() + page = Page(title='Page3', slug='page3', template_name='standard', + parent=parent, public=False) + page.save() + cell = MenuCell(root_page=parent, order=0, page=parent) + cell.save() + request = RequestFactory().get('/page1/') + request.user = None + ctx = {'page': parent, 'request': request} + assert 'menu-page2' in cell.render(ctx) + assert 'menu-page3' not in cell.render(ctx) + + request.user = User(username='foo', email='foo@example.net') + assert 'menu-page2' in cell.render(ctx) + assert 'menu-page3' in cell.render(ctx) + + ctx = {'render_skeleton': True} + with pytest.raises(NothingInCacheException): + cell.render(ctx) + + def test_variant_templates(): page = Page(title='example page', slug='example-page') page.save() diff --git a/tests/test_public.py b/tests/test_public.py index 7ff3d4e0..67fb2d33 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -269,6 +269,13 @@ def test_page_skeleton(app): resp = app.get('/__skeleton__/?source=%s' % quote('http://example.net/foo/bar')) resp = app.get('/__skeleton__/?source=%s' % quote('http://example.net/badredir')) + # add a page with restricted visibility + page = Page(title='RestrictedVisibility', slug='restrictedvisibilit', + template_name='standard', public=False) + page.save() + resp = app.get('/__skeleton__/?source=%s' % quote('http://127.0.0.1:8999/')) + assert 'RestrictedVisibility' in resp.text + def test_subpage_location(app): Page.objects.all().delete() @@ -317,6 +324,21 @@ def test_subpage_location(app): resp = app.get('/second/child-second/grand-child-second/', status=200) assert 'Grand child of second' in resp.text + +def test_menu(app): + Page.objects.all().delete() + page = Page(title='Page1', slug='index', template_name='standard') + page.save() + page = Page(title='Page2', slug='page2', template_name='standard') + page.save() + page = Page(title='Page3', slug='page3', template_name='standard', public=False) + page.save() + resp = app.get('/', status=200) + assert 'menu-index' in resp.text + assert 'menu-page2' in resp.text + assert 'menu-page3' in resp.text + + def test_404(app): Page.objects.all().delete() resp = app.get('/foobar/', status=404) -- 2.20.0