""" Export Django settings to templates https://github.com/jakubroztocil/django-settings-export """ from django.conf import settings as django_settings from django.core.exceptions import ImproperlyConfigured __version__ = '1.2.1' VARIABLE_NAME = getattr(django_settings, 'SETTINGS_EXPORT_VARIABLE_NAME', 'settings') class SettingsExportError(ImproperlyConfigured): """Base error indicating misconfiguration.""" class UndefinedSettingError(SettingsExportError): """An undefined setting name included in SETTINGS_EXPORT.""" class UnexportedSettingError(SettingsExportError): """An unexported setting has been accessed from a template.""" def settings_export(request): """ The template context processor that adds settings defined in `SETTINGS_EXPORT` to the context. If SETTINGS_EXPORT_VARIABLE_NAME is not set, the context variable will be `settings`. """ variable_name = getattr(django_settings, 'SETTINGS_EXPORT_VARIABLE_NAME', 'settings') return { variable_name: _get_exported_settings() } class ExportedSettings(dict): def __getitem__(self, item): """Fail loudly if accessing a setting that is not exported.""" try: return super(ExportedSettings, self).__getitem__(item) except KeyError: if hasattr(self, item): # Let the KeyError propagate so that Django templates # can access the existing attribute (e.g. `items()`). raise raise UnexportedSettingError( 'The `{key}` setting key is not accessible' ' from templates: add "{key}" to' ' `settings.SETTINGS_EXPORT` to change that.' .format(key=item) ) def _get_exported_settings(): exported_settings = ExportedSettings() for key in getattr(django_settings, 'SETTINGS_EXPORT', []): try: value = getattr(django_settings, key) except AttributeError: raise UndefinedSettingError( '"settings.%s" is included in settings.SETTINGS_EXPORT ' 'but it does not exist. ' % key ) exported_settings[key] = value return exported_settings