| | 103 | security.declareProtected(VIEW_PERMISSION, 'listPortalTabActions') |
|---|
| | 104 | def listPortalTabActions(self): |
|---|
| | 105 | """ Return all portal actions with 'portal_tabs' category. """ |
|---|
| | 106 | result = [] |
|---|
| | 107 | pu = getToolByName(self, 'plone_utils') |
|---|
| | 108 | |
|---|
| | 109 | if hasattr(pu, 'createTopLevelTabs'): |
|---|
| | 110 | pactions = getToolByName(self, 'portal_actions').listFilteredActionsFor(self) |
|---|
| | 111 | tl_tabs = pu.createTopLevelTabs(pactions) |
|---|
| | 112 | |
|---|
| | 113 | for act in tl_tabs: |
|---|
| | 114 | data = {'title': act['name'], |
|---|
| | 115 | 'id':act['id'], |
|---|
| | 116 | 'actionExpression': act['url']} |
|---|
| | 117 | result.append(data) |
|---|
| | 118 | |
|---|
| | 119 | else: |
|---|
| | 120 | portal = getToolByName(self, 'portal_url').getPortalObject() |
|---|
| | 121 | portal_act = getToolByName(self, 'portal_actions') |
|---|
| | 122 | actions=portal_act._cloneActions() |
|---|
| | 123 | |
|---|
| | 124 | for act in actions: |
|---|
| | 125 | if act.category == 'portal_tabs': |
|---|
| | 126 | data = {'title': act.title, |
|---|
| | 127 | 'id': act.id, |
|---|
| | 128 | 'actionExpression': \ |
|---|
| | 129 | Expression(act.getActionExpression())(createExprContext(portal, portal, portal))} |
|---|
| | 130 | result.append(data) |
|---|
| | 131 | return result |
|---|
| | 132 | |
|---|
| | 133 | security.declareProtected(VIEW_PERMISSION, 'generatesubMenuMapping') |
|---|
| | 134 | def generatesubMenuMapping(self): |
|---|
| | 135 | """ Create top-level subMenu mapping. """ |
|---|
| | 136 | mapping = self._submenu_mapping |
|---|
| | 137 | for item in mapping.keys(): |
|---|
| | 138 | for tab in self.listPortalTabActions(): |
|---|
| | 139 | if item == tab['id']: |
|---|
| | 140 | param = 1 |
|---|
| | 141 | break |
|---|
| | 142 | else: param = 0 |
|---|
| | 143 | if param == 0: del mapping[item] |
|---|
| | 144 | for tab in self.listPortalTabActions(): |
|---|
| | 145 | if tab['id'] not in self._submenu_mapping.keys(): |
|---|
| | 146 | mapping[tab['id']] = '' |
|---|
| | 147 | self._submenu_mapping = mapping |
|---|
| | 148 | return self._submenu_mapping |
|---|
| | 149 | |
|---|
| | 150 | security.declareProtected(VIEW_PERMISSION, 'getMappingKeys') |
|---|
| | 151 | def getMappingKeys(self): |
|---|
| | 152 | """ Return keys from _submenu_mapping. """ |
|---|
| | 153 | return [key for key in self._submenu_mapping.keys()] |
|---|
| | 154 | |
|---|
| | 155 | security.declareProtected(VIEW_PERMISSION, 'getMappingValues') |
|---|
| | 156 | def getMappingValues(self): |
|---|
| | 157 | """ Return values from _submenu_mapping. """ |
|---|
| | 158 | return [value for value in self._submenu_mapping.values()] |
|---|
| | 159 | |
|---|
| | 160 | security.declareProtected(VIEW_PERMISSION, 'getMapping') |
|---|
| | 161 | def getMapping(self): |
|---|
| | 162 | """ Simple accessor """ |
|---|
| | 163 | return self._submenu_mapping |
|---|
| | 164 | |
|---|
| | 165 | security.declareProtected(VIEW_PERMISSION, 'getValueByKey') |
|---|
| | 166 | def getValueByKey(self, key): |
|---|
| | 167 | """ Return value from _submenu_mapping for given key """ |
|---|
| | 168 | try: |
|---|
| | 169 | return self._submenu_mapping[key] |
|---|
| | 170 | except KeyError: |
|---|
| | 171 | return None |
|---|
| | 172 | |
|---|
| | 173 | security.declareProtected(VIEW_PERMISSION, 'validateId') |
|---|
| | 174 | def validateTitle(self, title): |
|---|
| | 175 | """ Safeguard against duplicate title. """ |
|---|
| | 176 | if (title == '') or (title == ' '): |
|---|
| | 177 | raise ValueError, 'Please, enter title' |
|---|
| | 178 | else: return 1 |
|---|
| | 179 | |
|---|
| | 180 | security.declareProtected(VIEW_PERMISSION, 'getElementsBysubMenuPath') |
|---|
| | 181 | def getElementsBysubMenuPath(self, submenu_path): |
|---|
| | 182 | """ Return MenuItem and it's sub_menu field for a given submenu_path """ |
|---|
| | 183 | mapping = self._submenu_mapping |
|---|
| | 184 | LOG('getElementsBysubMenuPath', 111, repr(submenu_path), repr(mapping.keys())) |
|---|
| | 185 | if submenu_path in mapping.keys(): |
|---|
| | 186 | return (mapping[submenu_path], submenu_path, None) |
|---|
| | 187 | LOG('getElementsBysubMenuPath', 111, repr(submenu_path), repr(mapping.keys())) |
|---|
| | 188 | else: |
|---|
| | 189 | submenu_path = submenu_path.strip() |
|---|
| | 190 | path_list = submenu_path.split('/') |
|---|
| | 191 | del path_list[0] |
|---|
| | 192 | top_submenu = mapping[submenu_path.split('/')[0]] |
|---|
| | 193 | return self.parsesubMenuPath(top_submenu, path_list) |
|---|
| | 194 | |
|---|
| | 195 | security.declareProtected(VIEW_PERMISSION, 'parsesubMenuPath') |
|---|
| | 196 | def parsesubMenuPath(self, top_submenu, path_list): |
|---|
| | 197 | """ Parse submenu_path and return corresponding objects """ |
|---|
| | 198 | menuitems = top_submenu.listMenuItems() |
|---|
| | 199 | submenu = top_submenu |
|---|
| | 200 | d = 0 |
|---|
| | 201 | for index in path_list: |
|---|
| | 202 | d += 1 |
|---|
| | 203 | menuitem = menuitems[int(index)] |
|---|
| | 204 | if d != len(path_list): |
|---|
| | 205 | submenu = menuitem.getSubMenu() |
|---|
| | 206 | menuitems = submenu.listMenuItems() |
|---|
| | 207 | if menuitem.getSubMenu(): |
|---|
| | 208 | next_submenu = menuitem.getSubMenu() |
|---|
| | 209 | else: |
|---|
| | 210 | next_submenu = None |
|---|
| | 211 | return (submenu, menuitem, next_submenu) |
|---|
| | 212 | |
|---|
| | 213 | security.declareProtected(VIEW_PERMISSION, 'getLevel') |
|---|
| | 214 | def getLevel(self, submenu, space, list): |
|---|
| | 215 | if submenu != None: |
|---|
| | 216 | # if submenu.listMenuItems() != None: |
|---|
| | 217 | space += ' ' |
|---|
| | 218 | for menuitem in submenu.listMenuItems(): |
|---|
| | 219 | list += space + menuitem.getTitle() + ' == ' + str(menuitem.getSubMenu()) + '\n' |
|---|
| | 220 | list = str(self.getLevel(menuitem.getSubMenu(), space, list)) |
|---|
| | 221 | return list |
|---|
| | 222 | else: return list |
|---|
| | 223 | |
|---|
| | 224 | security.declareProtected(VIEW_PERMISSION, 'getMenuTree') |
|---|
| | 225 | def getMenuTree(self): |
|---|
| | 226 | """ Return all submenu with it's menuitems """ |
|---|
| | 227 | out = '\n' |
|---|
| | 228 | mapping = self._submenu_mapping |
|---|
| | 229 | for item in mapping.items(): |
|---|
| | 230 | space = '' |
|---|
| | 231 | out += space + item[0] + ' --- ' + str(item[1]) + '\n' |
|---|
| | 232 | if item[1] != '': |
|---|
| | 233 | out += space + str(mapping[item[0]]) + '\n' + str(self.getLevel(mapping[item[0]], space, list='')) |
|---|
| | 234 | return out |
|---|
| | 235 | |
|---|
| | 236 | security.declareProtected(VIEW_PERMISSION, 'deletesubMenu') |
|---|
| | 237 | def deletesubMenu( self, submenu_path): |
|---|
| | 238 | """ Delete a submenu for the given menu item. """ |
|---|
| | 239 | mapping = self._submenu_mapping |
|---|
| | 240 | if submenu_path in mapping.keys(): |
|---|
| | 241 | mapping[submenu_path] = '' |
|---|
| | 242 | self._submenu_mapping = mapping |
|---|
| | 243 | else: |
|---|
| | 244 | data = self.getElementsBysubMenuPath(submenu_path) |
|---|
| | 245 | data[1].setSubMenu(None) |
|---|
| | 246 | |
|---|
| | 247 | security.declareProtected(VIEW_PERMISSION, 'manage_deletesubMenu') |
|---|
| | 248 | def manage_deletesubMenu(self, submenu_path, REQUEST=None): |
|---|
| | 249 | """ Delete a submenu for the given portal-tab action via the ZMI. """ |
|---|
| | 250 | self.deletesubMenu(submenu_path) |
|---|
| | 251 | |
|---|
| | 252 | path = submenu_path.split('/') |
|---|
| | 253 | if submenu_path in self._submenu_mapping.keys(): |
|---|
| | 254 | edit_form = 'manage_editsubMenus' |
|---|
| | 255 | new_path = submenu_path |
|---|
| | 256 | else: |
|---|
| | 257 | edit_form = 'manage_editMenuItems' |
|---|
| | 258 | del path[-1] |
|---|
| | 259 | new_path = '/'.join(path) |
|---|
| | 260 | LOG('manage_deletesubMenu', 111, new_path, submenu_path) |
|---|
| | 261 | |
|---|
| | 262 | if REQUEST: |
|---|
| | 263 | REQUEST['RESPONSE'].redirect( '%s/%s' |
|---|
| | 264 | '?manage_tabs_message=SubMenu+deleted.&submenu_path=%s' |
|---|
| | 265 | % (self.absolute_url(), edit_form, new_path) |
|---|
| | 266 | ) |
|---|
| | 267 | |
|---|
| | 268 | security.declareProtected(VIEW_PERMISSION, 'addsubMenu') |
|---|
| | 269 | def addsubMenu(self, submenu_path): |
|---|
| | 270 | """ Add a submenu for the given menu item """ |
|---|
| | 271 | javs = 1 |
|---|
| | 272 | new_submenu = subMenu() |
|---|
| | 273 | mapping = self._submenu_mapping |
|---|
| | 274 | if submenu_path in mapping.keys(): |
|---|
| | 275 | mapping[submenu_path] = new_submenu |
|---|
| | 276 | self._submenu_mapping = mapping |
|---|
| | 277 | else: |
|---|
| | 278 | data = self.getElementsBysubMenuPath(submenu_path) |
|---|
| | 279 | if data == () or data[1] == None: javs = 0 |
|---|
| | 280 | data[1].setSubMenu(new_submenu) |
|---|
| | 281 | return javs |
|---|
| | 282 | |
|---|
| | 283 | security.declareProtected( VIEW_PERMISSION, 'manage_addsubMenu' ) |
|---|
| | 284 | def manage_addsubMenu(self, submenu_path, REQUEST=None): |
|---|
| | 285 | """ Add an sub menu for the given portal-tab action via the ZMI. """ |
|---|
| | 286 | self.addsubMenu(submenu_path) |
|---|
| | 287 | |
|---|
| | 288 | path = submenu_path.split('/') |
|---|
| | 289 | if submenu_path in self._submenu_mapping.keys(): |
|---|
| | 290 | edit_form = 'manage_editsubMenus' |
|---|
| | 291 | new_path = submenu_path |
|---|
| | 292 | else: |
|---|
| | 293 | edit_form = 'manage_editMenuItems' |
|---|
| | 294 | del path[-1] |
|---|
| | 295 | new_path = '/'.join(path) |
|---|
| | 296 | |
|---|
| | 297 | if REQUEST: |
|---|
| | 298 | REQUEST['RESPONSE'].redirect( '%s/%s' |
|---|
| | 299 | '?manage_tabs_message=SubMenu+added.&submenu_path=%s' |
|---|
| | 300 | % (self.absolute_url(), edit_form, new_path) |
|---|
| | 301 | ) |
|---|
| | 302 | |
|---|
| | 303 | security.declareProtected(VIEW_PERMISSION, 'addMenuItem') |
|---|
| | 304 | def addMenuItem(self, submenu_path, title, url=None): |
|---|
| | 305 | """ Add MenuItem """ |
|---|
| | 306 | javs = 1 |
|---|
| | 307 | if self.validateTitle(title) != 1: javs = 0 |
|---|
| | 308 | mapping = self._submenu_mapping |
|---|
| | 309 | if submenu_path in mapping.keys(): |
|---|
| | 310 | submenu = mapping[submenu_path] |
|---|
| | 311 | if submenu == None: javs = 0 |
|---|
| | 312 | else: |
|---|
| | 313 | submenu = self.getElementsBysubMenuPath(submenu_path)[1].getSubMenu() |
|---|
| | 314 | if submenu == None: javs = 0 |
|---|
| | 315 | menuitems = list(submenu._menu_items) |
|---|
| | 316 | menuitems.append(MenuItem(title, url)) |
|---|
| | 317 | submenu._menu_items = tuple(menuitems) |
|---|
| | 318 | if submenu._menu_items == (): javs = 0 |
|---|
| | 319 | return javs |
|---|
| | 320 | |
|---|
| | 321 | security.declareProtected(VIEW_PERMISSION, 'manage_addMenuItem') |
|---|
| | 322 | def manage_addMenuItem(self, submenu_path, title, url=None, REQUEST=None): |
|---|
| | 323 | """ Add MenuItem via ZMI """ |
|---|
| | 324 | self.addMenuItem(submenu_path, title, url) |
|---|
| | 325 | |
|---|
| | 326 | if REQUEST: |
|---|
| | 327 | REQUEST['RESPONSE'].redirect( '%s/manage_editMenuItems' |
|---|
| | 328 | '?manage_tabs_message=MenuItem+\'+%s+\'+added+to+subMenu.&submenu_path=%s' |
|---|
| | 329 | % (self.absolute_url(), title, submenu_path)) |
|---|
| | 330 | |
|---|
| | 331 | security.declareProtected(VIEW_PERMISSION, 'manage_saveMenuItems') |
|---|
| | 332 | def manage_saveMenuItems(self, submenu_path, REQUEST=None): |
|---|
| | 333 | """ Save MenuItems for given subMenu via ZMI. """ |
|---|
| | 334 | records = REQUEST.get('menuitems') |
|---|
| | 335 | mapping = self._submenu_mapping |
|---|
| | 336 | if submenu_path in mapping.keys(): |
|---|
| | 337 | submenu = mapping[submenu_path] |
|---|
| | 338 | else: |
|---|
| | 339 | submenu = self.getElementsBysubMenuPath(submenu_path)[1].getSubMenu() |
|---|
| | 340 | menuitems = submenu._menu_items |
|---|
| | 341 | |
|---|
| | 342 | if records: |
|---|
| | 343 | for i in range(len(menuitems)): |
|---|
| | 344 | menuitems[i].setTitle(records[i].get('title')) |
|---|
| | 345 | menuitems[i].setUrl(records[i].get('url')) |
|---|
| | 346 | submenu._menu_items = tuple( menuitems ) |
|---|
| | 347 | |
|---|
| | 348 | if REQUEST: |
|---|
| | 349 | REQUEST['RESPONSE'].redirect( '%s/manage_editMenuItems' |
|---|
| | 350 | '?manage_tabs_message=MenuItems+list+updated.&submenu_path=%s' |
|---|
| | 351 | % (self.absolute_url(), submenu_path)) |
|---|
| | 352 | |
|---|
| | 353 | security.declareProtected(VIEW_PERMISSION, 'removeMenuItem') |
|---|
| | 354 | def removeMenuItem(self, submenu_path): |
|---|
| | 355 | """ Remove MenuItem """ |
|---|
| | 356 | javs = 1 |
|---|
| | 357 | mapping = self._submenu_mapping |
|---|
| | 358 | path = submenu_path.split('/') |
|---|
| | 359 | if len(path) == 2: |
|---|
| | 360 | submenu = mapping[path[0]] |
|---|
| | 361 | if submenu == None: javs = 0 |
|---|
| | 362 | else: |
|---|
| | 363 | submenu = self.getElementsBysubMenuPath(submenu_path)[0] |
|---|
| | 364 | if submenu == None: javs = 0 |
|---|
| | 365 | menuitems = [item for item in submenu.listMenuItems()] |
|---|
| | 366 | if (menuitems == []) or (menuitems[int(path[-1])] == None): javs = 0 |
|---|
| | 367 | del menuitems[int(path[-1])] |
|---|
| | 368 | submenu._menu_items = tuple(menuitems) |
|---|
| | 369 | if submenu._menu_items == (): javs = 0 |
|---|
| | 370 | return javs |
|---|
| | 371 | |
|---|
| | 372 | security.declareProtected(VIEW_PERMISSION, 'manage_removeMenuItem') |
|---|
| | 373 | def manage_removeMenuItem(self, submenu_path, REQUEST=None): |
|---|
| | 374 | """ Remove MenuItem via ZMI """ |
|---|
| | 375 | self.removeMenuItem(submenu_path) |
|---|
| | 376 | |
|---|
| | 377 | path = submenu_path.split('/') |
|---|
| | 378 | del path[-1] |
|---|
| | 379 | new_path = '/'.join(path) |
|---|
| | 380 | |
|---|
| | 381 | if REQUEST: |
|---|
| | 382 | REQUEST['RESPONSE'].redirect( '%s/manage_editMenuItems' |
|---|
| | 383 | '?manage_tabs_message=MenuItem+removed.&submenu_path=%s' |
|---|
| | 384 | % (self.absolute_url(), new_path)) |
|---|
| | 385 | |
|---|
| | 386 | security.declareProtected(VIEW_PERMISSION, 'moveMenuItemDown') |
|---|
| | 387 | def moveMenuItemDown(self, submenu_path): |
|---|
| | 388 | """ Move the MenuItem down """ |
|---|
| | 389 | javs = 1 |
|---|
| | 390 | mapping = self._submenu_mapping |
|---|
| | 391 | path = submenu_path.split('/') |
|---|
| | 392 | if len(path) == 2: |
|---|
| | 393 | submenu = mapping[path[0]] |
|---|
| | 394 | if submenu == None: javs = 0 |
|---|
| | 395 | else: |
|---|
| | 396 | submenu = self.getElementsBysubMenuPath(submenu_path)[0] |
|---|
| | 397 | if submenu == None: javs = 0 |
|---|
| | 398 | menuitems = [item for item in submenu.listMenuItems()] |
|---|
| | 399 | if menuitems == []: javs = 0 |
|---|
| | 400 | submenu._menu_items = tuple(self.moveItem(path[-1], int(path[-1]) + 1, menuitems)) |
|---|
| | 401 | if submenu._menu_items == (): javs = 0 |
|---|
| | 402 | return javs |
|---|
| | 403 | |
|---|
| | 404 | security.declareProtected(VIEW_PERMISSION, 'moveMenuItemUp') |
|---|
| | 405 | def moveMenuItemUp(self, submenu_path): |
|---|
| | 406 | """ Move the MenuItem up """ |
|---|
| | 407 | javs = 1 |
|---|
| | 408 | mapping = self._submenu_mapping |
|---|
| | 409 | path = submenu_path.split('/') |
|---|
| | 410 | if len(path) == 2: |
|---|
| | 411 | submenu = mapping[path[0]] |
|---|
| | 412 | if submenu == None: javs = 0 |
|---|
| | 413 | else: |
|---|
| | 414 | submenu = self.getElementsBysubMenuPath(submenu_path)[0] |
|---|
| | 415 | if submenu == None: javs = 0 |
|---|
| | 416 | menuitems = [item for item in submenu.listMenuItems()] |
|---|
| | 417 | if menuitems == []: javs = 0 |
|---|
| | 418 | submenu._menu_items = tuple(self.moveItem(path[-1], int(path[-1]) - 1, menuitems)) |
|---|
| | 419 | if submenu._menu_items == (): javs = 0 |
|---|
| | 420 | return javs |
|---|
| | 421 | |
|---|
| | 422 | security.declareProtected(VIEW_PERMISSION, 'manage_moveMenuItemDown') |
|---|
| | 423 | def manage_moveMenuItemDown(self, submenu_path, REQUEST=None): |
|---|
| | 424 | """ Move the MenuItem down via ZMI """ |
|---|
| | 425 | self.moveMenuItemDown(submenu_path) |
|---|
| | 426 | |
|---|
| | 427 | path = submenu_path.split('/') |
|---|
| | 428 | del path[-1] |
|---|
| | 429 | new_path = '/'.join(path) |
|---|
| | 430 | |
|---|
| | 431 | if REQUEST: |
|---|
| | 432 | REQUEST['RESPONSE'].redirect( '%s/manage_editMenuItems' |
|---|
| | 433 | '?manage_tabs_message=MenuItem+moved+down.&submenu_path=%s' |
|---|
| | 434 | % (self.absolute_url(), new_path)) |
|---|
| | 435 | |
|---|
| | 436 | security.declareProtected(VIEW_PERMISSION, 'manage_moveMenuItemUp') |
|---|
| | 437 | def manage_moveMenuItemUp(self, submenu_path, REQUEST=None): |
|---|
| | 438 | """ Move the MenuItem up via ZMI """ |
|---|
| | 439 | self.moveMenuItemUp(submenu_path) |
|---|
| | 440 | |
|---|
| | 441 | path = submenu_path.split('/') |
|---|
| | 442 | del path[-1] |
|---|
| | 443 | new_path = '/'.join(path) |
|---|
| | 444 | |
|---|
| | 445 | if REQUEST: |
|---|
| | 446 | REQUEST['RESPONSE'].redirect( '%s/manage_editMenuItems' |
|---|
| | 447 | '?manage_tabs_message=MenuItem+moved+up.&submenu_path=%s' |
|---|
| | 448 | % (self.absolute_url(), new_path)) |
|---|
| | 449 | |
|---|
| | 450 | security.declareProtected(VIEW_PERMISSION, 'moveItem') |
|---|
| | 451 | def moveItem(self, index, position, menuitems): |
|---|
| | 452 | """ Move an item to the given position.""" |
|---|
| | 453 | if index == position: |
|---|
| | 454 | return |
|---|
| | 455 | elif position < 0: |
|---|
| | 456 | position = 0 |
|---|
| | 457 | menuitems = list(menuitems) |
|---|
| | 458 | menuitem = menuitems.pop(int(index)) |
|---|
| | 459 | menuitems.insert(int(position), menuitem) |
|---|
| | 460 | return menuitems |
|---|
| | 461 | |
|---|
| | 462 | security.declareProtected(VIEW_PERMISSION, 'getMenuItemPosition') |
|---|
| | 463 | def getMenuItemPosition(self, submenu_path): |
|---|
| | 464 | """ Return MenuItem position by submenu_path """ |
|---|
| | 465 | path = submenu_path.split('/') |
|---|
| | 466 | return int(path[-1]) |
|---|
| | 467 | |
|---|