Source code for oioioi.base.menu

# coding: utf-8
import bisect
import sys
from operator import attrgetter  # pylint: disable=E0611

from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _

from oioioi.base.permissions import Condition

[docs]class OrderedRegistry(object): """Maintains a collection of values ordered by a separate key.""" def __init__(self): self.items = [] self.keys = []
[docs] def register(self, value, order=sys.maxsize): pos = bisect.bisect_right(self.keys, order) self.items.insert(pos, value) self.keys.insert(pos, order) return value
[docs] def unregister(self, value): pos = self.items.index(value) del self.items[pos] del self.keys[pos]
[docs] def __iter__(self): return iter(self.items)
[docs] def __len__(self): return len(self.items)
[docs] def register_decorator(self, order=sys.maxsize): def decorator(func): self.register(func, order) return func return decorator
#: The default menu registry. Modules should use this to register menu items #: commonly accessible to users. #: The menu registry for the user menu, shown as a drop down when a logged in #: user clicks on its login in the navbar.
[docs]account_menu_registry = MenuRegistry( _("Account Menu"), lambda request: request.user.is_authenticated )
#: The registry for *menus* displayed on the side.
[docs]side_pane_menus_registry = OrderedRegistry()
side_pane_menus_registry.register(menu_registry, order=1000)
[docs]personal_menu_registry = MenuRegistry(_("Personal Menu"))
side_pane_menus_registry.register(personal_menu_registry, order=50) #: The registry for uncollapsed menu in the upper navigation bar.