Index: venv/Lib/site-packages/django/conf/__init__.py |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/venv/Lib/site-packages/django/conf/__init__.py |
@@ -0,0 +1,201 @@ |
+""" |
+Settings and configuration for Django. |
+ |
+Values will be read from the module specified by the DJANGO_SETTINGS_MODULE environment |
+variable, and then from django.conf.global_settings; see the global settings file for |
+a list of all possible variables. |
+""" |
+ |
+import importlib |
+import os |
+import time |
+ |
+from django.conf import global_settings |
+from django.core.exceptions import ImproperlyConfigured |
+from django.utils.functional import LazyObject, empty |
+ |
+ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" |
+ |
+ |
+class LazySettings(LazyObject): |
+ """ |
+ A lazy proxy for either global Django settings or a custom settings object. |
+ The user can manually configure settings prior to using them. Otherwise, |
+ Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE. |
+ """ |
+ def _setup(self, name=None): |
+ """ |
+ Load the settings module pointed to by the environment variable. This |
+ is used the first time we need any settings at all, if the user has not |
+ previously configured the settings manually. |
+ """ |
+ settings_module = os.environ.get(ENVIRONMENT_VARIABLE) |
+ if not settings_module: |
+ desc = ("setting %s" % name) if name else "settings" |
+ raise ImproperlyConfigured( |
+ "Requested %s, but settings are not configured. " |
+ "You must either define the environment variable %s " |
+ "or call settings.configure() before accessing settings." |
+ % (desc, ENVIRONMENT_VARIABLE)) |
+ |
+ self._wrapped = Settings(settings_module) |
+ |
+ def __repr__(self): |
+ # Hardcode the class name as otherwise it yields 'Settings'. |
+ if self._wrapped is empty: |
+ return '<LazySettings [Unevaluated]>' |
+ return '<LazySettings "%(settings_module)s">' % { |
+ 'settings_module': self._wrapped.SETTINGS_MODULE, |
+ } |
+ |
+ def __getattr__(self, name): |
+ """ |
+ Return the value of a setting and cache it in self.__dict__. |
+ """ |
+ if self._wrapped is empty: |
+ self._setup(name) |
+ val = getattr(self._wrapped, name) |
+ self.__dict__[name] = val |
+ return val |
+ |
+ def __setattr__(self, name, value): |
+ """ |
+ Set the value of setting. Clear all cached values if _wrapped changes |
+ (@override_settings does this) or clear single values when set. |
+ """ |
+ if name == '_wrapped': |
+ self.__dict__.clear() |
+ else: |
+ self.__dict__.pop(name, None) |
+ super(LazySettings, self).__setattr__(name, value) |
+ |
+ def __delattr__(self, name): |
+ """ |
+ Delete a setting and clear it from cache if needed. |
+ """ |
+ super(LazySettings, self).__delattr__(name) |
+ self.__dict__.pop(name, None) |
+ |
+ def configure(self, default_settings=global_settings, **options): |
+ """ |
+ Called to manually configure the settings. The 'default_settings' |
+ parameter sets where to retrieve any unspecified values from (its |
+ argument must support attribute access (__getattr__)). |
+ """ |
+ if self._wrapped is not empty: |
+ raise RuntimeError('Settings already configured.') |
+ holder = UserSettingsHolder(default_settings) |
+ for name, value in options.items(): |
+ setattr(holder, name, value) |
+ self._wrapped = holder |
+ |
+ @property |
+ def configured(self): |
+ """ |
+ Returns True if the settings have already been configured. |
+ """ |
+ return self._wrapped is not empty |
+ |
+ |
+class Settings(object): |
+ def __init__(self, settings_module): |
+ # update this dict from global settings (but only for ALL_CAPS settings) |
+ for setting in dir(global_settings): |
+ if setting.isupper(): |
+ setattr(self, setting, getattr(global_settings, setting)) |
+ |
+ # store the settings module in case someone later cares |
+ self.SETTINGS_MODULE = settings_module |
+ |
+ mod = importlib.import_module(self.SETTINGS_MODULE) |
+ |
+ tuple_settings = ( |
+ "INSTALLED_APPS", |
+ "TEMPLATE_DIRS", |
+ "LOCALE_PATHS", |
+ ) |
+ self._explicit_settings = set() |
+ for setting in dir(mod): |
+ if setting.isupper(): |
+ setting_value = getattr(mod, setting) |
+ |
+ if (setting in tuple_settings and |
+ not isinstance(setting_value, (list, tuple))): |
+ raise ImproperlyConfigured("The %s setting must be a list or a tuple. " % setting) |
+ setattr(self, setting, setting_value) |
+ self._explicit_settings.add(setting) |
+ |
+ if not self.SECRET_KEY: |
+ raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") |
+ |
+ if hasattr(time, 'tzset') and self.TIME_ZONE: |
+ # When we can, attempt to validate the timezone. If we can't find |
+ # this file, no check happens and it's harmless. |
+ zoneinfo_root = '/usr/share/zoneinfo' |
+ if (os.path.exists(zoneinfo_root) and not |
+ os.path.exists(os.path.join(zoneinfo_root, *(self.TIME_ZONE.split('/'))))): |
+ raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE) |
+ # Move the time zone info into os.environ. See ticket #2315 for why |
+ # we don't do this unconditionally (breaks Windows). |
+ os.environ['TZ'] = self.TIME_ZONE |
+ time.tzset() |
+ |
+ def is_overridden(self, setting): |
+ return setting in self._explicit_settings |
+ |
+ def __repr__(self): |
+ return '<%(cls)s "%(settings_module)s">' % { |
+ 'cls': self.__class__.__name__, |
+ 'settings_module': self.SETTINGS_MODULE, |
+ } |
+ |
+ |
+class UserSettingsHolder(object): |
+ """ |
+ Holder for user configured settings. |
+ """ |
+ # SETTINGS_MODULE doesn't make much sense in the manually configured |
+ # (standalone) case. |
+ SETTINGS_MODULE = None |
+ |
+ def __init__(self, default_settings): |
+ """ |
+ Requests for configuration variables not in this class are satisfied |
+ from the module specified in default_settings (if possible). |
+ """ |
+ self.__dict__['_deleted'] = set() |
+ self.default_settings = default_settings |
+ |
+ def __getattr__(self, name): |
+ if name in self._deleted: |
+ raise AttributeError |
+ return getattr(self.default_settings, name) |
+ |
+ def __setattr__(self, name, value): |
+ self._deleted.discard(name) |
+ super(UserSettingsHolder, self).__setattr__(name, value) |
+ |
+ def __delattr__(self, name): |
+ self._deleted.add(name) |
+ if hasattr(self, name): |
+ super(UserSettingsHolder, self).__delattr__(name) |
+ |
+ def __dir__(self): |
+ return sorted( |
+ s for s in list(self.__dict__) + dir(self.default_settings) |
+ if s not in self._deleted |
+ ) |
+ |
+ def is_overridden(self, setting): |
+ deleted = (setting in self._deleted) |
+ set_locally = (setting in self.__dict__) |
+ set_on_default = getattr(self.default_settings, 'is_overridden', lambda s: False)(setting) |
+ return (deleted or set_locally or set_on_default) |
+ |
+ def __repr__(self): |
+ return '<%(cls)s>' % { |
+ 'cls': self.__class__.__name__, |
+ } |
+ |
+ |
+settings = LazySettings() |