From a99e0e444ff35f57e89df40030c5b035832497ca Mon Sep 17 00:00:00 2001
From: Maximilian Moser <maximilian.moser@tuwien.ac.at>
Date: Wed, 5 Feb 2025 00:15:59 +0100
Subject: [PATCH] Move Flask config override from ext to startup
* apparently it was a leftover `before_first_request` handler
* reworked it as `finalize_app` entrypoint
* also, added a check if the app config is already a TUW config to avoid
unnecessary nesting
---
invenio_config_tuw/ext.py | 21 ---------------------
invenio_config_tuw/startup.py | 33 +++++++++++++++++++++++++++++++++
pyproject.toml | 2 ++
3 files changed, 35 insertions(+), 21 deletions(-)
diff --git a/invenio_config_tuw/ext.py b/invenio_config_tuw/ext.py
index d21bbc9..341e041 100644
--- a/invenio_config_tuw/ext.py
+++ b/invenio_config_tuw/ext.py
@@ -10,7 +10,6 @@
from typing import List
from flask import current_app
-from flask.config import Config
from flask_minify import Minify
from flask_security.signals import user_registered
from invenio_base.utils import obj_or_import_string
@@ -19,26 +18,6 @@ from . import config
from .auth.utils import auto_trust_user
-class TUWConfig(Config):
- """Override for the Flask config that evaluates the SITE_{API,UI}_URL proxies."""
-
- @classmethod
- def from_flask_config(cls, config):
- """Create a clone of the given config."""
- return cls(config.root_path, config)
-
- def __getitem__(self, key):
- """Return config[key], or str(config[key]) if key is 'SITE_{UI,API}_URL'."""
- value = super().__getitem__(key)
-
- # give special treatment to the URL configuration items:
- # enforce their evaluation as strings
- if key in ("SITE_UI_URL", "SITE_API_URL"):
- value = str(value)
-
- return value
-
-
@user_registered.connect
def auto_trust_new_user(sender, user, **kwargs):
"""Execute `auto_trust_user()` on newly created users.
diff --git a/invenio_config_tuw/startup.py b/invenio_config_tuw/startup.py
index 4fa84a4..73a1b71 100644
--- a/invenio_config_tuw/startup.py
+++ b/invenio_config_tuw/startup.py
@@ -17,6 +17,7 @@ from logging import ERROR
from logging.handlers import SMTPHandler
import importlib_metadata
+from flask.config import Config
from invenio_rdm_records.services.search_params import MyDraftsParam
from invenio_requests.proxies import current_request_type_registry
@@ -24,6 +25,29 @@ from .curations import TUWCurationRequest
from .logs import DetailedFormatter
+class TUWConfig(Config):
+ """Override for the Flask config that evaluates the SITE_{API,UI}_URL proxies."""
+
+ @classmethod
+ def from_flask_config(cls, config):
+ """Create a clone of the given config."""
+ if isinstance(config, TUWConfig):
+ return config
+
+ return cls(config.root_path, config)
+
+ def __getitem__(self, key):
+ """Return config[key], or str(config[key]) if key is 'SITE_{UI,API}_URL'."""
+ value = super().__getitem__(key)
+
+ # give special treatment to the URL configuration items:
+ # enforce their evaluation as strings
+ if key in ("SITE_UI_URL", "SITE_API_URL"):
+ value = str(value)
+
+ return value
+
+
def register_smtp_error_handler(app):
"""Register email error handler to the application."""
handler_name = "invenio-config-tuw-smtp-error-handler"
@@ -109,6 +133,15 @@ def customize_curation_request_type(app):
current_request_type_registry.register_type(TUWCurationRequest(), force=True)
+def override_flask_config(app):
+ """Replace the app's config with our own override.
+
+ This evaluates the ``LocalProxy`` objects used for ``SITE_{API,UI}_URL`` by
+ casting them into strings (which is their expected type).
+ """
+ app.config = TUWConfig.from_flask_config(app.config)
+
+
def patch_flask_create_url_adapter(app):
"""Patch Flask's {host,subdomain}_matching with 3.1 behavior.
diff --git a/pyproject.toml b/pyproject.toml
index e3e12da..dc5cb12 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -81,12 +81,14 @@ invenio_config_tuw_mail_handler = "invenio_config_tuw.startup:register_smtp_erro
invenio_config_tuw_search_drafts = "invenio_config_tuw.startup:override_search_drafts_options"
invenio_config_tuw_curation_settings = "invenio_config_tuw.startup:register_menu_entries"
invenio_config_tuw_curation_request = "invenio_config_tuw.startup:customize_curation_request_type"
+invenio_config_tuw_flask_config = "invenio_config_tuw.startup:override_flask_config"
invenio_config_tuw_patch_flask = "invenio_config_tuw.startup:patch_flask_create_url_adapter"
[project.entry-points."invenio_base.api_finalize_app"]
invenio_config_tuw_mail_handler = "invenio_config_tuw.startup:register_smtp_error_handler"
invenio_config_tuw_search_drafts = "invenio_config_tuw.startup:override_search_drafts_options"
invenio_config_tuw_curation_request = "invenio_config_tuw.startup:customize_curation_request_type"
+invenio_config_tuw_flask_config = "invenio_config_tuw.startup:override_flask_config"
invenio_config_tuw_patch_flask = "invenio_config_tuw.startup:patch_flask_create_url_adapter"
[project.entry-points."invenio_celery.tasks"]
--
GitLab