Source code for mezzanine.conf.context_processors
from __future__ import unicode_literals
from warnings import warn
from django.utils.encoding import python_2_unicode_compatible
# Deprecated settings and their defaults.
DEPRECATED = {}
[docs]@python_2_unicode_compatible
class TemplateSettings(dict):
"""
Dict wrapper for template settings. This exists to enforce
the restriction of settings in templates to those named in
TEMPLATE_ACCESSIBLE_SETTINGS, and to warn about deprecated settings.
Django's template system attempts a dict-style index lookup before an
attribute lookup when resolving dot notation in template variables, so we
use ``__getitem__()`` this as the primary way of getting at the settings.
"""
def __init__(self, settings, allowed_settings, *args, **kwargs):
super(TemplateSettings, self).__init__(*args, **kwargs)
self.settings = settings
self.allowed_settings = set(allowed_settings)
def __getattr__(self, k):
try:
return self.__getitem__(k)
except KeyError:
raise AttributeError
def __getitem__(self, k):
if k not in self.allowed_settings:
warn("%s is not in TEMPLATE_ACCESSIBLE_SETTINGS." % k)
raise KeyError
if k in DEPRECATED:
warn("%s is deprecated. Please remove it from your templates." % k)
try:
return getattr(self.settings, k)
except AttributeError:
return super(TemplateSettings, self).__getitem__(k)
def __setitem__(self, k, v):
self.allowed_settings.add(k)
super(TemplateSettings, self).__setitem__(k, v)
def __repr__(self):
return repr(dict((k, self[k]) for k in self.allowed_settings
if hasattr(self.settings, k) or k in self))
def __str__(self):
return repr(self)
[docs]def settings(request=None):
"""
Add the settings object to the template context.
"""
from mezzanine.conf import settings
allowed_settings = settings.TEMPLATE_ACCESSIBLE_SETTINGS
template_settings = TemplateSettings(settings, allowed_settings)
template_settings.update(DEPRECATED)
# This is basically the same as the old ADMIN_MEDIA_PREFIX setting,
# we just use it in a few spots in the admin to optionally load a
# file from either grappelli or Django admin if grappelli isn't
# installed. We don't call it ADMIN_MEDIA_PREFIX in order to avoid
# any confusion.
admin_prefix = "grappelli/" if settings.GRAPPELLI_INSTALLED else "admin/"
template_settings["MEZZANINE_ADMIN_PREFIX"] = admin_prefix
return {"settings": template_settings}