forked from dpgaspar/Flask-AppBuilder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmenu.py
125 lines (110 loc) · 3.48 KB
/
menu.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from flask import url_for
class MenuItem(object):
name = ""
href = ""
icon = ""
label = ""
baseview = None
childs = []
def __init__(self, name, href="", icon="", label="", childs=None, baseview=None):
self.name = name
self.href = href
self.icon = icon
self.label = label
if self.childs:
self.childs = childs
else:
self.childs = []
self.baseview = baseview
def get_url(self):
if not self.href:
if not self.baseview:
return ""
else:
return url_for(
"{}.{}".format(self.baseview.endpoint, self.baseview.default_view)
)
else:
try:
return url_for(self.href)
except Exception:
return self.href
def __repr__(self):
return self.name
class Menu(object):
menu = None
def __init__(self, reverse=True, extra_classes=""):
self.menu = []
if reverse:
extra_classes = extra_classes + "navbar-inverse"
self.extra_classes = extra_classes
@property
def reverse(self):
return "navbar-inverse" in self.extra_classes
def get_list(self):
return self.menu
def find(self, name, menu=None):
"""
Finds a menu item by name and returns it.
:param name:
The menu item name.
"""
menu = menu or self.menu
for i in menu:
if i.name == name:
return i
else:
if i.childs:
ret_item = self.find(name, menu=i.childs)
if ret_item:
return ret_item
def add_category(self, category, icon="", label="", parent_category=""):
label = label or category
if parent_category == "":
self.menu.append(MenuItem(name=category, icon=icon, label=label))
else:
self.find(category).childs.append(
MenuItem(name=category, icon=icon, label=label)
)
def add_link(
self,
name,
href="",
icon="",
label="",
category="",
category_icon="",
category_label="",
baseview=None,
):
label = label or name
category_label = category_label or category
if category == "":
self.menu.append(
MenuItem(
name=name, href=href, icon=icon, label=label, baseview=baseview
)
)
else:
menu_item = self.find(category)
if menu_item:
new_menu_item = MenuItem(
name=name, href=href, icon=icon, label=label, baseview=baseview
)
menu_item.childs.append(new_menu_item)
else:
self.add_category(
category=category, icon=category_icon, label=category_label
)
new_menu_item = MenuItem(
name=name, href=href, icon=icon, label=label, baseview=baseview
)
self.find(category).childs.append(new_menu_item)
def add_separator(self, category=""):
menu_item = self.find(category)
if menu_item:
menu_item.childs.append(MenuItem("-"))
else:
raise Exception(
"Menu separator does not have correct category {}".format(category)
)