From 1e4ac39bb045291176236b5301326d90ce24ef9d Mon Sep 17 00:00:00 2001 From: Ashesh Vashi Date: Wed, 17 Jun 2026 12:47:57 +0530 Subject: [PATCH] fix(cli): register module preferences before set-prefs validation PR #10047 made `Preferences.save_cli()` validate against the registered preference object, but `setup.py set-prefs` only enters `app_context()` and never calls `run_before_app_start()`, leaving `Preferences.modules` empty. Every CLI write then fell into the "Module 'X' is no longer in use." path and was reported as "Invalid value provided". Trigger registration explicitly (run_before_app_start enters both app and test_request contexts internally, satisfying registration callbacks that touch current_user) and propagate the typed error message from save_cli so users see the actual reason a value was rejected. --- web/pgadmin/preferences/__init__.py | 6 +----- web/setup.py | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 13aa2532847..7038c238289 100644 --- a/web/pgadmin/preferences/__init__.py +++ b/web/pgadmin/preferences/__init__.py @@ -313,14 +313,10 @@ def save_pref(data): if data['value'] in ['true','false']: data['value'] = True if data['value'] == 'true' else False - res, _ = Preferences.save_cli( + return Preferences.save_cli( data['mid'], data['category_id'], data['id'], data['user_id'], data['value']) - if not res: - return False - return True - @blueprint.route("/update", methods=["PUT"], endpoint="update_pref") @pga_login_required diff --git a/web/setup.py b/web/setup.py index cdc3e6d0c26..bac6eb825b8 100644 --- a/web/setup.py +++ b/web/setup.py @@ -730,6 +730,18 @@ def set_prefs(username, invalid_prefs = [] invalid_value_prefs = [] valid_prefs = [] + # Module preference objects are registered lazily via + # register_before_app_start() callbacks; pgAdmin4.py runs them at + # web-app startup, but the CLI never does. save_cli() now validates + # against the registered preference type, so we have to trigger + # registration ourselves. PGADMIN_RUNTIME must be set first because + # some register_preferences() methods (e.g. browser) check it; we + # use False so the full server-mode preference set (including + # keyboard shortcuts) is exposed to the CLI. run_before_app_start() + # enters both an app context and a test_request_context internally, + # which registration callbacks that touch current_user require. + app.PGADMIN_RUNTIME = False + app.run_before_app_start() with app.app_context(): from pgadmin.preferences import save_pref for opt in pref_options: @@ -750,13 +762,14 @@ def set_prefs(username, 'name': final_opt[2], 'user_id': user_id, 'value': val} - if save_pref(_row): + ok, msg = save_pref(_row) + if ok: valid_prefs.append(_row) if not json: table.add_row(jsonlib.dumps(_row)) else: - invalid_value_prefs.append(f) + invalid_value_prefs.append((f, msg)) else: invalid_prefs.append(f) @@ -765,10 +778,8 @@ def set_prefs(username, (', ').join( invalid_prefs))) - if len(invalid_value_prefs) >= 1: - print("Invalid value provided for preference(s) " - "[red]{0}[/red].".format( - (', ').join(invalid_value_prefs))) + for name, msg in invalid_value_prefs: + print("Could not set [red]{0}[/red]: {1}".format(name, msg)) if not json and console: print(table)