summaryrefslogtreecommitdiff
path: root/ishtar_common/menus.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/menus.py')
-rw-r--r--ishtar_common/menus.py38
1 files changed, 35 insertions, 3 deletions
diff --git a/ishtar_common/menus.py b/ishtar_common/menus.py
index 7cc7b751e..99348fde1 100644
--- a/ishtar_common/menus.py
+++ b/ishtar_common/menus.py
@@ -27,6 +27,8 @@ from django.conf import settings
from django.core.cache import cache
from django.core.urlresolvers import reverse
+from django.contrib.auth.models import User
+
_extra_menus = []
# collect menu from INSTALLED_APPS
for app in settings.INSTALLED_APPS:
@@ -73,6 +75,9 @@ class Menu:
self.items_by_idx = {}
def reinit_menu_for_all_user(self):
+ """
+ Force cache deletion and reinitialization of menu for all
+ """
lst_cache_key = u"{}-{}".format(
settings.PROJECT_SLUG, 'menu_updated_list',
)
@@ -83,6 +88,9 @@ class Menu:
self.init(idx, force=True)
def set_menu_updated_key(self, cache_key, user_id):
+ """
+ Stock updated information in cache
+ """
lst_cache_key = u"{}-{}".format(
settings.PROJECT_SLUG, 'menu_updated_list',
)
@@ -98,8 +106,16 @@ class Menu:
self.initialized = time
def init(self, user_id=0, force=False):
+ """
+ Get or init menu for a user
+ """
if not user_id and self.user:
user_id = self.user.pk
+ else:
+ try:
+ self.user = User.objects.get(pk=user_id)
+ except User.DoesNotExist:
+ return
cache_key = u"{}-{}-{}".format(
settings.PROJECT_SLUG, 'menu_updated',
user_id
@@ -111,18 +127,34 @@ class Menu:
self.set_menu_updated_key(cache_key, user_id)
self.items = {}
self.items_by_idx = {}
- for idx, main_menu in enumerate(self.childs):
+ childs = self.childs[:]
+ for idx, main_menu in enumerate(reversed(self.childs)):
+ if not main_menu.can_be_available(self.user, self.session):
+ childs.pop(len(self.childs) - idx - 1)
+ continue
self.items_by_idx[main_menu.idx] = main_menu
- for child in main_menu.childs:
+ sub_childs = main_menu.childs[:]
+ for s_idx, child in enumerate(reversed(main_menu.childs)):
+ if not child.can_be_available(self.user, self.session):
+ sub_childs.pop(len(main_menu.childs) - s_idx - 1)
+ continue
self.items_by_idx[child.idx] = child
if hasattr(child, 'childs'):
- for subchild in child.childs:
+ sub_sub_childs = child.childs[:]
+ for ss_idx, subchild in enumerate(reversed(child.childs)):
+ if not subchild.can_be_available(
+ self.user, self.session):
+ sub_sub_childs.pop(len(child.childs) - ss_idx - 1)
+ continue
self.items_by_idx[subchild.idx] = subchild
+ child.childs = sub_sub_childs
+ main_menu.childs = sub_childs
selected = main_menu.set_items(
self.user, self.items,
self.current_action, session=self.session)
if selected:
self.selected_idx = idx
+ self.childs = childs
self.initialized = True
def get_current_selection(self, current_path):