123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086 |
- from django.conf import settings
- from django.contrib.auth.models import Permission
- from django.urls import reverse
- from django.utils.http import urlencode
- from django.utils.translation import gettext
- from django.utils.translation import gettext_lazy as _
- from draftjs_exporter.dom import DOM
- import wagtail.admin.rich_text.editors.draftail.features as draftail_features
- from wagtail import __version__, hooks
- from wagtail.admin.admin_url_finder import (
- ModelAdminURLFinder,
- register_admin_url_finder,
- )
- from wagtail.admin.auth import user_has_any_page_permission
- from wagtail.admin.forms.collections import GroupCollectionManagementPermissionFormSet
- from wagtail.admin.menu import MenuItem, SubmenuMenuItem, reports_menu, settings_menu
- from wagtail.admin.navigation import get_explorable_root_page
- from wagtail.admin.rich_text.converters.contentstate import link_entity
- from wagtail.admin.rich_text.converters.editor_html import (
- LinkTypeRule,
- PageLinkHandler,
- WhitelistRule,
- )
- from wagtail.admin.rich_text.converters.html_to_contentstate import (
- BlockElementHandler,
- ExternalLinkElementHandler,
- HorizontalRuleHandler,
- InlineStyleElementHandler,
- ListElementHandler,
- ListItemElementHandler,
- PageLinkElementHandler,
- )
- from wagtail.admin.search import SearchArea
- from wagtail.admin.site_summary import PagesSummaryItem
- from wagtail.admin.ui.sidebar import (
- PageExplorerMenuItem as PageExplorerMenuItemComponent,
- )
- from wagtail.admin.ui.sidebar import SubMenuItem as SubMenuItemComponent
- from wagtail.admin.views.pages.bulk_actions import (
- DeleteBulkAction,
- MoveBulkAction,
- PublishBulkAction,
- UnpublishBulkAction,
- )
- from wagtail.admin.viewsets import viewsets
- from wagtail.admin.widgets import Button, ButtonWithDropdownFromHook, PageListingButton
- from wagtail.models import Collection, Page, Task, UserPagePermissionsProxy, Workflow
- from wagtail.permissions import (
- collection_permission_policy,
- task_permission_policy,
- workflow_permission_policy,
- )
- from wagtail.whitelist import allow_without_attributes, attribute_rule, check_url
- class ExplorerMenuItem(MenuItem):
- template = "wagtailadmin/shared/explorer_menu_item.html"
- def is_shown(self, request):
- return user_has_any_page_permission(request.user)
- def get_context(self, request):
- context = super().get_context(request)
- start_page = get_explorable_root_page(request.user)
- if start_page:
- context["start_page_id"] = start_page.id
- return context
- def render_component(self, request):
- start_page = get_explorable_root_page(request.user)
- if start_page:
- return PageExplorerMenuItemComponent(
- self.name,
- self.label,
- self.url,
- start_page.id,
- icon_name=self.icon_name,
- classnames=self.classnames,
- )
- else:
- return super().render_component(request)
- @hooks.register("register_admin_menu_item")
- def register_explorer_menu_item():
- return ExplorerMenuItem(
- _("Pages"),
- reverse("wagtailadmin_explore_root"),
- name="explorer",
- icon_name="folder-open-inverse",
- order=100,
- )
- class SettingsMenuItem(SubmenuMenuItem):
- template = "wagtailadmin/shared/menu_settings_menu_item.html"
- def render_component(self, request):
- return SubMenuItemComponent(
- self.name,
- self.label,
- self.menu.render_component(request),
- icon_name=self.icon_name,
- classnames=self.classnames,
- footer_text="Wagtail v." + __version__,
- )
- @hooks.register("register_admin_menu_item")
- def register_settings_menu():
- return SettingsMenuItem(_("Settings"), settings_menu, icon_name="cogs", order=10000)
- @hooks.register("register_permissions")
- def register_permissions():
- return Permission.objects.filter(
- content_type__app_label="wagtailadmin", codename="access_admin"
- )
- class PageSearchArea(SearchArea):
- def __init__(self):
- super().__init__(
- _("Pages"),
- reverse("wagtailadmin_pages:search"),
- name="pages",
- icon_name="folder-open-inverse",
- order=100,
- )
- def is_shown(self, request):
- return user_has_any_page_permission(request.user)
- @hooks.register("register_admin_search_area")
- def register_pages_search_area():
- return PageSearchArea()
- @hooks.register("register_group_permission_panel")
- def register_collection_permissions_panel():
- return GroupCollectionManagementPermissionFormSet
- class CollectionsMenuItem(MenuItem):
- def is_shown(self, request):
- return collection_permission_policy.user_has_any_permission(
- request.user, ["add", "change", "delete"]
- )
- @hooks.register("register_settings_menu_item")
- def register_collections_menu_item():
- return CollectionsMenuItem(
- _("Collections"),
- reverse("wagtailadmin_collections:index"),
- icon_name="folder-open-1",
- order=700,
- )
- class WorkflowsMenuItem(MenuItem):
- def is_shown(self, request):
- if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
- return False
- return workflow_permission_policy.user_has_any_permission(
- request.user, ["add", "change", "delete"]
- )
- class WorkflowTasksMenuItem(MenuItem):
- def is_shown(self, request):
- if not getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True):
- return False
- return task_permission_policy.user_has_any_permission(
- request.user, ["add", "change", "delete"]
- )
- @hooks.register("register_settings_menu_item")
- def register_workflows_menu_item():
- return WorkflowsMenuItem(
- _("Workflows"),
- reverse("wagtailadmin_workflows:index"),
- icon_name="tasks",
- order=100,
- )
- @hooks.register("register_settings_menu_item")
- def register_workflow_tasks_menu_item():
- return WorkflowTasksMenuItem(
- _("Workflow tasks"),
- reverse("wagtailadmin_workflows:task_index"),
- icon_name="thumbtack",
- order=150,
- )
- @hooks.register("register_page_listing_buttons")
- def page_listing_buttons(page, page_perms, is_parent=False, next_url=None):
- if page_perms.can_edit():
- yield PageListingButton(
- _("Edit"),
- reverse("wagtailadmin_pages:edit", args=[page.id]),
- attrs={
- "aria-label": _("Edit '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=10,
- )
- if page.has_unpublished_changes and page.is_previewable():
- yield PageListingButton(
- _("View draft"),
- reverse("wagtailadmin_pages:view_draft", args=[page.id]),
- attrs={
- "aria-label": _("Preview draft version of '%(title)s'")
- % {"title": page.get_admin_display_title()},
- "rel": "noreferrer",
- },
- priority=20,
- )
- if page.live and page.url:
- yield PageListingButton(
- _("View live"),
- page.url,
- attrs={
- "rel": "noreferrer",
- "aria-label": _("View live version of '%(title)s'")
- % {"title": page.get_admin_display_title()},
- },
- priority=30,
- )
- if page_perms.can_add_subpage():
- if is_parent:
- yield Button(
- _("Add child page"),
- reverse("wagtailadmin_pages:add_subpage", args=[page.id]),
- attrs={
- "aria-label": _("Add a child page to '%(title)s' ")
- % {"title": page.get_admin_display_title()},
- },
- classes={
- "button",
- "button-small",
- "bicolor",
- "icon",
- "white",
- "icon-plus",
- },
- priority=40,
- )
- else:
- yield PageListingButton(
- _("Add child page"),
- reverse("wagtailadmin_pages:add_subpage", args=[page.id]),
- attrs={
- "aria-label": _("Add a child page to '%(title)s' ")
- % {"title": page.get_admin_display_title()}
- },
- priority=40,
- )
- yield ButtonWithDropdownFromHook(
- _("More"),
- hook_name="register_page_listing_more_buttons",
- page=page,
- page_perms=page_perms,
- is_parent=is_parent,
- next_url=next_url,
- attrs={
- "target": "_blank",
- "rel": "noreferrer",
- "title": _("View more options for '%(title)s'")
- % {"title": page.get_admin_display_title()},
- },
- priority=50,
- )
- @hooks.register("register_page_listing_more_buttons")
- def page_listing_more_buttons(page, page_perms, is_parent=False, next_url=None):
- if page_perms.can_move():
- yield Button(
- _("Move"),
- reverse("wagtailadmin_pages:move", args=[page.id]),
- attrs={
- "title": _("Move page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=10,
- )
- if page_perms.can_copy():
- url = reverse("wagtailadmin_pages:copy", args=[page.id])
- if next_url:
- url += "?" + urlencode({"next": next_url})
- yield Button(
- _("Copy"),
- url,
- attrs={
- "title": _("Copy page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=20,
- )
- if page_perms.can_delete():
- url = reverse("wagtailadmin_pages:delete", args=[page.id])
- # After deleting the page, it is impossible to redirect to it.
- if next_url == reverse("wagtailadmin_explore", args=[page.id]):
- next_url = None
- if next_url:
- url += "?" + urlencode({"next": next_url})
- yield Button(
- _("Delete"),
- url,
- attrs={
- "title": _("Delete page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=30,
- )
- if page_perms.can_unpublish():
- url = reverse("wagtailadmin_pages:unpublish", args=[page.id])
- if next_url:
- url += "?" + urlencode({"next": next_url})
- yield Button(
- _("Unpublish"),
- url,
- attrs={
- "title": _("Unpublish page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=40,
- )
- if page_perms.can_view_revisions():
- yield Button(
- _("History"),
- reverse("wagtailadmin_pages:history", args=[page.id]),
- attrs={
- "title": _("View page history for '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=50,
- )
- if is_parent:
- yield Button(
- _("Sort menu order"),
- "?ordering=ord",
- attrs={
- "title": _("Change ordering of child pages of '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=60,
- )
- @hooks.register("register_page_header_buttons")
- def page_header_buttons(page, page_perms, next_url=None):
- if page_perms.can_move():
- yield Button(
- _("Move"),
- reverse("wagtailadmin_pages:move", args=[page.id]),
- attrs={
- "title": _("Move page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=10,
- )
- if page_perms.can_copy():
- url = reverse("wagtailadmin_pages:copy", args=[page.id])
- if next_url:
- url += "?" + urlencode({"next": next_url})
- yield Button(
- _("Copy"),
- url,
- attrs={
- "title": _("Copy page '%(title)s'")
- % {"title": page.get_admin_display_title()}
- },
- priority=20,
- )
- if page_perms.can_add_subpage():
- yield Button(
- _("Add child page"),
- reverse("wagtailadmin_pages:add_subpage", args=[page.id]),
- attrs={
- "aria-label": _("Add a child page to '%(title)s' ")
- % {"title": page.get_admin_display_title()},
- },
- priority=30,
- )
- @hooks.register("register_admin_urls")
- def register_viewsets_urls():
- viewsets.populate()
- return viewsets.get_urlpatterns()
- @hooks.register("register_rich_text_features")
- def register_core_features(features):
- features.register_converter_rule(
- "editorhtml",
- "link",
- [
- WhitelistRule("a", attribute_rule({"href": check_url})),
- LinkTypeRule("page", PageLinkHandler),
- ],
- )
- features.register_converter_rule(
- "editorhtml",
- "bold",
- [
- WhitelistRule("b", allow_without_attributes),
- WhitelistRule("strong", allow_without_attributes),
- ],
- )
- features.register_converter_rule(
- "editorhtml",
- "italic",
- [
- WhitelistRule("i", allow_without_attributes),
- WhitelistRule("em", allow_without_attributes),
- ],
- )
- headings_elements = ["h1", "h2", "h3", "h4", "h5", "h6"]
- for order, element in enumerate(headings_elements):
- features.register_converter_rule(
- "editorhtml", element, [WhitelistRule(element, allow_without_attributes)]
- )
- features.register_converter_rule(
- "editorhtml",
- "ol",
- [
- WhitelistRule("ol", allow_without_attributes),
- WhitelistRule("li", allow_without_attributes),
- ],
- )
- features.register_converter_rule(
- "editorhtml",
- "ul",
- [
- WhitelistRule("ul", allow_without_attributes),
- WhitelistRule("li", allow_without_attributes),
- ],
- )
- # Draftail
- features.register_editor_plugin(
- "draftail", "hr", draftail_features.BooleanFeature("enableHorizontalRule")
- )
- features.register_converter_rule(
- "contentstate",
- "hr",
- {
- "from_database_format": {
- "hr": HorizontalRuleHandler(),
- },
- "to_database_format": {
- "entity_decorators": {
- "HORIZONTAL_RULE": lambda props: DOM.create_element("hr")
- }
- },
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h1",
- draftail_features.BlockFeature(
- {
- "label": "H1",
- "type": "header-one",
- "description": gettext("Heading %(level)d") % {"level": 1},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h1",
- {
- "from_database_format": {
- "h1": BlockElementHandler("header-one"),
- },
- "to_database_format": {"block_map": {"header-one": "h1"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h2",
- draftail_features.BlockFeature(
- {
- "label": "H2",
- "type": "header-two",
- "description": gettext("Heading %(level)d") % {"level": 2},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h2",
- {
- "from_database_format": {
- "h2": BlockElementHandler("header-two"),
- },
- "to_database_format": {"block_map": {"header-two": "h2"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h3",
- draftail_features.BlockFeature(
- {
- "label": "H3",
- "type": "header-three",
- "description": gettext("Heading %(level)d") % {"level": 3},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h3",
- {
- "from_database_format": {
- "h3": BlockElementHandler("header-three"),
- },
- "to_database_format": {"block_map": {"header-three": "h3"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h4",
- draftail_features.BlockFeature(
- {
- "label": "H4",
- "type": "header-four",
- "description": gettext("Heading %(level)d") % {"level": 4},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h4",
- {
- "from_database_format": {
- "h4": BlockElementHandler("header-four"),
- },
- "to_database_format": {"block_map": {"header-four": "h4"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h5",
- draftail_features.BlockFeature(
- {
- "label": "H5",
- "type": "header-five",
- "description": gettext("Heading %(level)d") % {"level": 5},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h5",
- {
- "from_database_format": {
- "h5": BlockElementHandler("header-five"),
- },
- "to_database_format": {"block_map": {"header-five": "h5"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "h6",
- draftail_features.BlockFeature(
- {
- "label": "H6",
- "type": "header-six",
- "description": gettext("Heading %(level)d") % {"level": 6},
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "h6",
- {
- "from_database_format": {
- "h6": BlockElementHandler("header-six"),
- },
- "to_database_format": {"block_map": {"header-six": "h6"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "ul",
- draftail_features.BlockFeature(
- {
- "type": "unordered-list-item",
- "icon": "list-ul",
- "description": gettext("Bulleted list"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "ul",
- {
- "from_database_format": {
- "ul": ListElementHandler("unordered-list-item"),
- "li": ListItemElementHandler(),
- },
- "to_database_format": {
- "block_map": {"unordered-list-item": {"element": "li", "wrapper": "ul"}}
- },
- },
- )
- features.register_editor_plugin(
- "draftail",
- "ol",
- draftail_features.BlockFeature(
- {
- "type": "ordered-list-item",
- "icon": "list-ol",
- "description": gettext("Numbered list"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "ol",
- {
- "from_database_format": {
- "ol": ListElementHandler("ordered-list-item"),
- "li": ListItemElementHandler(),
- },
- "to_database_format": {
- "block_map": {"ordered-list-item": {"element": "li", "wrapper": "ol"}}
- },
- },
- )
- features.register_editor_plugin(
- "draftail",
- "blockquote",
- draftail_features.BlockFeature(
- {
- "type": "blockquote",
- "icon": "openquote",
- "description": gettext("Blockquote"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "blockquote",
- {
- "from_database_format": {
- "blockquote": BlockElementHandler("blockquote"),
- },
- "to_database_format": {"block_map": {"blockquote": "blockquote"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "bold",
- draftail_features.InlineStyleFeature(
- {
- "type": "BOLD",
- "icon": "bold",
- "description": gettext("Bold"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "bold",
- {
- "from_database_format": {
- "b": InlineStyleElementHandler("BOLD"),
- "strong": InlineStyleElementHandler("BOLD"),
- },
- "to_database_format": {"style_map": {"BOLD": "b"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "italic",
- draftail_features.InlineStyleFeature(
- {
- "type": "ITALIC",
- "icon": "italic",
- "description": gettext("Italic"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "italic",
- {
- "from_database_format": {
- "i": InlineStyleElementHandler("ITALIC"),
- "em": InlineStyleElementHandler("ITALIC"),
- },
- "to_database_format": {"style_map": {"ITALIC": "i"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "link",
- draftail_features.EntityFeature(
- {
- "type": "LINK",
- "icon": "link",
- "description": gettext("Link"),
- # We want to enforce constraints on which links can be pasted into rich text.
- # Keep only the attributes Wagtail needs.
- "attributes": ["url", "id", "parentId"],
- "whitelist": {
- # Keep pasted links with http/https protocol, and not-pasted links (href = undefined).
- "href": "^(http:|https:|undefined$)",
- },
- },
- js=[
- "wagtailadmin/js/page-chooser-modal.js",
- ],
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "link",
- {
- "from_database_format": {
- "a[href]": ExternalLinkElementHandler("LINK"),
- 'a[linktype="page"]': PageLinkElementHandler("LINK"),
- },
- "to_database_format": {"entity_decorators": {"LINK": link_entity}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "superscript",
- draftail_features.InlineStyleFeature(
- {
- "type": "SUPERSCRIPT",
- "icon": "superscript",
- "description": gettext("Superscript"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "superscript",
- {
- "from_database_format": {
- "sup": InlineStyleElementHandler("SUPERSCRIPT"),
- },
- "to_database_format": {"style_map": {"SUPERSCRIPT": "sup"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "subscript",
- draftail_features.InlineStyleFeature(
- {
- "type": "SUBSCRIPT",
- "icon": "subscript",
- "description": gettext("Subscript"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "subscript",
- {
- "from_database_format": {
- "sub": InlineStyleElementHandler("SUBSCRIPT"),
- },
- "to_database_format": {"style_map": {"SUBSCRIPT": "sub"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "strikethrough",
- draftail_features.InlineStyleFeature(
- {
- "type": "STRIKETHROUGH",
- "icon": "strikethrough",
- "description": gettext("Strikethrough"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "strikethrough",
- {
- "from_database_format": {
- "s": InlineStyleElementHandler("STRIKETHROUGH"),
- },
- "to_database_format": {"style_map": {"STRIKETHROUGH": "s"}},
- },
- )
- features.register_editor_plugin(
- "draftail",
- "code",
- draftail_features.InlineStyleFeature(
- {
- "type": "CODE",
- "icon": "code",
- "description": gettext("Code"),
- }
- ),
- )
- features.register_converter_rule(
- "contentstate",
- "code",
- {
- "from_database_format": {
- "code": InlineStyleElementHandler("CODE"),
- },
- "to_database_format": {"style_map": {"CODE": "code"}},
- },
- )
- class ReportsMenuItem(SubmenuMenuItem):
- template = "wagtailadmin/shared/menu_submenu_item.html"
- class LockedPagesMenuItem(MenuItem):
- def is_shown(self, request):
- return UserPagePermissionsProxy(request.user).can_remove_locks()
- class WorkflowReportMenuItem(MenuItem):
- def is_shown(self, request):
- return getattr(settings, "WAGTAIL_WORKFLOW_ENABLED", True)
- class SiteHistoryReportMenuItem(MenuItem):
- def is_shown(self, request):
- return UserPagePermissionsProxy(request.user).explorable_pages().exists()
- class AgingPagesReportMenuItem(MenuItem):
- def is_shown(self, request):
- return getattr(settings, "WAGTAIL_AGING_PAGES_ENABLED", True)
- @hooks.register("register_reports_menu_item")
- def register_locked_pages_menu_item():
- return LockedPagesMenuItem(
- _("Locked Pages"),
- reverse("wagtailadmin_reports:locked_pages"),
- icon_name="lock",
- order=700,
- )
- @hooks.register("register_reports_menu_item")
- def register_workflow_report_menu_item():
- return WorkflowReportMenuItem(
- _("Workflows"),
- reverse("wagtailadmin_reports:workflow"),
- icon_name="tasks",
- order=800,
- )
- @hooks.register("register_reports_menu_item")
- def register_workflow_tasks_report_menu_item():
- return WorkflowReportMenuItem(
- _("Workflow tasks"),
- reverse("wagtailadmin_reports:workflow_tasks"),
- icon_name="thumbtack",
- order=900,
- )
- @hooks.register("register_reports_menu_item")
- def register_site_history_report_menu_item():
- return SiteHistoryReportMenuItem(
- _("Site history"),
- reverse("wagtailadmin_reports:site_history"),
- icon_name="history",
- order=1000,
- )
- @hooks.register("register_reports_menu_item")
- def register_aging_pages_report_menu_item():
- return AgingPagesReportMenuItem(
- _("Aging pages"),
- reverse("wagtailadmin_reports:aging_pages"),
- icon_name="time",
- order=1100,
- )
- @hooks.register("register_admin_menu_item")
- def register_reports_menu():
- return ReportsMenuItem(_("Reports"), reports_menu, icon_name="site", order=9000)
- @hooks.register("register_icons")
- def register_icons(icons):
- for icon in [
- "angle-double-left.svg",
- "angle-double-right.svg",
- "arrow-down-big.svg",
- "arrow-down.svg",
- "arrow-left.svg",
- "arrow-right.svg",
- "arrow-up-big.svg",
- "arrow-up.svg",
- "arrows-up-down.svg",
- "bars.svg",
- "bin.svg",
- "bold.svg",
- "chain-broken.svg",
- "check.svg",
- "chevron-down.svg",
- "clipboard-list.svg",
- "code.svg",
- "cog.svg",
- "cogs.svg",
- "collapse-down.svg",
- "collapse-up.svg",
- "comment.svg",
- "comment-add.svg",
- "comment-add-reversed.svg",
- "comment-large.svg",
- "comment-large-outline.svg",
- "comment-large-reversed.svg",
- "cross.svg",
- "date.svg",
- "doc-empty-inverse.svg",
- "doc-empty.svg",
- "doc-full-inverse.svg",
- "doc-full.svg", # aka file-text-alt
- "download-alt.svg",
- "download.svg",
- "draft.svg",
- "duplicate.svg",
- "edit.svg",
- "ellipsis-v.svg",
- "expand-right.svg",
- "error.svg",
- "folder-inverse.svg",
- "folder-open-1.svg",
- "folder-open-inverse.svg",
- "folder.svg",
- "form.svg",
- "grip.svg",
- "group.svg",
- "help.svg",
- "history.svg",
- "home.svg",
- "horizontalrule.svg",
- "image.svg", # aka picture
- "info-circle.svg",
- "italic.svg",
- "link.svg",
- "link-external.svg",
- "list-ol.svg",
- "list-ul.svg",
- "lock-open.svg",
- "lock.svg",
- "login.svg",
- "logout.svg",
- "mail.svg",
- "media.svg",
- "no-view.svg",
- "openquote.svg",
- "order-down.svg",
- "order-up.svg",
- "order.svg",
- "password.svg",
- "pick.svg",
- "pilcrow.svg",
- "placeholder.svg", # aka marquee
- "plus-inverse.svg",
- "plus.svg",
- "radio-empty.svg",
- "radio-full.svg",
- "redirect.svg",
- "repeat.svg",
- "reset.svg",
- "resubmit.svg",
- "search.svg",
- "site.svg",
- "snippet.svg",
- "spinner.svg",
- "strikethrough.svg",
- "success.svg",
- "subscript.svg",
- "superscript.svg",
- "table.svg",
- "tag.svg",
- "tasks.svg",
- "thumbtack.svg",
- "tick-inverse.svg",
- "tick.svg",
- "time.svg",
- "title.svg",
- "undo.svg",
- "uni52.svg", # Is this a redundant icon?
- "upload.svg",
- "user.svg",
- "view.svg",
- "wagtail-inverse.svg",
- "wagtail.svg",
- "warning.svg",
- ]:
- icons.append("wagtailadmin/icons/{}".format(icon))
- return icons
- @hooks.register("construct_homepage_summary_items")
- def add_pages_summary_item(request, items):
- items.insert(0, PagesSummaryItem(request))
- class PageAdminURLFinder:
- def __init__(self, user):
- self.page_perms = user and UserPagePermissionsProxy(user)
- def get_edit_url(self, instance):
- if self.page_perms and not self.page_perms.for_page(instance).can_edit():
- return None
- else:
- return reverse("wagtailadmin_pages:edit", args=(instance.pk,))
- register_admin_url_finder(Page, PageAdminURLFinder)
- class CollectionAdminURLFinder(ModelAdminURLFinder):
- permission_policy = collection_permission_policy
- edit_url_name = "wagtailadmin_collections:edit"
- register_admin_url_finder(Collection, CollectionAdminURLFinder)
- class WorkflowAdminURLFinder(ModelAdminURLFinder):
- permission_policy = workflow_permission_policy
- edit_url_name = "wagtailadmin_workflows:edit"
- register_admin_url_finder(Workflow, WorkflowAdminURLFinder)
- class WorkflowTaskAdminURLFinder(ModelAdminURLFinder):
- permission_policy = task_permission_policy
- edit_url_name = "wagtailadmin_workflows:edit_task"
- register_admin_url_finder(Task, WorkflowTaskAdminURLFinder)
- for action_class in [
- DeleteBulkAction,
- MoveBulkAction,
- PublishBulkAction,
- UnpublishBulkAction,
- ]:
- hooks.register("register_bulk_action", action_class)
|