diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 72b41e0cf..b5e371b25 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -434,6 +434,18 @@ class GeneralType(models.Model): for item in cls.objects.all(): item.generate_key() + @classmethod + def get_cache(cls, slug): + cache_key, value = get_cache(cls, slug) + if value: + return value + try: + obj = cls.objects.get(txt_idx=slug) + cache.set(cache_key, obj, settings.CACHE_TIMEOUT) + return obj + except cls.DoesNotExist: + return None + class ItemKey(models.Model): key = models.CharField(_(u"Key"), max_length=100) @@ -1938,19 +1950,29 @@ class Person(Address, Merge, OwnPerms, ValueGetter): def is_natural(self): return not self.attached_to - def has_right(self, right_name): + def has_right(self, right_name, session=None): if '.' in right_name: right_name = right_name.split('.')[-1] + res, cache_key = "", "" + if session: + cache_key = 'session-{}-{}'.format(session.session_key, right_name) + res = cache.get(cache_key) + if res in (True, False): + return res if type(right_name) in (list, tuple): - return bool(self.person_types.filter( + res = bool(self.person_types.filter( txt_idx__in=right_name).count()) or \ bool(self.person_types.filter( groups__permissions__codename__in=right_name).count()) # or self.person_types.filter(wizard__url_name__in=right_name).count()) - return bool(self.person_types.filter(txt_idx=right_name).count()) or \ - bool(self.person_types.filter( - groups__permissions__codename=right_name).count()) + else: + res = bool(self.person_types.filter(txt_idx=right_name).count()) or \ + bool(self.person_types.filter( + groups__permissions__codename=right_name).count()) # or self.person_types.filter(wizard__url_name=right_name).count()) + if session: + cache.set(cache_key, res, settings.CACHE_SMALLTIMEOUT) + return res def full_label(self): values = [] @@ -2010,12 +2032,24 @@ class IshtarUser(User): return IshtarUser.objects.create(user_ptr=user, username=default, person=person) - def has_right(self, right_name): - return self.person.has_right(right_name) + def has_right(self, right_name, session=None): + return self.person.has_right(right_name, session=session) def full_label(self): return self.person.full_label() + def has_perm(self, perm, model=None, session=None): + if not session: + return super(IshtarUser, self).has_perm(perm, model) + cache_key = 'usersession-{}-{}'.format(session.session_key, perm, + model or 'no') + res = cache.get(cache_key) + if res in (True, False): + return res + res = super(IshtarUser, self).has_perm(perm, model) + cache.set(cache_key, res, settings.CACHE_SMALLTIMEOUT) + return res + class AuthorType(GeneralType): class Meta: |