diff options
Diffstat (limited to 'ishtar_common/models.py')
| -rw-r--r-- | ishtar_common/models.py | 55 | 
1 files changed, 53 insertions, 2 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 98998eb1f..96dfa716c 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -447,7 +447,22 @@ class OwnPerms(object):          return q -class Cached(object): +class CachedGen(object): +    @classmethod +    def refresh_cache(cls): +        raise NotImplementedError() + +    @classmethod +    def _add_cache_key_to_refresh(cls, keys): +        cache_ckey, current_keys = get_cache(cls, ['_current_keys']) +        if type(current_keys) != list: +            current_keys = [] +        if keys not in current_keys: +            current_keys.append(keys) +            cache.set(cache_ckey, current_keys, settings.CACHE_TIMEOUT) + + +class Cached(CachedGen):      slug_field = 'txt_idx'      @classmethod @@ -1187,7 +1202,7 @@ class JsonDataField(models.Model):                  _(u"Content types of the field and of the menu do not match")) -class JsonData(models.Model): +class JsonData(models.Model, CachedGen):      data = JSONField(default={}, db_index=True, blank=True)      class Meta: @@ -1233,6 +1248,42 @@ class JsonData(models.Model):              sections[-1][1].append((field.name, value))          return sections +    @classmethod +    def refresh_cache(cls): +        __, refreshed = get_cache(cls, ['cache_refreshed']) +        if refreshed and time.time() - refreshed < 1: +            return +        cache_ckey, current_keys = get_cache(cls, ['_current_keys']) +        if not current_keys: +            return +        for keys in current_keys: +            if keys[0] == '__get_dynamic_choices': +                cls._get_dynamic_choices(keys[1], force=True) + +    @classmethod +    def _get_dynamic_choices(cls, key, force=False): +        """ +        Get choice from existing values +        :param key: data key +        :param force: if set to True do not use cache +        :return: tuple of choices (id, value) +        """ +        cache_key, value = get_cache(cls, ['__get_dynamic_choices', key]) +        if not force and value: +            return value +        choices = set() +        splitted_key = key[len('data__'):].split('__') +        for obj in cls.objects.filter( +                data__has_key=key[len('data__'):]).values("data").all(): +            value = obj['data'] +            for k in splitted_key: +                value = value[k] +            choices.add(value) +        choices = [('', '')] + [(v, v) for v in sorted(list(choices))] +        cache.set(cache_key, choices, settings.CACHE_SMALLTIMEOUT) +        return choices + +  class Imported(models.Model):      imports = models.ManyToManyField(  | 
