# Coverage for /Users/marco/Code/django-rosetta/rosetta/storage : 71.43%

## 67 statements 50 run 17 missing 0 excluded 3 partial

Hot-keys on this page

r m x p toggle line displays

j k next/prev highlighted chunk

0 (zero) top of page

1 (one) first highlighted chunk

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | from django.core.cache import cache from django.conf import settings from django.utils import importlib from django.core.exceptions import ImproperlyConfigured import hashlib import time import six class BaseRosettaStorage(object): def __init__(self, request): self.request = request def get(self, key, default=None): raise NotImplementedError def set(self, key, val): raise NotImplementedError def has(self, key): raise NotImplementedError def delete(self, key): raise NotImplementedError class DummyRosettaStorage(BaseRosettaStorage): def get(self, key, default=None): return default def set(self, key, val): pass def has(self, key): return False def delete(self, key): pass class SessionRosettaStorage(BaseRosettaStorage): def get(self, key, default=None): if key in self.request.session: return self.request.session[key] return default def set(self, key, val): self.request.session[key] = val def has(self, key): return key in self.request.session def delete(self, key): del(self.request.session[key]) class CacheRosettaStorage(BaseRosettaStorage): # unlike the session storage backend, cache is shared among all users # so we need to per-user key prefix, which we store in the session def __init__(self, request): super(CacheRosettaStorage, self).__init__(request) if 'rosetta_cache_storage_key_prefix' in self.request.session: self._key_prefix = self.request.session['rosetta_cache_storage_key_prefix'] else: self._key_prefix = hashlib.new('sha1', six.text_type(time.time()).encode('utf8')).hexdigest() self.request.session['rosetta_cache_storage_key_prefix'] = self._key_prefix 70 if self.request.session['rosetta_cache_storage_key_prefix'] != self._key_prefix: raise ImproperlyConfigured("You can't use the CacheRosettaStorage because your Django Session storage doesn't seem to be working. The CacheRosettaStorage relies on the Django Session storage to avoid conflicts.") # Make sure we're not using DummyCache 74 if 'dummycache' in settings.CACHES['default']['BACKEND'].lower(): raise ImproperlyConfigured("You can't use the CacheRosettaStorage if your cache isn't correctly set up (you are use the DummyCache cache backend).") # Make sure the actually actually works try: self.set('rosetta_cache_test', 'rosetta') 80 if not self.get('rosetta_cache_test') == 'rosetta': raise ImproperlyConfigured("You can't use the CacheRosettaStorage if your cache isn't correctly set up, please double check your Django DATABASES setting and that the cache server is responding.") finally: self.delete('rosetta_cache_test') def get(self, key, default=None): #print ('get', self._key_prefix + key) return cache.get(self._key_prefix + key, default) def set(self, key, val): #print ('set', self._key_prefix + key) cache.set(self._key_prefix + key, val, 86400) def has(self, key): #print ('has', self._key_prefix + key) return (self._key_prefix + key) in cache def delete(self, key): #print ('del', self._key_prefix + key) cache.delete(self._key_prefix + key) def get_storage(request): from rosetta.conf import settings storage_module, storage_class = settings.STORAGE_CLASS.rsplit('.', 1) storage_module = importlib.import_module(storage_module) return getattr(storage_module, storage_class)(request)