Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,31 @@ in your project settings:

DJANGO_SETTINGS_TIMEOUT = 60 * 60 * 10 # 10 hours


Timeout let's you define cache timeout (in sec.) for each of the
settings. After the given time values gets expired and each of them
will be recalculated (at the moment you ask for the given
setting). Introduced due to django's defaults cache timeout (5 min):
https://docs.djangoproject.com/en/dev/topics/cache/#cache-arguments

If you want to override the cache key maker tell it in the settings:

.. code-block:: python

DJANGO_SETTINGS_CACHE_KEYMAKER = 'myapp.django_settings_keymaker.TenantKeyMaker'

And inherit from the default keymaker. (Example is for django-tenant-schemas based application)

.. code-block:: python

from django.db import connection
from django_settings.keymaker import KeyMaker

class TenantKeyMaker(KeyMaker):
def make(self, method_name, args, kwargs):
key = super().make(method_name, args, kwargs)
key = connection.get_schema()+":"+key
return key


Settings types
--------------
Expand All @@ -166,7 +184,6 @@ Admin

You can manipulate setting via your admin interface.


Changelog
---------

Expand Down
38 changes: 7 additions & 31 deletions django_settings/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,49 +9,25 @@
XXX: the whole mechanism should be fixed as now it's too complicated to explain
"""
from .lazyimport import lazyimport
import importlib

django = lazyimport({
'settings': 'django.conf',
})
config = lazyimport({
'DJANGO_SETTINGS_TIMEOUT': 'django_settings.conf',
'DJANGO_SETTINGS_CACHE_KEYMAKER': 'django_settings.conf'
})


class KeyMaker(object):
def __init__(self, prefix):
self.prefix = prefix

def convert(self, arg):
if isinstance(arg, unicode):
return arg.encode(django.settings.DEFAULT_CHARSET)
else:
return str(arg)

def args_to_key(self, args):
return ":".join(map(self.convert, args))

def kwargs_to_key(self, kwargs):
return ":".join([
"%s:%s" % (self.convert(k), self.convert(v))
for k, v in kwargs.items()
])

def make(self, method_name, args, kwargs):
key = ":".join((
self.prefix,
method_name,
self.args_to_key(args),
self.kwargs_to_key(kwargs),
))
return key


class MethodProxy(object):
def __init__(self, instance, method):
self.instance = instance
self.method = method # accually it's NOT bounded s it's a function!
self._keymaker = KeyMaker(prefix='django_settings')
keymakerklass = config.DJANGO_SETTINGS_CACHE_KEYMAKER
if isinstance(keymakerklass, str):
module_name, class_name = keymakerklass.rsplit(".", 1)
keymakerklass = getattr(importlib.import_module(module_name), class_name)
self._keymaker = keymakerklass(prefix='django_settings')

# NOTE: it's proxy, so let's add at least some basic func properties
self.func_name = self.method.__name__
Expand Down
2 changes: 2 additions & 0 deletions django_settings/conf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from django.conf import settings
from .keymaker import KeyMaker

DJANGO_SETTINGS_UNIQUE_NAMES = getattr(settings, 'DJANGO_SETTINGS_UNIQUE_NAMES', True)
DJANGO_SETTINGS_TIMEOUT = getattr(settings, 'DJANGO_SETTINGS_TIMEOUT', 60 * 60 * 24 * 1) # one day
DJANGO_SETTINGS_CACHE_KEYMAKER = getattr(settings, 'DJANGO_SETTINGS_CACHE_KEYMAKER', KeyMaker)
DJANGO_SETTINGS = getattr(settings, 'DJANGO_SETTINGS', None) or {}
30 changes: 30 additions & 0 deletions django_settings/keymaker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import sys

class KeyMaker(object):
def __init__(self, prefix):
self.prefix = prefix

def convert(self, arg):
if sys.version_info < (3,) and isinstance(arg, unicode):
return arg.encode(django.settings.DEFAULT_CHARSET)
return str(arg)

def args_to_key(self, args):
return ":".join(map(self.convert, args))

def kwargs_to_key(self, kwargs):
return ":".join([
"%s:%s" % (self.convert(k), self.convert(v))
for k, v in kwargs.items()
])

def make(self, method_name, args, kwargs):
key = ":".join((
self.prefix,
method_name,
self.args_to_key(args),
self.kwargs_to_key(kwargs),
))
return key