diff --git a/CHANGELOG.txt b/CHANGELOG.txt index d5ade9a8bd..cb22de38bf 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -47,6 +47,7 @@ Changelog * Fix: 'Add user' is now rendered as a button due to the use of quotes within translations (Benoît Vogel) * Fix: Menu icon no longer overlaps with title in Modeladmin on mobile (Coen van der Kamp) * Fix: Background color overflow within the Wagtail documentation (Sergey Fedoseev) + * Fix: Page count on homepage summary panel now takes account of user permissions (Andy Chosak) 2.0.1 (04.04.2018) diff --git a/docs/releases/2.1.rst b/docs/releases/2.1.rst index c0cf150fbf..3174e871c6 100644 --- a/docs/releases/2.1.rst +++ b/docs/releases/2.1.rst @@ -70,6 +70,7 @@ Bug fixes * 'Add user' is now rendered as a button due to the use of quotes within translations (Benoît Vogel) * Menu icon no longer overlaps with title in Modeladmin on mobile (Coen van der Kamp) * Background color overflow within the Wagtail documentation (Sergey Fedoseev) + * Page count on homepage summary panel now takes account of user permissions (Andy Chosak) Upgrade considerations diff --git a/wagtail/admin/site_summary.py b/wagtail/admin/site_summary.py index 3bd7dcea06..cdb339ee3e 100644 --- a/wagtail/admin/site_summary.py +++ b/wagtail/admin/site_summary.py @@ -1,5 +1,6 @@ from django.template.loader import render_to_string +from wagtail.admin.navigation import get_explorable_root_page from wagtail.admin.utils import user_has_any_page_permission from wagtail.core import hooks from wagtail.core.models import Page, Site @@ -26,20 +27,29 @@ class PagesSummaryItem(SummaryItem): template = 'wagtailadmin/home/site_summary_pages.html' def get_context(self): - # If there is a single site, link to the homepage of that site - # Otherwise, if there are multiple sites, link to the root page - try: - site = Site.objects.get() - root = site.root_page - single_site = True - except (Site.DoesNotExist, Site.MultipleObjectsReturned): - root = None - single_site = False + root_page = get_explorable_root_page(self.request.user) + + if root_page: + page_count = Page.objects.descendant_of(root_page, inclusive=True).count() + + if root_page.is_root(): + # If the root page the user has access to is the Wagtail root, + # subtract one from this count because the root is not a real page. + page_count -= 1 + + # If precisely one site exists, link to its homepage rather than the + # tree root, to discourage people from trying to create pages as siblings + # of the homepage (#1883) + try: + root_page = Site.objects.get().root_page + except (Site.DoesNotExist, Site.MultipleObjectsReturned): + pass + else: + page_count = 0 return { - 'single_site': single_site, - 'root_page': root, - 'total_pages': Page.objects.count() - 1, # subtract 1 because the root node is not a real page + 'root_page': root_page, + 'total_pages': page_count, } def is_shown(self): diff --git a/wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html b/wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html index 51d552d68a..0fa518617e 100644 --- a/wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html +++ b/wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html @@ -1,7 +1,7 @@ {% load i18n wagtailadmin_tags %}
  • - + {% blocktrans count counter=total_pages with total_pages|intcomma as total %} {{ total }} Page {% plural %} diff --git a/wagtail/admin/tests/test_site_summary.py b/wagtail/admin/tests/test_site_summary.py new file mode 100644 index 0000000000..71a11e91e4 --- /dev/null +++ b/wagtail/admin/tests/test_site_summary.py @@ -0,0 +1,83 @@ +from django.contrib.auth.models import Group +from django.test import TestCase +from django.urls import reverse + +from wagtail.admin.site_summary import PagesSummaryItem +from wagtail.core.models import GroupPagePermission, Page, Site +from wagtail.tests.testapp.models import SimplePage +from wagtail.tests.utils import WagtailTestUtils + + +class TestPagesSummary(TestCase, WagtailTestUtils): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.test_page = SimplePage(title="test", slug='test', content="test") + cls.wagtail_root = Page.get_first_root_node() + cls.wagtail_root.add_child(instance=cls.test_page) + + cls.test_page_group = Group.objects.create(name="Test page") + GroupPagePermission.objects.create( + group=cls.test_page_group, + page=cls.test_page, + permission_type='edit' + ) + + @classmethod + def tearDownClass(cls): + cls.test_page.delete() + cls.test_page_group.delete() + + super().tearDownClass() + + def setUp(self): + self.user = self.login() + self.request = self.client.get('/').wsgi_request + + def assertSummaryContains(self, content): + summary = PagesSummaryItem(self.request).render() + self.assertIn(content, summary) + + def assertSummaryContainsLinkToPage(self, page_pk): + self.assertSummaryContains(reverse('wagtailadmin_explore', args=[page_pk])) + + def test_user_with_page_permissions_is_shown_panel(self): + self.assertTrue(PagesSummaryItem(self.request).is_shown()) + + def test_single_site_summary_links_to_site_root(self): + self.assertEqual(Site.objects.count(), 1) + site = Site.objects.first() + self.assertSummaryContainsLinkToPage(site.root_page.pk) + + def test_multiple_sites_summary_links_to_wagtail_root(self): + Site.objects.create(hostname='foo.com', root_page=self.wagtail_root) + self.assertSummaryContainsLinkToPage(self.wagtail_root.pk) + + def test_no_sites_summary_links_to_wagtail_root(self): + Site.objects.all().delete() + self.assertSummaryContainsLinkToPage(self.wagtail_root.pk) + + def test_summary_includes_page_count_without_wagtail_root(self): + self.assertSummaryContains("{} Pages".format(Page.objects.count() - 1)) + + def test_summary_shows_zero_pages_if_none_exist_except_wagtail_root(self): + Page.objects.exclude(pk=self.wagtail_root.pk).delete() + self.assertSummaryContains("0 Pages") + + def test_user_with_no_page_permissions_is_not_shown_panel(self): + self.user.is_superuser = False + self.user.save() + self.assertFalse(PagesSummaryItem(self.request).is_shown()) + + def test_user_with_limited_page_permissions_summary_links_to_their_root(self): + self.user.is_superuser = False + self.user.save() + self.user.groups.add(self.test_page_group) + self.assertSummaryContainsLinkToPage(self.test_page.pk) + + def test_user_with_limited_page_permissions_sees_proper_page_count(self): + self.user.is_superuser = False + self.user.save() + self.user.groups.add(self.test_page_group) + self.assertSummaryContains("1 Page") diff --git a/wagtail/admin/tests/tests.py b/wagtail/admin/tests/tests.py index 07e719302f..b5d7512e47 100644 --- a/wagtail/admin/tests/tests.py +++ b/wagtail/admin/tests/tests.py @@ -11,9 +11,8 @@ from django.utils.translation import ugettext_lazy as _ from taggit.models import Tag from wagtail.admin.menu import MenuItem -from wagtail.admin.site_summary import PagesSummaryItem from wagtail.admin.utils import send_mail, user_has_any_page_permission -from wagtail.core.models import Page, Site +from wagtail.core.models import Page from wagtail.tests.utils import WagtailTestUtils @@ -73,40 +72,6 @@ class TestHome(TestCase, WagtailTestUtils): self.assertEqual(response.status_code, 200) -class TestPagesSummary(TestCase, WagtailTestUtils): - def setUp(self): - self.login() - - def get_request(self): - """ - Get a Django WSGI request that has been passed through middleware etc. - """ - return self.client.get('/admin/').wsgi_request - - def test_page_summary_single_site(self): - request = self.get_request() - root_page = request.site.root_page - link = ''.format(reverse('wagtailadmin_explore', args=[root_page.pk])) - page_summary = PagesSummaryItem(request) - self.assertIn(link, page_summary.render()) - - def test_page_summary_multiple_sites(self): - Site.objects.create( - hostname='example.com', - root_page=Page.objects.get(pk=1)) - request = self.get_request() - link = ''.format(reverse('wagtailadmin_explore_root')) - page_summary = PagesSummaryItem(request) - self.assertIn(link, page_summary.render()) - - def test_page_summary_zero_sites(self): - Site.objects.all().delete() - request = self.get_request() - link = ''.format(reverse('wagtailadmin_explore_root')) - page_summary = PagesSummaryItem(request) - self.assertIn(link, page_summary.render()) - - class TestEditorHooks(TestCase, WagtailTestUtils): def setUp(self): self.homepage = Page.objects.get(id=2)