side_panels.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from django.conf import settings
  2. from django.forms import Media
  3. from django.urls import reverse
  4. from django.utils.functional import cached_property
  5. from django.utils.text import capfirst
  6. from django.utils.translation import gettext_lazy
  7. from wagtail.admin.ui.components import Component
  8. from wagtail.models import Page, UserPagePermissionsProxy
  9. class BaseSidePanel(Component):
  10. def __init__(self, object, request):
  11. self.object = object
  12. self.request = request
  13. self.model = type(self.object)
  14. def get_context_data(self, parent_context):
  15. context = {"panel": self, "object": self.object, "request": self.request}
  16. if issubclass(self.model, Page):
  17. context["page"] = self.object
  18. return context
  19. class BaseStatusSidePanel(BaseSidePanel):
  20. name = "status"
  21. title = gettext_lazy("Status")
  22. template_name = "wagtailadmin/shared/side_panels/status.html"
  23. order = 100
  24. toggle_aria_label = gettext_lazy("Toggle status")
  25. toggle_icon_name = "info-circle"
  26. def get_status_templates(self, context):
  27. templates = []
  28. if self.object.pk:
  29. templates += [
  30. "wagtailadmin/shared/side_panels/includes/status/workflow.html",
  31. ]
  32. if context.get("locale"):
  33. templates += ["wagtailadmin/shared/side_panels/includes/status/locale.html"]
  34. return templates
  35. def get_context_data(self, parent_context):
  36. context = super().get_context_data(parent_context)
  37. context["model_name"] = capfirst(self.model._meta.verbose_name)
  38. context["status_templates"] = self.get_status_templates(context)
  39. return context
  40. class PageStatusSidePanel(BaseStatusSidePanel):
  41. def get_status_templates(self, context):
  42. templates = super().get_status_templates(context)
  43. if self.object.pk:
  44. templates += ["wagtailadmin/shared/side_panels/includes/status/locked.html"]
  45. templates += ["wagtailadmin/shared/side_panels/includes/status/privacy.html"]
  46. return templates
  47. def get_context_data(self, parent_context):
  48. context = super().get_context_data(parent_context)
  49. user_perms = UserPagePermissionsProxy(self.request.user)
  50. page = self.object
  51. if page.id:
  52. context.update(
  53. {
  54. "history_url": reverse(
  55. "wagtailadmin_pages:history", args=(page.id,)
  56. ),
  57. "lock_url": reverse("wagtailadmin_pages:lock", args=(page.id,)),
  58. "unlock_url": reverse("wagtailadmin_pages:unlock", args=(page.id,)),
  59. "user_can_lock": user_perms.for_page(page).can_lock(),
  60. "user_can_unlock": user_perms.for_page(page).can_unlock(),
  61. "locale": None,
  62. "translations": [],
  63. }
  64. )
  65. else:
  66. context.update(
  67. {
  68. "locale": None,
  69. "translations": [],
  70. }
  71. )
  72. if getattr(settings, "WAGTAIL_I18N_ENABLED", False):
  73. context.update(
  74. {
  75. "locale": page.locale,
  76. "translations": [
  77. {
  78. "locale": translation.locale,
  79. "url": reverse(
  80. "wagtailadmin_pages:edit", args=[translation.id]
  81. ),
  82. }
  83. for translation in page.get_translations()
  84. .only("id", "locale", "depth")
  85. .select_related("locale")
  86. if user_perms.for_page(translation).can_edit()
  87. ],
  88. # The sum of translated pages plus 1 to account for the current page
  89. "translations_total": page.get_translations().count() + 1,
  90. }
  91. )
  92. context.update(
  93. {
  94. "model_name": self.model.get_verbose_name(),
  95. "model_description": self.model.get_page_description(),
  96. "status_templates": self.get_status_templates(context),
  97. }
  98. )
  99. return context
  100. class CommentsSidePanel(BaseSidePanel):
  101. name = "comments"
  102. title = gettext_lazy("Comments")
  103. template_name = "wagtailadmin/shared/side_panels/comments.html"
  104. order = 300
  105. toggle_aria_label = gettext_lazy("Toggle comments")
  106. toggle_icon_name = "comment"
  107. class PreviewSidePanel(BaseSidePanel):
  108. name = "preview"
  109. title = gettext_lazy("Preview")
  110. template_name = "wagtailadmin/shared/side_panels/preview.html"
  111. order = 400
  112. toggle_aria_label = gettext_lazy("Toggle preview")
  113. toggle_icon_name = "mobile-alt"
  114. class BaseSidePanels:
  115. def __init__(self, request, object):
  116. self.request = request
  117. self.object = object
  118. self.side_panels = [
  119. BaseStatusSidePanel(object, self.request),
  120. ]
  121. def __iter__(self):
  122. return iter(sorted(self.side_panels, key=lambda p: p.order))
  123. @cached_property
  124. def media(self):
  125. media = Media()
  126. for panel in self:
  127. media += panel.media
  128. return media
  129. class PageSidePanels(BaseSidePanels):
  130. def __init__(self, request, page, *, comments_enabled):
  131. super().__init__(request, page)
  132. self.side_panels = [
  133. PageStatusSidePanel(page, self.request),
  134. # PreviewSidePanel(page),
  135. ]
  136. if comments_enabled:
  137. self.side_panels += [
  138. CommentsSidePanel(page, self.request),
  139. ]