diff options
author | Jeff Balogh <jbalogh@mozilla.com> | 2010-09-03 18:40:49 (GMT) |
---|---|---|
committer | Jeff Balogh <jbalogh@mozilla.com> | 2010-09-03 18:40:49 (GMT) |
commit | 0af82fe265fcc3adace2dca6b9f38b7fe3fba91e (patch) | |
tree | ecd7bc921c854f09ca4d2deb2ff2fbcb3fb70950 /apps/amo | |
parent | c3a5f6371e804b301a83814ae56a82bc49a1b90a (diff) |
context managers for hitting master and turning off caching
Diffstat (limited to 'apps/amo')
-rw-r--r-- | apps/amo/decorators.py | 10 | ||||
-rw-r--r-- | apps/amo/models.py | 35 |
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): |