sidebar.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from typing import List
  2. from django import forms
  3. from django.urls import reverse
  4. from django.utils.functional import cached_property
  5. from wagtail.admin.staticfiles import versioned_static
  6. from wagtail.telepath import Adapter, adapter
  7. class BaseSidebarAdapter(Adapter):
  8. @cached_property
  9. def media(self):
  10. return forms.Media(
  11. js=[
  12. versioned_static("wagtailadmin/js/sidebar.js"),
  13. ]
  14. )
  15. # Main menu
  16. class MenuItem:
  17. def __init__(
  18. self, name: str, label: str, icon_name: str = "", classnames: str = ""
  19. ):
  20. self.name = name
  21. self.label = label
  22. self.icon_name = icon_name
  23. self.classnames = classnames
  24. def js_args(self):
  25. return [
  26. {
  27. "name": self.name,
  28. "label": self.label,
  29. "icon_name": self.icon_name,
  30. "classnames": self.classnames,
  31. }
  32. ]
  33. @adapter("wagtail.sidebar.LinkMenuItem", base=BaseSidebarAdapter)
  34. class LinkMenuItem(MenuItem):
  35. def __init__(
  36. self, name: str, label: str, url: str, icon_name: str = "", classnames: str = ""
  37. ):
  38. super().__init__(name, label, icon_name=icon_name, classnames=classnames)
  39. self.url = url
  40. def js_args(self):
  41. args = super().js_args()
  42. args[0]["url"] = self.url
  43. return args
  44. def __eq__(self, other):
  45. return (
  46. self.__class__ == other.__class__
  47. and self.name == other.name
  48. and self.label == other.label
  49. and self.url == other.url
  50. and self.icon_name == other.icon_name
  51. and self.classnames == other.classnames
  52. )
  53. @adapter("wagtail.sidebar.SubMenuItem", base=BaseSidebarAdapter)
  54. class SubMenuItem(MenuItem):
  55. def __init__(
  56. self,
  57. name: str,
  58. label: str,
  59. menu_items: List[MenuItem],
  60. icon_name: str = "",
  61. classnames: str = "",
  62. footer_text: str = "",
  63. ):
  64. super().__init__(name, label, icon_name=icon_name, classnames=classnames)
  65. self.menu_items = menu_items
  66. self.footer_text = footer_text
  67. def js_args(self):
  68. args = super().js_args()
  69. args[0]["footer_text"] = self.footer_text
  70. args.append(self.menu_items)
  71. return args
  72. def __eq__(self, other):
  73. return (
  74. self.__class__ == other.__class__
  75. and self.name == other.name
  76. and self.label == other.label
  77. and self.menu_items == other.menu_items
  78. and self.icon_name == other.icon_name
  79. and self.classnames == other.classnames
  80. and self.footer_text == other.footer_text
  81. )
  82. @adapter("wagtail.sidebar.PageExplorerMenuItem", base=BaseSidebarAdapter)
  83. class PageExplorerMenuItem(LinkMenuItem):
  84. def __init__(
  85. self,
  86. name: str,
  87. label: str,
  88. url: str,
  89. start_page_id: int,
  90. icon_name: str = "",
  91. classnames: str = "",
  92. ):
  93. super().__init__(name, label, url, icon_name=icon_name, classnames=classnames)
  94. self.start_page_id = start_page_id
  95. def js_args(self):
  96. args = super().js_args()
  97. args.append(self.start_page_id)
  98. return args
  99. def __eq__(self, other):
  100. return (
  101. self.__class__ == other.__class__
  102. and self.name == other.name
  103. and self.label == other.label
  104. and self.url == other.url
  105. and self.start_page_id == other.start_page_id
  106. and self.icon_name == other.icon_name
  107. and self.classnames == other.classnames
  108. )
  109. # Modules
  110. @adapter("wagtail.sidebar.WagtailBrandingModule", base=BaseSidebarAdapter)
  111. class WagtailBrandingModule:
  112. def js_args(self):
  113. return [
  114. reverse("wagtailadmin_home"),
  115. ]
  116. @adapter("wagtail.sidebar.SearchModule", base=BaseSidebarAdapter)
  117. class SearchModule:
  118. def __init__(self, search_area):
  119. self.search_area = search_area
  120. def js_args(self):
  121. return [self.search_area.url]
  122. @adapter("wagtail.sidebar.MainMenuModule", base=BaseSidebarAdapter)
  123. class MainMenuModule:
  124. def __init__(
  125. self, menu_items: List[MenuItem], account_menu_items: List[MenuItem], user
  126. ):
  127. self.menu_items = menu_items
  128. self.account_menu_items = account_menu_items
  129. self.user = user
  130. def js_args(self):
  131. from wagtail.admin.templatetags.wagtailadmin_tags import avatar_url
  132. try:
  133. first_name = self.user.first_name
  134. except AttributeError:
  135. first_name = None
  136. return [
  137. self.menu_items,
  138. self.account_menu_items,
  139. {
  140. "name": first_name or self.user.get_username(),
  141. "avatarUrl": avatar_url(self.user, size=50),
  142. },
  143. ]