From 182052078e59429e48cb031a3aea1056deb8189f Mon Sep 17 00:00:00 2001
From: Maximilian Moser <maximilian.moser@tuwien.ac.at>
Date: Thu, 5 Dec 2024 21:34:48 +0100
Subject: [PATCH 1/2] Rework the curation menu entry registration

* replace the removed `@register_menu` decorator, which was using
  `app.before_first_request` under the hood, with a `finalize_app`
  entrypoint function
---
 invenio_config_tuw/startup.py | 48 ++++-------------------------------
 invenio_config_tuw/views.py   | 45 ++++++++++++++++++++++++++++++++
 pyproject.toml                |  4 +--
 3 files changed, 52 insertions(+), 45 deletions(-)
 create mode 100644 invenio_config_tuw/views.py

diff --git a/invenio_config_tuw/startup.py b/invenio_config_tuw/startup.py
index eb3b711..d8ed7b3 100644
--- a/invenio_config_tuw/startup.py
+++ b/invenio_config_tuw/startup.py
@@ -16,13 +16,8 @@ initialized, and thus we can rely on them being already available.
 from logging import ERROR
 from logging.handlers import SMTPHandler
 
-from flask import Blueprint, current_app, flash, render_template, request
-from flask_login import current_user, login_required
-from flask_menu import register_menu
-from invenio_db import db
 from invenio_rdm_records.services.search_params import MyDraftsParam
 
-from .curation import CurationForm
 from .formatters import CustomFormatter
 
 
@@ -96,44 +91,11 @@ def override_search_drafts_options(app):
         pass
 
 
-def create_curation_settings_blueprint(app):
-    """Register the curation settings view after the app has been initialized.
-
-    This is necessary because we're depending on the Flask-Menu extension.
-    """
-    blueprint = Blueprint(
-        "invenio_config_tuw_settings",
-        __name__,
-        url_prefix="/account/settings/curation",
-    )
-
-    @blueprint.route("/", methods=["GET", "POST"])
-    @login_required
-    @register_menu(
-        blueprint,
-        "settings.curation",
+def register_menu_entries(app):
+    """Register the curation setting endpoint in Flask-Menu."""
+    menu = app.extensions["menu"].root()
+    menu.submenu("settings.curation").register(
+        "invenio_config_tuw_settings.curation_settings_view",
         '<i class="file icon"></i> Curation',
         order=1,
     )
-    def curation_settings_view():
-        preferences_curation_form = CurationForm(
-            formdata=None, obj=current_user, prefix="preferences-curation"
-        )
-
-        form_name = request.form.get("submit", None)
-        form = preferences_curation_form if form_name else None
-
-        if form:
-            form.process(formdata=request.form)
-            if form.validate_on_submit():
-                form.populate_obj(current_user)
-                db.session.add(current_user)
-                current_app.extensions["security"].datastore.commit()
-                flash(("Curation settings were updated."), category="success")
-
-        return render_template(
-            "invenio_theme_tuw/settings/curation.html",
-            preferences_curation_form=preferences_curation_form,
-        )
-
-    return blueprint
diff --git a/invenio_config_tuw/views.py b/invenio_config_tuw/views.py
new file mode 100644
index 0000000..b294d22
--- /dev/null
+++ b/invenio_config_tuw/views.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2024 TU Wien.
+#
+# Invenio-Config-TUW is free software; you can redistribute it and/or modify
+# it under the terms of the MIT License; see LICENSE file for more details.
+
+"""Custom view functions for TU Wien."""
+
+from flask import Blueprint, current_app, flash, render_template, request
+from flask_login import current_user, login_required
+from invenio_db import db
+
+from .curation import CurationForm
+
+blueprint = Blueprint(
+    "invenio_config_tuw_settings",
+    __name__,
+    url_prefix="/account/settings/curation",
+)
+
+
+@blueprint.route("/", methods=["GET", "POST"])
+@login_required
+def curation_settings_view():
+    """Page for the curation consent setting in user profiles."""
+    preferences_curation_form = CurationForm(
+        formdata=None, obj=current_user, prefix="preferences-curation"
+    )
+
+    form_name = request.form.get("submit", None)
+    form = preferences_curation_form if form_name else None
+
+    if form:
+        form.process(formdata=request.form)
+        if form.validate_on_submit():
+            form.populate_obj(current_user)
+            db.session.add(current_user)
+            current_app.extensions["security"].datastore.commit()
+            flash(("Curation settings were updated."), category="success")
+
+    return render_template(
+        "invenio_theme_tuw/settings/curation.html",
+        preferences_curation_form=preferences_curation_form,
+    )
diff --git a/pyproject.toml b/pyproject.toml
index b0ca2a0..5ba6349 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,6 @@ dependencies = [
     "Invenio-Search>=2.1.0,<3.0.0",
     "Flask>=2.0.2",
     "Flask-Minify>=0.47",
-    "Flask-Menu<2.0.0",
     "Invenio-DAMAP>=0.1.1"
 ]
 
@@ -70,11 +69,12 @@ invenio_config_tuw = "invenio_config_tuw:InvenioConfigTUW"
 invenio_config_tuw = "invenio_config_tuw:InvenioConfigTUW"
 
 [project.entry-points."invenio_base.blueprints"]
-invenio_config_tuw_settings = "invenio_config_tuw.startup:create_curation_settings_blueprint"
+invenio_config_tuw_settings = "invenio_config_tuw.views:blueprint"
 
 [project.entry-points."invenio_base.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_settings = "invenio_config_tuw.startup:register_menu_entries"
 
 [project.entry-points."invenio_base.api_finalize_app"]
 invenio_config_tuw_mail_handler = "invenio_config_tuw.startup:register_smtp_error_handler"
-- 
GitLab


From beaa094857e2664db98f6e17c766b759dc32cd1a Mon Sep 17 00:00:00 2001
From: Maximilian Moser <maximilian.moser@tuwien.ac.at>
Date: Thu, 5 Dec 2024 21:41:31 +0100
Subject: [PATCH 2/2] Bump version to v2024.4.4

---
 CHANGES.rst                    | 3 ++-
 invenio_config_tuw/__init__.py | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/CHANGES.rst b/CHANGES.rst
index baeccb9..54b4c88 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,13 +8,14 @@
 Changes
 =======
 
-Version 2024.4 (released 2024-11-26, updated 2024-11-29)
+Version 2024.4 (released 2024-11-26, updated 2024-12-05)
 
 - Pin `Flask-Menu`` dependency
 - Add `Invenio-DAMAP` to the dependencies
 - Implement TU Wien user identity generator for connection to DAMAP
 - Cast TISS ID into string for the Invenio-DAMAP integration
 - Send out notification emails when records get published
+- Rework curation menu item registration and unpin `Flask-Menu`
 
 
 Version 2024.3 (released 2024-10-01, updated 2024-11-13)
diff --git a/invenio_config_tuw/__init__.py b/invenio_config_tuw/__init__.py
index f70eb84..3882381 100644
--- a/invenio_config_tuw/__init__.py
+++ b/invenio_config_tuw/__init__.py
@@ -9,6 +9,6 @@
 
 from .ext import InvenioConfigTUW
 
-__version__ = "2024.4.3"
+__version__ = "2024.4.4"
 
 __all__ = ("__version__", "InvenioConfigTUW")
-- 
GitLab