diff options
Diffstat (limited to 'ishtar_common/menus.py')
-rw-r--r-- | ishtar_common/menus.py | 38 |
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): |