Added ability to prefix database values. Fixes #24.

This commit is contained in:
Jannis Leidel 2013-02-21 19:27:43 +01:00
parent 21344d9168
commit e9d937be5a
5 changed files with 24 additions and 4 deletions

View file

@ -128,6 +128,12 @@ the ``CACHES`` setting. E.g.::
}
CONSTANCE_DATABASE_CACHE_BACKEND = 'default'
Just like the Redis backend you can set an optional prefix that is used during
database interactions. To keep backward compatibility it defaults to ``''``
(an empty string). To use something else do this::
CONSTANCE_DATABASE_PREFIX = 'constance:myproject:'
.. _django-picklefield: http://pypi.python.org/pypi/django-picklefield/
Usage

View file

@ -1,3 +1,5 @@
import itertools
from django.core.exceptions import ImproperlyConfigured
from django.db.models.signals import post_save
from django.core.cache import get_cache
@ -16,6 +18,7 @@ if settings.DATABASE_CACHE_BACKEND:
"it to a backend that supports cross-process caching."
% settings.DATABASE_CACHE_BACKEND)
class DatabaseBackend(Backend):
def __init__(self):
from constance.backends.database.models import Constance
@ -27,11 +30,19 @@ class DatabaseBackend(Backend):
# Clear simple cache.
post_save.connect(self.clear, sender=self._model)
def add_prefix(self, key):
return "%s%s" % (self._prefix, key)
def mget(self, keys):
for const in self._model._default_manager.filter(key__in=keys):
yield const.key, const.value
if not keys:
return
prefixed_keys = [self.add_prefix(key) for key in keys]
stored = self._model._default_manager.filter(key__in=prefixed_keys)
for key, const in itertools.izip(keys, stored):
yield key, const.value
def get(self, key):
key = self.add_prefix(key)
value = None
if db_cache:
value = db_cache.get(key)
@ -47,7 +58,7 @@ class DatabaseBackend(Backend):
def set(self, key, value):
constance, created = self._model._default_manager.get_or_create(
key=key, defaults={'value': value}
key=self.add_prefix(key), defaults={'value': value}
)
if not created:
constance.value = value

View file

@ -10,6 +10,7 @@ except ImportError:
"django-picklefield which is required for "
"the constance database backend.")
class Constance(models.Model):
key = models.CharField(max_length=255, unique=True)
value = PickledObjectField()

View file

@ -15,7 +15,7 @@ class RedisBackend(Backend):
def __init__(self):
super(RedisBackend, self).__init__()
self._prefix = settings.PREFIX
self._prefix = settings.REDIS_PREFIX
connection_cls = settings.CONNECTION_CLASS
if connection_cls is not None:
self._rd = utils.import_module_attr(connection_cls)()

View file

@ -21,4 +21,6 @@ REDIS_CONNECTION = getattr(settings, 'CONSTANCE_REDIS_CONNECTION',
DATABASE_CACHE_BACKEND = getattr(settings, 'CONSTANCE_DATABASE_CACHE_BACKEND',
None)
DATABASE_PREFIX = getattr(settings, 'CONSTANCE_DATABASE_PREFIX', '')
SUPERUSER_ONLY = getattr(settings, 'CONSTANCE_SUPERUSER_ONLY', True)