From e9d937be5a3efa292b9a876274079aa893cd0c22 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Thu, 21 Feb 2013 19:27:43 +0100 Subject: [PATCH] Added ability to prefix database values. Fixes #24. --- README.rst | 6 ++++++ constance/backends/database/__init__.py | 17 ++++++++++++++--- constance/backends/database/models.py | 1 + constance/backends/redisd.py | 2 +- constance/settings.py | 2 ++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index edb4aa3..dbdae8f 100644 --- a/README.rst +++ b/README.rst @@ -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 diff --git a/constance/backends/database/__init__.py b/constance/backends/database/__init__.py index d0e4bb0..85c9ee4 100644 --- a/constance/backends/database/__init__.py +++ b/constance/backends/database/__init__.py @@ -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 diff --git a/constance/backends/database/models.py b/constance/backends/database/models.py index 27bc3f8..e9964e8 100644 --- a/constance/backends/database/models.py +++ b/constance/backends/database/models.py @@ -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() diff --git a/constance/backends/redisd.py b/constance/backends/redisd.py index b023e38..e806b2b 100644 --- a/constance/backends/redisd.py +++ b/constance/backends/redisd.py @@ -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)() diff --git a/constance/settings.py b/constance/settings.py index 5062199..0db6301 100644 --- a/constance/settings.py +++ b/constance/settings.py @@ -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)