angrybeanie_wagtail/env/lib/python3.12/site-packages/wagtailmedia/settings.py

123 lines
3.8 KiB
Python
Raw Permalink Normal View History

2025-07-25 21:32:16 +10:00
"""
The wagtailmedia settings are namespaced in the WAGTAILMEDIA setting.
For example your project's `settings.py` file might look like this:
WAGTAILMEDIA = {
"MEDIA_MODEL": "mymedia.CustomMedia",
# ...
}
This module provides the `wagtailmedia_settings` object, that is used to access
the settings. It checks for user settings first, with fallback to defaults.
"""
import warnings
from django.conf import settings
from django.test.signals import setting_changed
DEFAULTS = {
"MEDIA_MODEL": "wagtailmedia.Media",
"MEDIA_FORM_BASE": "",
"AUDIO_EXTENSIONS": ["aac", "aiff", "flac", "m4a", "m4b", "mp3", "ogg", "wav"],
"VIDEO_EXTENSIONS": [
"avi",
"h264",
"m4v",
"mkv",
"mov",
"mp4",
"mpeg",
"mpg",
"ogv",
"webm",
],
}
# List of settings that have been deprecated
DEPRECATED_SETTINGS = []
# List of settings that have been removed
# note: use a tuple of (setting, deprecation warning from deprecation.py)
REMOVED_SETTINGS = []
class WagtailMediaSettings:
"""
A settings object that allows the wagtailmedia settings to be accessed as
properties. For example:
from wagtailmedia.settings import wagtailmedia_settings
print(wagtailmedia_settings.MEDIA_MODEL)
Note:
This is an internal class that is only compatible with settings namespaced
under the WAGTAILMEDIA name. It is not intended to be used by 3rd-party
apps, and test helpers like `override_settings` may not work as expected.
"""
def __init__(self, user_settings=None, defaults=None):
if user_settings:
self._user_settings = self.__check_user_settings(user_settings)
self.defaults = defaults or DEFAULTS
self._cached_attrs = set()
@property
def user_settings(self):
if not hasattr(self, "_user_settings"):
self._user_settings = self.__check_user_settings(
getattr(settings, "WAGTAILMEDIA", {})
)
return self._user_settings
def __getattr__(self, attr):
if attr not in self.defaults:
raise AttributeError(f"Invalid wagtailmedia setting: '{attr}'")
try:
# Check if present in user settings
val = self.user_settings[attr]
except KeyError:
# Fall back to defaults
val = self.defaults[attr]
# Cache the result
self._cached_attrs.add(attr)
setattr(self, attr, val)
return val
def __check_user_settings(self, user_settings):
for setting, category in DEPRECATED_SETTINGS:
if setting in user_settings or hasattr(settings, setting):
new_setting = setting.replace("WAGTAILMEDIA_", "")
warnings.warn(
f"The '{setting}' setting is deprecated and will be removed in the next release, "
f'use WAGTAILMEDIA["{new_setting}"] instead.',
category=category,
stacklevel=2,
)
user_settings[new_setting] = user_settings[setting]
for setting in REMOVED_SETTINGS:
if setting in user_settings:
raise RuntimeError(
f"The '{setting}' setting has been removed. "
f"Please refer to the wagtailmedia documentation for available settings."
)
return user_settings
def reload(self):
for attr in self._cached_attrs:
delattr(self, attr)
self._cached_attrs.clear()
if hasattr(self, "_user_settings"):
delattr(self, "_user_settings")
wagtailmedia_settings = WagtailMediaSettings(None, DEFAULTS)
def reload_wagtailmedia_settings(*args, **kwargs):
setting = kwargs["setting"]
if setting == "WAGTAILMEDIA":
wagtailmedia_settings.reload()
setting_changed.connect(reload_wagtailmedia_settings)