From 2110cbdcd0a35625599c92f347dc705a95671538 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 12 Aug 2020 15:16:30 +0200 Subject: [PATCH] mics: fix shown_because_admin when cell.restricted_to_unlogged is True (#45846) Also fix behaviour of element_is_visible() when user is superuser and cell is visible only by unlogged users. --- combo/data/models.py | 8 ++++++-- combo/public/templatetags/combo.py | 11 ++--------- tests/test_cells.py | 5 ++++- tests/test_public.py | 4 ++-- tox.ini | 1 + 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/combo/data/models.py b/combo/data/models.py index 85eb1d89..9471bcd3 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -72,14 +72,18 @@ class PostException(Exception): def element_is_visible(element, user=None): + if user and user.is_superuser: + return True + return element_is_visible_not_admin(element, user=user) + + +def element_is_visible_not_admin(element, user): if element.public: if getattr(element, 'restricted_to_unlogged', None) is True: return (user is None or user.is_anonymous) return True if user is None or user.is_anonymous: return False - if user.is_superuser: - return True page_groups = element.groups.all() if not page_groups: groups_ok = True diff --git a/combo/public/templatetags/combo.py b/combo/public/templatetags/combo.py index 408dc97d..ca4dffe3 100644 --- a/combo/public/templatetags/combo.py +++ b/combo/public/templatetags/combo.py @@ -44,7 +44,7 @@ from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.timezone import is_naive, make_aware -from combo.data.models import Page, Placeholder +from combo.data.models import Page, Placeholder, element_is_visible_not_admin from combo.public.menu import get_menu_context from combo.utils import NothingInCacheException, flatten_context from combo.utils.date import make_date, make_datetime @@ -277,14 +277,7 @@ def time(value, arg=None): @register.filter def shown_because_admin(cell, request): - if not (request.user and request.user.is_superuser): - return False - if cell.public: - return False - cell_groups = cell.groups.all() - if not cell_groups: - return False - return not(set(cell_groups).intersection(request.user.groups.all())) + return not element_is_visible_not_admin(cell, user=request.user) @register.filter(name='has_role') diff --git a/tests/test_cells.py b/tests/test_cells.py index 89b5a4a5..930257fb 100644 --- a/tests/test_cells.py +++ b/tests/test_cells.py @@ -1020,6 +1020,7 @@ def test_config_json_invalid_key_cell(): assert len(page.get_cells()) == 0 + def test_page_cell_placeholder_restricted_visibility(app, admin_user): page = Page(title='Test', slug='test', template_name='standard') page.save() @@ -1042,8 +1043,10 @@ def test_page_cell_placeholder_restricted_visibility(app, admin_user): resp = app.get(reverse('combo-public-ajax-page-cell', kwargs={'page_pk': page.pk, 'cell_reference': json_cell.get_reference()})) - assert "

Public text

" not in resp.text + assert "

Public text

" in resp.text assert "

Private text

" in resp.text + assert resp.pyquery('.shown-because-admin').text() == 'Public text' + def test_related_cell_types_tracking(): page = Page(title='example page', slug='example-page') diff --git a/tests/test_public.py b/tests/test_public.py index 48ae78ca..21866b8c 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -80,7 +80,7 @@ def test_page_contents_unlogged_only(app, admin_user): app = login(app) resp = app.get('/', status=200) - assert not 'Foobar' in resp.text + assert resp.pyquery('.shown-because-admin').text() == 'Foobar' @pytest.mark.skipif('mellon is None') def test_mellon_login(app): @@ -786,7 +786,7 @@ def test_familyinfos_cell_with_placeholders(app, admin_user): resp = app.get(reverse('combo-public-ajax-page-cell', kwargs={'page_pk': page.pk, 'cell_reference': family_cell.get_reference()})) resp = app.get('/') - assert "

Hello anonymous user

" not in resp.text + assert resp.pyquery('.shown-because-admin').text() == 'Hello anonymous user' assert "

You are not linked

" in resp.text diff --git a/tox.ini b/tox.ini index 60c9c5e7..dd7e28eb 100644 --- a/tox.ini +++ b/tox.ini @@ -31,6 +31,7 @@ deps = vobject django-ratelimit<3 git+http://git.entrouvert.org/debian/django-ckeditor.git + pyquery commands = ./getlasso3.sh python manage.py compilemessages -- 2.28.0