menu.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. from flask import url_for
  2. class BaseMenu(object):
  3. """
  4. Base menu item
  5. """
  6. def __init__(self, name, class_name=None, icon_type=None, icon_value=None, target=None):
  7. self.name = name
  8. self.class_name = class_name
  9. self.icon_type = icon_type
  10. self.icon_value = icon_value
  11. self.target = target
  12. self.parent = None
  13. self._children = []
  14. def add_child(self, menu):
  15. # TODO: Check if menu item is already assigned to some parent
  16. menu.parent = self
  17. self._children.append(menu)
  18. def get_url(self):
  19. raise NotImplementedError()
  20. def is_category(self):
  21. return False
  22. def is_active(self, view):
  23. for c in self._children:
  24. if c.is_active(view):
  25. return True
  26. return False
  27. def get_class_name(self):
  28. return self.class_name
  29. def get_icon_type(self):
  30. return self.icon_type
  31. def get_icon_value(self):
  32. return self.icon_value
  33. def is_visible(self):
  34. return True
  35. def is_accessible(self):
  36. return True
  37. def get_children(self):
  38. return [c for c in self._children if c.is_accessible() and c.is_visible()]
  39. class MenuCategory(BaseMenu):
  40. """
  41. Menu category item.
  42. """
  43. def get_url(self):
  44. return None
  45. def is_category(self):
  46. return True
  47. def is_visible(self):
  48. for c in self._children:
  49. if c.is_visible():
  50. return True
  51. return False
  52. def is_accessible(self):
  53. for c in self._children:
  54. if c.is_accessible():
  55. return True
  56. return False
  57. class MenuView(BaseMenu):
  58. """
  59. Admin view menu item
  60. """
  61. def __init__(self, name, view=None, cache=True):
  62. super(MenuView, self).__init__(name,
  63. class_name=view.menu_class_name,
  64. icon_type=view.menu_icon_type,
  65. icon_value=view.menu_icon_value)
  66. self._view = view
  67. self._cache = cache
  68. self._cached_url = None
  69. view.menu = self
  70. def get_url(self):
  71. if self._view is None:
  72. return None
  73. if self._cached_url:
  74. return self._cached_url
  75. url = self._view.get_url('%s.%s' % (self._view.endpoint, self._view._default_view))
  76. if self._cache:
  77. self._cached_url = url
  78. return url
  79. def is_active(self, view):
  80. if view == self._view:
  81. return True
  82. return super(MenuView, self).is_active(view)
  83. def is_visible(self):
  84. if self._view is None:
  85. return False
  86. return self._view.is_visible()
  87. def is_accessible(self):
  88. if self._view is None:
  89. return False
  90. return self._view.is_accessible()
  91. class MenuLink(BaseMenu):
  92. """
  93. Link item
  94. """
  95. def __init__(self, name, url=None, endpoint=None, category=None, class_name=None,
  96. icon_type=None, icon_value=None, target=None):
  97. super(MenuLink, self).__init__(name, class_name, icon_type, icon_value, target)
  98. self.category = category
  99. self.url = url
  100. self.endpoint = endpoint
  101. def get_url(self):
  102. return self.url or url_for(self.endpoint)