Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/apps/amo
diff options
context:
space:
mode:
authorJeff Balogh <jbalogh@mozilla.com>2010-09-03 18:40:49 (GMT)
committer Jeff Balogh <jbalogh@mozilla.com>2010-09-03 18:40:49 (GMT)
commit0af82fe265fcc3adace2dca6b9f38b7fe3fba91e (patch)
treeecd7bc921c854f09ca4d2deb2ff2fbcb3fb70950 /apps/amo
parentc3a5f6371e804b301a83814ae56a82bc49a1b90a (diff)
context managers for hitting master and turning off caching
Diffstat (limited to 'apps/amo')
-rw-r--r--apps/amo/decorators.py10
-rw-r--r--apps/amo/models.py35
2 files changed, 43 insertions, 2 deletions
diff --git a/apps/amo/decorators.py b/apps/amo/decorators.py
index 18bfc71..a1a7f6c 100644
--- a/apps/amo/decorators.py
+++ b/apps/amo/decorators.py
@@ -1,3 +1,4 @@
+import contextlib
import functools
import json
@@ -5,6 +6,7 @@ from django import http
from django.contrib.auth import decorators as auth_decorators
from django.utils.http import urlquote
+from .models import use_master, skip_cache
from .urlresolvers import reverse
@@ -58,3 +60,11 @@ def json_view(f):
json_view.error = lambda s: http.HttpResponseBadRequest(
json.dumps(s), content_type='application/json')
+
+
+def write(f):
+ @functools.wraps(f)
+ def wrapper(*args, **kw):
+ with contextlib.nested(use_master(), skip_cache()):
+ return f(*args, **kw)
+ return wrapper
diff --git a/apps/amo/models.py b/apps/amo/models.py
index b3cf400..20ea968 100644
--- a/apps/amo/models.py
+++ b/apps/amo/models.py
@@ -1,14 +1,42 @@
+import contextlib
+import threading
+
from django.db import models
from django.utils import translation
-import queryset_transform
import caching.base
+import multidb.pinning
+import queryset_transform
from translations import transformer
from . import signals
+_locals = threading.local()
+_locals.skip_cache = False
+
+
+@contextlib.contextmanager
+def use_master():
+ """Within this context, all queries go to the master."""
+ multidb.pinning.pin_this_thread()
+ try:
+ yield
+ finally:
+ multidb.pinning.unpin_this_thread()
+
+
+@contextlib.contextmanager
+def skip_cache():
+ """Within this context, no queries come from cache."""
+ _locals.skip_cache = True
+ try:
+ yield
+ finally:
+ _locals.skip_cache = False
+
+
class TransformQuerySet(queryset_transform.TransformQuerySet):
def pop_transforms(self):
@@ -57,7 +85,8 @@ CachingQuerySet.__bases__ = (TransformQuerySet,) + CachingQuerySet.__bases__
class UncachedManagerBase(models.Manager):
def get_query_set(self):
- return self._with_translations(TransformQuerySet(self.model))
+ qs = self._with_translations(TransformQuerySet(self.model))
+ return qs
def _with_translations(self, qs):
# Since we're attaching translations to the object, we need to stick
@@ -88,6 +117,8 @@ class ManagerBase(caching.base.CachingManager, UncachedManagerBase):
def get_query_set(self):
qs = super(ManagerBase, self).get_query_set()
+ if getattr(_locals, 'skip_cache', False):
+ qs = qs.no_cache()
return self._with_translations(qs)
def raw(self, raw_query, params=None, *args, **kwargs):