summaryrefslogtreecommitdiffstats
path: root/keyedcache/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'keyedcache/models.py')
-rw-r--r--keyedcache/models.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/keyedcache/models.py b/keyedcache/models.py
new file mode 100644
index 00000000..dec68463
--- /dev/null
+++ b/keyedcache/models.py
@@ -0,0 +1,86 @@
+import keyedcache
+import logging
+
+log = logging.getLogger('keyedcache')
+
+class CachedObjectMixin(object):
+ """Provides basic object keyedcache for any objects using this as a mixin."""
+
+ def cache_delete(self, *args, **kwargs):
+ key = self.cache_key(*args, **kwargs)
+ log.debug("clearing cache for %s", key)
+ keyedcache.cache_delete(key, children=True)
+
+ def cache_get(self, *args, **kwargs):
+ key = self.cache_key(*args, **kwargs)
+ return keyedcache.cache_get(key)
+
+ def cache_key(self, *args, **kwargs):
+ keys = [self.__class__.__name__, self]
+ keys.extend(args)
+ return keyedcache.cache_key(keys, **kwargs)
+
+ def cache_reset(self):
+ self.cache_delete()
+ self.cache_set()
+
+ def cache_set(self, *args, **kwargs):
+ val = kwargs.pop('value', self)
+ key = self.cache_key(*args, **kwargs)
+ keyedcache.cache_set(key, value=val)
+
+ def is_cached(self, *args, **kwargs):
+ return keyedcache.is_cached(self.cache_key(*args, **kwargs))
+
+def find_by_id(cls, groupkey, objectid, raises=False):
+ """A helper function to look up an object by id"""
+ ob = None
+ try:
+ ob = keyedcache.cache_get(groupkey, objectid)
+ except keyedcache.NotCachedError, e:
+ try:
+ ob = cls.objects.get(pk=objectid)
+ keyedcache.cache_set(e.key, value=ob)
+
+ except cls.DoesNotExist:
+ log.debug("No such %s: %s", groupkey, objectid)
+ if raises:
+ raise cls.DoesNotExist
+
+ return ob
+
+
+def find_by_key(cls, groupkey, key, raises=False):
+ """A helper function to look up an object by key"""
+ ob = None
+ try:
+ ob = keyedcache.cache_get(groupkey, key)
+ except keyedcache.NotCachedError, e:
+ try:
+ ob = cls.objects.get(key__exact=key)
+ keyedcache.cache_set(e.key, value=ob)
+
+ except cls.DoesNotExist:
+ log.debug("No such %s: %s", groupkey, key)
+ if raises:
+ raise
+
+ return ob
+
+def find_by_slug(cls, groupkey, slug, raises=False):
+ """A helper function to look up an object by slug"""
+ ob = None
+ try:
+ ob = keyedcache.cache_get(groupkey, slug)
+ except keyedcache.NotCachedError, e:
+ try:
+ ob = cls.objects.get(slug__exact=slug)
+ keyedcache.cache_set(e.key, value=ob)
+
+ except cls.DoesNotExist:
+ log.debug("No such %s: %s", groupkey, slug)
+ if raises:
+ raise
+
+ return ob
+