summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py55
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(