diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-12-08 02:26:03 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-12-08 02:26:03 +0100 |
commit | 0643970751d46b73a7d1c48a6ef6593e7d43c8bc (patch) | |
tree | 5ea46df7c455810a61d3e278a80d6259c645a286 /ishtar_common/menu_base.py | |
parent | 74711e058edeb66d0e3cfb9f8277cab0accf2519 (diff) | |
download | Ishtar-0643970751d46b73a7d1c48a6ef6593e7d43c8bc.tar.bz2 Ishtar-0643970751d46b73a7d1c48a6ef6593e7d43c8bc.zip |
Use cache for faster rights checking
Diffstat (limited to 'ishtar_common/menu_base.py')
-rw-r--r-- | ishtar_common/menu_base.py | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/ishtar_common/menu_base.py b/ishtar_common/menu_base.py index 2331ecbd7..ab0a43d41 100644 --- a/ishtar_common/menu_base.py +++ b/ishtar_common/menu_base.py @@ -17,6 +17,7 @@ # See the file COPYING for details. + class SectionItem: def __init__(self, idx, label, childs=[]): self.idx = idx @@ -25,27 +26,29 @@ class SectionItem: self.available = False self.items = {} - def can_be_available(self, user): + def can_be_available(self, user, session=None): for child in self.childs: - if child.can_be_available(user): + if child.can_be_available(user, session=session): return True return False - def is_available(self, user, obj=None): + def is_available(self, user, obj=None, session=None): for child in self.childs: - if child.is_available(user, obj): + if child.is_available(user, obj, session=session): return True return False - def set_items(self, user, items, current_action=None): + def set_items(self, user, items, current_action=None, session=None): selected = None if user: - self.available = self.can_be_available(user) + self.available = self.can_be_available(user, session=session) for child in self.childs: - selected = child.set_items(user, items, current_action) or selected + selected = child.set_items(user, items, current_action, + session=session) or selected items[child.idx] = child return selected + class MenuItem: def __init__(self, idx, label, model=None, access_controls=[]): self.idx = idx @@ -54,22 +57,24 @@ class MenuItem: self.access_controls = access_controls self.available = False - def can_be_available(self, user): + def can_be_available(self, user, session=None): if not self.access_controls: return True prefix = (self.model._meta.app_label + '.') if self.model else '' for access_control in self.access_controls: access_control = prefix + access_control - if user.has_perm(access_control, self.model) or \ + if hasattr(user, 'ishtaruser') and \ + user.ishtaruser.has_perm(access_control, self.model, + session=session) or \ access_control in user.get_group_permissions(): return True # manage by person type if hasattr(user, 'ishtaruser'): - if user.ishtaruser.has_right(self.idx): + if user.ishtaruser.has_right(self.idx, session=session): return True return False - def is_available(self, user, obj=None): + def is_available(self, user, obj=None, session=None): if not self.access_controls: return True prefix = (self.model._meta.app_label + '.') if self.model else '' @@ -79,13 +84,12 @@ class MenuItem: return True # manage by person type if hasattr(user, 'ishtaruser'): - if ishtar_user.has_right(self.idx): + if user.ishtaruser.has_right(self.idx, session=session): return True return False - def set_items(self, user, items, current_action=None): + def set_items(self, user, items, current_action=None, session=None): if user: - self.available = self.can_be_available(user) + self.available = self.can_be_available(user, session=session) if self.idx == current_action: return True - |