1
2
3
4
5
6
7
8
9
10
11 from AccessControl import ClassSecurityInfo, Permissions
12 from ZenMenu import ZenMenu
13 from Globals import InitializeClass
14 from Acquisition import aq_base, aq_chain
15 from Products.ZenRelations.RelSchema import *
16 from Products.ZenUtils.Utils import cmpClassNames
17 from Products.ZenWidgets import messaging
18
20 """ ZenMenuable is a mixin providing menuing.
21 """
22
23 security = ClassSecurityInfo()
24
25 security.declareProtected('Change Device', 'manage_addZenMenu')
46
47
48 security.declareProtected('Change Device', 'manage_addZenMenuItem')
53 """ Add ZenMenuItem
54 """
55 menu = getattr(self.zenMenus, menuid, None)
56 if not menu: menu = self.manage_addZenMenu(menuid)
57 menu.manage_addZenMenuItem(id, description, action,
58 permissions, isdialog, isglobal,
59 banned_classes, allowed_classes, banned_ids, ordering)
60 if REQUEST:
61 return self.callZenScreen(REQUEST)
62
63
64 security.declareProtected('Change Device', 'manage_deleteZenMenuItem')
72
73
74 security.declareProtected('Change Device', 'manage_saveMenuItemOrdering')
84
85
86 security.declareProtected('Change Device', 'manage_addItemsToZenMenu')
88 """ Add ZenMenuItems to a ZenMenu.
89 Accepts a list of dictionaries.
90 Available keyword args:
91 id
92 description
93 action
94 permissions
95 isglobal
96 isdialog
97 banned_classes
98 allowed_classes
99 banned_ids
100 """
101 if not items:
102 items = [{}]
103 menu = getattr(self.zenMenus, menuid, None)
104 if not menu: menu = self.manage_addZenMenu(menuid)
105 if isinstance(items, dict): items = [items]
106 for item in items:
107 menu.manage_addZenMenuItem(**item)
108 return menu
109
110 security.declareProtected('Change Device', 'buildMenus')
115
116 security.declareProtected('Change Device', 'manage_deleteZenMenu')
130
131
133 """ Build menus for this context, acquiring ZenMenus
134 which in turn acquire ZenMenuItems.
135
136 Pass it a menuid for a list of menuitems,
137 a sequence of menuids for a dict of lists of items,
138 or nothing for a dict of all available menus.
139 """
140 if not context: context=self
141 menus = {}
142 if not isinstance(self, ZenMenuable): return None
143 if isinstance(menuids, (str,unicode)): menuids=[menuids]
144 mychain = aq_chain(context.primaryAq())
145 mychain.reverse()
146 for obj in mychain:
147 if getattr(aq_base(obj), 'zenMenus', None):
148 mens = obj.zenMenus()
149 while mens:
150 c = mens.pop()
151 if menuids and c.id not in menuids: continue
152 menu = menus[c.id] = menus.get(c.id, {})
153 its = c.zenMenuItems()
154 while its:
155 i = its.pop()
156 def permfilter(p):
157 return self.checkRemotePerm(p,context)
158 permok = filter(permfilter,
159 getattr(i,'permissions',('',)))
160 if not permok \
161 or (not getattr(i, 'isglobal', True) and \
162 context!=i.getMenuItemOwner())\
163 or (context.id in i.banned_ids) \
164 or (i.allowed_classes and not \
165 cmpClassNames(context, i.allowed_classes))\
166 or cmpClassNames(context, i.banned_classes):
167 continue
168 menu[i.id] = i
169 keys = menus.keys()
170 for key in keys:
171 menus[key] = menus[key].values()
172 if not menus[key]: del menus[key]
173 if not menus:
174 return None
175 elif len(menus.keys())==1:
176 return menus.values()[0]
177 else:
178 return menus
179
180 InitializeClass(ZenMenuable)
181