Convert SiteSummaryPanel to a Component

Ensure that media defined on summary items is pulled through to the template.
pull/7362/head
Matt Westcott 2021-08-10 20:17:14 +01:00 zatwierdzone przez Matt Westcott
rodzic 18a093e14b
commit 21d5a9bbfc
4 zmienionych plików z 55 dodań i 18 usunięć

Wyświetl plik

@ -1,5 +1,6 @@
from warnings import warn
from django.forms import Media
from django.template.loader import get_template, render_to_string
from wagtail.admin.auth import user_has_any_page_permission
@ -107,21 +108,27 @@ class PagesSummaryItem(SummaryItem):
return user_has_any_page_permission(self.request.user)
class SiteSummaryPanel:
class SiteSummaryPanel(Component):
name = 'site_summary'
template_name = 'wagtailadmin/home/site_summary.html'
order = 100
def __init__(self, request):
self.request = request
self.summary_items = []
summary_items = []
for fn in hooks.get_hooks('construct_homepage_summary_items'):
fn(request, self.summary_items)
fn(request, summary_items)
self.summary_items = [s for s in summary_items if s.is_shown()]
self.summary_items.sort(key=lambda p: p.order)
def render(self):
summary_items = [s for s in self.summary_items if s.is_shown()]
if not summary_items:
return ''
def get_context_data(self, parent_context):
context = super().get_context_data(parent_context)
context['summary_items'] = self.summary_items
return context
return render_to_string('wagtailadmin/home/site_summary.html', {
'summary_items': sorted(summary_items, key=lambda p: p.order),
}, request=self.request)
@property
def media(self):
media = Media()
for item in self.summary_items:
media += item.media
return media

Wyświetl plik

@ -1,9 +1,11 @@
{% load i18n wagtailadmin_tags %}
<section class="panel summary nice-padding">
<h2 class="visuallyhidden">{% trans "Site summary" %}</h2>
<ul class="stats">
{% for item in summary_items %}
{% component item %}
{% endfor %}
</ul>
</section>
{% if summary_items %}
<section class="panel summary nice-padding">
<h2 class="visuallyhidden">{% trans "Site summary" %}</h2>
<ul class="stats">
{% for item in summary_items %}
{% component item %}
{% endfor %}
</ul>
</section>
{% endif %}

Wyświetl plik

@ -87,6 +87,18 @@ class TestHome(TestCase, WagtailTestUtils):
html=True
)
def test_summary_items(self):
response = self.client.get(reverse('wagtailadmin_home'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "<p>0 broken links</p>")
# check that media attached to summary items is correctly pulled in
self.assertContains(
response,
'<link href="/static/testapp/css/broken-links.css" type="text/css" media="all" rel="stylesheet">',
html=True
)
def test_never_cache_header(self):
# This tests that wagtailadmins global cache settings have been applied correctly
response = self.client.get(reverse('wagtailadmin_home'))

Wyświetl plik

@ -10,6 +10,7 @@ from wagtail.admin.menu import MenuItem
from wagtail.admin.rich_text import HalloPlugin
from wagtail.admin.rich_text.converters.html_to_contentstate import BlockElementHandler
from wagtail.admin.search import SearchArea
from wagtail.admin.site_summary import SummaryItem
from wagtail.admin.ui.components import Component
from wagtail.admin.views.account import BaseSettingsPanel
from wagtail.admin.widgets import Button
@ -206,3 +207,18 @@ class ClippyPanel(Component):
@hooks.register('construct_homepage_panels')
def add_clippy_panel(request, panels):
panels.append(ClippyPanel())
class BrokenLinksSummaryItem(SummaryItem):
order = 100
def render_html(self, parent_context):
return mark_safe("<p>0 broken links</p>")
class Media:
css = {'all': ['testapp/css/broken-links.css']}
@hooks.register('construct_homepage_summary_items')
def add_broken_links_summary_item(request, items):
items.append(BrokenLinksSummaryItem(request))