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