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: | 
