Spec-Zone.ru › Wagtail

Добавление отчётов

Отчёты представляют собой представления со списками страниц, соответствующих определённому запросу. Они также могут экспортировать эти списки в формате электронных таблиц. Их можно найти в подменю Отчёты: по умолчанию предоставляется отчёт Заблокированные страницы, позволяющий получить обзор заблокированных страниц на сайте.

Можно создать собственные пользовательские отчёты в админ-панели Wagtail. Предоставляются два базовых класса: wagtail.admin.views.reports.ReportView, который обеспечивает базовые функции отображения списка и экспорта в электронную таблицу, и wagtail.admin.views.reports.PageReportView, который дополнительно предоставляет набор полей по умолчанию, подходящих для списков страниц. В этом примере мы добавим отчёт, который показывает все страницы с не опубликованными изменениями.

# <project>/views.py
from wagtail.admin.views.reports import PageReportView


class UnpublishedChangesReportView(PageReportView):
    pass

Определение отчёта

Наиболее важные атрибуты и методы для настройки определения отчёта:

Это извлекает набор страниц для вашего отчёта. Для нашего примера:

# <project>/views.py

from wagtail.admin.views.reports import PageReportView
from wagtail.models import Page


class UnpublishedChangesReportView(PageReportView):

    def get_queryset(self):
        return Page.objects.filter(has_unpublished_changes=True)

(строка)

Шаблон, используемый для отображения вашего отчёта. Для ReportView, по умолчанию используется "wagtailadmin/reports/base_report.html", который предоставляет пустой макет страницы отчёта; для PageReportView, по умолчанию используется "wagtailadmin/reports/base_page_report.html", который предоставляет список, основанный на представлениях проводника, отображающий кнопки действий, а также заголовок, время последнего обновления, статус и тип любых страниц. В этом примере мы изменим это на новый шаблон в последующем разделе.

(строка)

Название вашего отчёта, которое будет отображаться в заголовке. Для нашего примера мы установим его на "Pages with unpublished changes".

(строка)

Имя значка, используя стандартные имена значков Wagtail. Например, представление заблокированных страниц использует "locked", а для нашего примера отчёта мы установим его на 'doc-empty-inverse'.

Экспорт в электронные таблицы

(список)

Список полей/атрибутов для каждой модели, которые экспортируются как столбцы в представлении электронных таблиц. Для ReportView, по умолчанию это пусто, а для PageReportView, это соответствует полям списка: заголовок, время последнего обновления, статус и тип страниц. Для нашего примера, мы можем захотеть узнать, когда страница была в последний раз опубликована, поэтому мы установим list_export следующим образом:

list_export = PageReportView.list_export + ['last_published_at']

(словарь)

Словарь любых полей/атрибутов в list_export, для которых вы хотите вручную указать заголовок для столбца электронной таблицы и их заголовки. Если не указано, заголовок будет взят из поля verbose_name если применимо, и строка атрибута в противном случае. Для нашего примера, last_published_at автоматически получит заголовок "Last Published At", но «Последнее опубликование» выглядит более аккуратно. Мы добавим это, установив export_headings:

export_headings = dict(last_published_at='Last Published', **PageReportView.export_headings)

(словарь)

Словарь кортежей (value_class_1, value_class_2, ...) отображающих словари {export_format: preprocessing_function}, позволяющие применять пользовательские функции предварительной обработки при экспорте значений полей определённых классов (или их подклассов). Если не указано (и ReportView.custom_field_preprocess также не указывает функцию), будет использоваться force_str. Для предотвращения предварительной обработки установите preprocessing_function на None.

(словарь)

Словарь строк field_name отображающих словари {export_format: preprocessing_function}, позволяющие применять пользовательские функции предварительной обработки при экспорте значений полей определённых классов (или их подклассов). Это будет иметь приоритет над функциями, указанными в ReportView.custom_value_preprocess. Если не указано (и ReportView.custom_value_preprocess также не указывает функцию), будет использоваться force_str. Для предотвращения предварительной обработки установите preprocessing_function на None.

Настройка шаблонов

Для этого примера отчёта «страницы с не опубликованными изменениями» мы добавим дополнительный столбец в шаблон списка, показывающий последнюю дату публикации каждой страницы. Для этого мы расширим два шаблона: wagtailadmin/reports/base_page_report.html, и wagtailadmin/reports/listing/_list_page_report.html.

{# <project>/templates/reports/unpublished_changes_report.html #}

{% extends 'wagtailadmin/reports/base_page_report.html' %}

{% block listing %}
    {% include 'reports/include/_list_unpublished_changes.html' %}
{% endblock %}

{% block no_results %}
    <p>No pages with unpublished changes.</p>
{% endblock %}
{# <project>/templates/reports/include/_list_unpublished_changes.html #}

{% extends 'wagtailadmin/reports/listing/_list_page_report.html' %}

{% block extra_columns %}
    <th>Last Published</th>
{% endblock %}

{% block extra_page_data %}
    <td valign="top">
        {{ page.last_published_at }}
    </td>
{% endblock %}

Наконец, мы установим UnpublishedChangesReportView.template_name на этот новый шаблон: 'reports/unpublished_changes_report.html'.

Добавление пункта меню и административного URL

Для добавления пункта меню для вашего нового отчёта в подменю Отчёты, вам необходимо использовать хук register_reports_menu_item (см.: Зарегистрировать пункт меню отчётов). Для добавления административного URL для отчёта, вам необходимо использовать хук register_admin_urls (см.: Зарегистрировать административные URL-адреса). Это можно сделать следующим образом:

# <project>/wagtail_hooks.py

from django.urls import path, reverse

from wagtail.admin.menu import AdminOnlyMenuItem
from wagtail import hooks

from .views import UnpublishedChangesReportView

@hooks.register('register_reports_menu_item')
def register_unpublished_changes_report_menu_item():
    return AdminOnlyMenuItem("Pages with unpublished changes", reverse('unpublished_changes_report'), classnames='icon icon-' + UnpublishedChangesReportView.header_icon, order=700)

@hooks.register('register_admin_urls')
def register_unpublished_changes_report_url():
    return [
        path('reports/unpublished-changes/', UnpublishedChangesReportView.as_view(), name='unpublished_changes_report'),
    ]

Здесь мы используем класс AdminOnlyMenuItem для обеспечения того, чтобы наш значок отчёта отображался только для суперпользователей. Чтобы сделать отчёт видимым для всех пользователей, можно заменить его на MenuItem.

Полный код

# <project>/views.py

from wagtail.admin.views.reports import PageReportView
from wagtail.models import Page


class UnpublishedChangesReportView(PageReportView):

    header_icon = 'doc-empty-inverse'
    template_name = 'reports/unpublished_changes_report.html'
    title = "Pages with unpublished changes"

    list_export = PageReportView.list_export + ['last_published_at']
    export_headings = dict(last_published_at='Last Published', **PageReportView.export_headings)

    def get_queryset(self):
        return Page.objects.filter(has_unpublished_changes=True)
# <project>/wagtail_hooks.py

from django.urls import path, reverse

from wagtail.admin.menu import AdminOnlyMenuItem
from wagtail import hooks

from .views import UnpublishedChangesReportView

@hooks.register('register_reports_menu_item')
def register_unpublished_changes_report_menu_item():
    return AdminOnlyMenuItem("Pages with unpublished changes", reverse('unpublished_changes_report'), classnames='icon icon-' + UnpublishedChangesReportView.header_icon, order=700)

@hooks.register('register_admin_urls')
def register_unpublished_changes_report_url():
    return [
        path('reports/unpublished-changes/', UnpublishedChangesReportView.as_view(), name='unpublished_changes_report'),
    ]
{# <project>/templates/reports/unpublished_changes_report.html #}

{% extends 'wagtailadmin/reports/base_page_report.html' %}

{% block listing %}
    {% include 'reports/include/_list_unpublished_changes.html' %}
{% endblock %}

{% block no_results %}
    <p>No pages with unpublished changes.</p>
{% endblock %}
{# <project>/templates/reports/include/_list_unpublished_changes.html #}

{% extends 'wagtailadmin/reports/listing/_list_page_report.html' %}

{% block extra_columns %}
    <th>Last Published</th>
{% endblock %}

{% block extra_page_data %}
    <td valign="top">
        {{ page.last_published_at }}
    </td>
{% endblock %}

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/extending/adding_reports.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API