wagtail_hooks.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. from django.contrib.auth.models import Permission
  2. from django.urls import reverse
  3. from django.utils.translation import ugettext_lazy as _
  4. from wagtail.admin.menu import MenuItem, SubmenuMenuItem, settings_menu
  5. from wagtail.admin.navigation import get_explorable_root_page
  6. from wagtail.admin.rich_text import (
  7. HalloFormatPlugin, HalloHeadingPlugin, HalloListPlugin, HalloPlugin)
  8. from wagtail.admin.search import SearchArea
  9. from wagtail.admin.utils import user_has_any_page_permission
  10. from wagtail.admin.viewsets import viewsets
  11. from wagtail.admin.widgets import Button, ButtonWithDropdownFromHook, PageListingButton
  12. from wagtail.core import hooks
  13. from wagtail.core.permissions import collection_permission_policy
  14. class ExplorerMenuItem(MenuItem):
  15. template = 'wagtailadmin/shared/explorer_menu_item.html'
  16. def is_shown(self, request):
  17. return user_has_any_page_permission(request.user)
  18. def get_context(self, request):
  19. context = super(ExplorerMenuItem, self).get_context(request)
  20. start_page = get_explorable_root_page(request.user)
  21. if start_page:
  22. context['start_page_id'] = start_page.id
  23. return context
  24. @hooks.register('register_admin_menu_item')
  25. def register_explorer_menu_item():
  26. return ExplorerMenuItem(
  27. _('Pages'), reverse('wagtailadmin_explore_root'),
  28. name='explorer',
  29. classnames='icon icon-folder-open-inverse',
  30. order=100)
  31. class SettingsMenuItem(SubmenuMenuItem):
  32. template = 'wagtailadmin/shared/menu_settings_menu_item.html'
  33. @hooks.register('register_admin_menu_item')
  34. def register_settings_menu():
  35. return SettingsMenuItem(
  36. _('Settings'), settings_menu, classnames='icon icon-cogs', order=10000)
  37. @hooks.register('register_permissions')
  38. def register_permissions():
  39. return Permission.objects.filter(content_type__app_label='wagtailadmin', codename='access_admin')
  40. class PageSearchArea(SearchArea):
  41. def __init__(self):
  42. super(PageSearchArea, self).__init__(
  43. _('Pages'), reverse('wagtailadmin_pages:search'),
  44. name='pages',
  45. classnames='icon icon-folder-open-inverse',
  46. order=100)
  47. def is_shown(self, request):
  48. return user_has_any_page_permission(request.user)
  49. @hooks.register('register_admin_search_area')
  50. def register_pages_search_area():
  51. return PageSearchArea()
  52. class CollectionsMenuItem(MenuItem):
  53. def is_shown(self, request):
  54. return collection_permission_policy.user_has_any_permission(
  55. request.user, ['add', 'change', 'delete']
  56. )
  57. @hooks.register('register_settings_menu_item')
  58. def register_collections_menu_item():
  59. return CollectionsMenuItem(_('Collections'), reverse('wagtailadmin_collections:index'), classnames='icon icon-folder-open-1', order=700)
  60. @hooks.register('register_page_listing_buttons')
  61. def page_listing_buttons(page, page_perms, is_parent=False):
  62. if page_perms.can_edit():
  63. yield PageListingButton(
  64. _('Edit'),
  65. reverse('wagtailadmin_pages:edit', args=[page.id]),
  66. attrs={'title': _("Edit '{title}'").format(title=page.get_admin_display_title())},
  67. priority=10
  68. )
  69. if page.has_unpublished_changes:
  70. yield PageListingButton(
  71. _('View draft'),
  72. reverse('wagtailadmin_pages:view_draft', args=[page.id]),
  73. attrs={'title': _("Preview draft version of '{title}'").format(title=page.get_admin_display_title()), 'target': '_blank'},
  74. priority=20
  75. )
  76. if page.live and page.url:
  77. yield PageListingButton(
  78. _('View live'),
  79. page.url,
  80. attrs={'target': "_blank", 'title': _("View live version of '{title}'").format(title=page.get_admin_display_title())},
  81. priority=30
  82. )
  83. if page_perms.can_add_subpage():
  84. if is_parent:
  85. yield Button(
  86. _('Add child page'),
  87. reverse('wagtailadmin_pages:add_subpage', args=[page.id]),
  88. attrs={'title': _("Add a child page to '{title}' ").format(title=page.get_admin_display_title())},
  89. classes={'button', 'button-small', 'bicolor', 'icon', 'white', 'icon-plus'},
  90. priority=40
  91. )
  92. else:
  93. yield PageListingButton(
  94. _('Add child page'),
  95. reverse('wagtailadmin_pages:add_subpage', args=[page.id]),
  96. attrs={'title': _("Add a child page to '{title}' ").format(title=page.get_admin_display_title())},
  97. priority=40
  98. )
  99. yield ButtonWithDropdownFromHook(
  100. _('More'),
  101. hook_name='register_page_listing_more_buttons',
  102. page=page,
  103. page_perms=page_perms,
  104. is_parent=is_parent,
  105. attrs={'target': '_blank', 'title': _("View more options for '{title}'").format(title=page.get_admin_display_title())},
  106. priority=50
  107. )
  108. @hooks.register('register_page_listing_more_buttons')
  109. def page_listing_more_buttons(page, page_perms, is_parent=False):
  110. if page_perms.can_move():
  111. yield Button(
  112. _('Move'),
  113. reverse('wagtailadmin_pages:move', args=[page.id]),
  114. attrs={"title": _("Move page '{title}'").format(title=page.get_admin_display_title())},
  115. priority=10
  116. )
  117. if not page.is_root():
  118. yield Button(
  119. _('Copy'),
  120. reverse('wagtailadmin_pages:copy', args=[page.id]),
  121. attrs={'title': _("Copy page '{title}'").format(title=page.get_admin_display_title())},
  122. priority=20
  123. )
  124. if page_perms.can_delete():
  125. yield Button(
  126. _('Delete'),
  127. reverse('wagtailadmin_pages:delete', args=[page.id]),
  128. attrs={'title': _("Delete page '{title}'").format(title=page.get_admin_display_title())},
  129. priority=30
  130. )
  131. if page_perms.can_unpublish():
  132. yield Button(
  133. _('Unpublish'),
  134. reverse('wagtailadmin_pages:unpublish', args=[page.id]),
  135. attrs={'title': _("Unpublish page '{title}'").format(title=page.get_admin_display_title())},
  136. priority=40
  137. )
  138. if not page.is_root():
  139. yield Button(
  140. _('Revisions'),
  141. reverse('wagtailadmin_pages:revisions_index', args=[page.id]),
  142. attrs={'title': _("View revision history for '{title}'").format(title=page.get_admin_display_title())},
  143. priority=50
  144. )
  145. @hooks.register('register_admin_urls')
  146. def register_viewsets_urls():
  147. viewsets.populate()
  148. return viewsets.get_urlpatterns()
  149. @hooks.register('register_rich_text_features')
  150. def register_core_features(features):
  151. features.register_editor_plugin(
  152. 'hallo', 'hr',
  153. HalloPlugin(
  154. name='hallohr',
  155. js=['wagtailadmin/js/hallo-plugins/hallo-hr.js'],
  156. order=45,
  157. )
  158. )
  159. features.default_features.append('hr')
  160. features.register_editor_plugin(
  161. 'hallo', 'link',
  162. HalloPlugin(
  163. name='hallowagtaillink',
  164. js=['wagtailadmin/js/hallo-plugins/hallo-wagtaillink.js'],
  165. )
  166. )
  167. features.default_features.append('link')
  168. features.register_editor_plugin(
  169. 'hallo', 'bold', HalloFormatPlugin(format_name='bold')
  170. )
  171. features.default_features.append('bold')
  172. features.register_editor_plugin(
  173. 'hallo', 'italic', HalloFormatPlugin(format_name='italic')
  174. )
  175. features.default_features.append('italic')
  176. for element in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:
  177. features.register_editor_plugin(
  178. 'hallo', element, HalloHeadingPlugin(element=element)
  179. )
  180. features.default_features.extend(['h2', 'h3', 'h4'])
  181. features.register_editor_plugin(
  182. 'hallo', 'ol', HalloListPlugin(list_type='ordered')
  183. )
  184. features.default_features.append('ol')
  185. features.register_editor_plugin(
  186. 'hallo', 'ul', HalloListPlugin(list_type='unordered')
  187. )
  188. features.default_features.append('ul')