Skip to content
Snippets Groups Projects

Resolve "Allow overriding settings in trusted apps"

Merged Nik | Klampfradler requested to merge 675-allow-overriding-settings-in-trusted-apps into master
4 files
+ 75
14
Compare changes
  • Side-by-side
  • Inline
Files
4
@@ -3,6 +3,7 @@ from datetime import datetime, timedelta
from importlib import import_module, metadata
from itertools import groupby
from operator import itemgetter
from types import ModuleType
from typing import Any, Callable, Dict, Optional, Sequence, Union
from warnings import warn
@@ -59,9 +60,31 @@ def dt_show_toolbar(request: HttpRequest) -> bool:
return False
def get_app_packages() -> Sequence[str]:
def get_app_packages(only_official: bool = False) -> Sequence[str]:
"""Find all registered apps from the setuptools entrypoint."""
return [f"{ep.module}.{ep.attr}" for ep in metadata.entry_points().get("aleksis.app", [])]
apps = []
for ep in metadata.entry_points().get("aleksis.app", []):
path = f"{ep.module}.{ep.attr}"
if path.startswith("aleksis.apps.") or not only_official:
apps.append(path)
return apps
def get_app_settings_module(app: str) -> Optional[ModuleType]:
"""Get the settings module of an app."""
pkg = ".".join(app.split(".")[:-2])
mod_settings = None
while "." in pkg:
try:
return import_module(pkg + ".settings")
except ImportError:
# Import errors are non-fatal.
pkg = ".".join(pkg.split(".")[:-1])
# The app does not have settings
return None
def merge_app_settings(
@@ -77,18 +100,8 @@ def merge_app_settings(
potentially malicious apps!
"""
for app in get_app_packages():
pkg = ".".join(app.split(".")[:-2])
mod_settings = None
while "." in pkg:
try:
mod_settings = import_module(pkg + ".settings")
except ImportError:
# Import errors are non-fatal.
pkg = ".".join(pkg.split(".")[:-1])
continue
break
mod_settings = get_app_settings_module(app)
if not mod_settings:
# The app does not have settings
continue
app_setting = getattr(mod_settings, setting, None)
@@ -109,6 +122,26 @@ def merge_app_settings(
raise TypeError("Only dict and list settings can be merged.")
def get_app_settings_overrides() -> dict[str, Any]:
"""Get app settings overrides
Official apps (those under the ``aleksis.apps` namespace) can override
or add settings by listing them in their ``settings.overrides``.
"""
overrides = {}
for app in get_app_packages(True):
mod_settings = get_app_settings_module(app)
if not mod_settings:
continue
if hasattr(mod_settings, "overrides"):
for name in mod_settings.overrides:
overrides[name] = getattr(mod_settings, name)
return overrides
def get_site_preferences():
"""Get the preferences manager of the current site."""
from django.contrib.sites.models import Site # noqa
Loading