diff --git a/frappe/apps.py b/frappe/apps.py index e3e13f00ef..11cf9e6abd 100644 --- a/frappe/apps.py +++ b/frappe/apps.py @@ -27,9 +27,12 @@ def get_route(app_name): def get_default_path(): - default_app = frappe.db.get_value("User", frappe.session.user, "default_app") - if default_app: - return get_route(default_app) + system_default_app = frappe.get_system_settings("default_app") + user_default_app = frappe.db.get_value("User", frappe.session.user, "default_app") + if system_default_app and not user_default_app: + return get_route(system_default_app) + elif user_default_app: + return get_route(user_default_app) apps = get_apps() if len(apps) == 2: diff --git a/frappe/core/doctype/system_settings/system_settings.js b/frappe/core/doctype/system_settings/system_settings.js index d018d9443e..9a1d045dce 100644 --- a/frappe/core/doctype/system_settings/system_settings.js +++ b/frappe/core/doctype/system_settings/system_settings.js @@ -17,6 +17,10 @@ frappe.ui.form.on("System Settings", { }, }); + frappe.xcall("frappe.apps.get_apps").then((r) => { + frm.set_df_property("default_app", "options", [" ", ...r]); + }); + frm.trigger("set_rounding_method_options"); }, enable_password_policy: function (frm) { diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index d496ebff32..cf51f765e9 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -79,6 +79,8 @@ "strip_exif_metadata_from_uploaded_images", "column_break_uqma", "allowed_file_extensions", + "app_tab", + "default_app", "updates_tab", "system_updates_section", "disable_system_update_notification", @@ -656,12 +658,23 @@ "fieldname": "store_attached_pdf_document", "fieldtype": "Check", "label": "Store Attached PDF Document" + }, + { + "fieldname": "app_tab", + "fieldtype": "Tab Break", + "label": "App" + }, + { + "description": "Redirect to the selected app after login", + "fieldname": "default_app", + "fieldtype": "Select", + "label": "Default App" } ], "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2024-03-23 16:03:39.461597", + "modified": "2024-08-08 20:10:55.939839", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py index 87ed3c8ea9..8069cdfcd1 100644 --- a/frappe/core/doctype/system_settings/system_settings.py +++ b/frappe/core/doctype/system_settings/system_settings.py @@ -36,6 +36,7 @@ class SystemSettings(Document): date_format: DF.Literal[ "yyyy-mm-dd", "dd-mm-yyyy", "dd/mm/yyyy", "dd.mm.yyyy", "mm/dd/yyyy", "mm-dd-yyyy" ] + default_app: DF.Literal[None] deny_multiple_sessions: DF.Check disable_change_log_notification: DF.Check disable_document_sharing: DF.Check @@ -82,7 +83,6 @@ class SystemSettings(Document): ] otp_issuer_name: DF.Data | None password_reset_limit: DF.Int - rate_limit_email_link_login: DF.Int reset_password_link_expiry_duration: DF.Duration | None reset_password_template: DF.Link | None rounding_method: DF.Literal["Banker's Rounding (legacy)", "Banker's Rounding", "Commercial Rounding"] diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 225175e417..bcf55e4e58 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -63,6 +63,7 @@ class User(Document): block_modules: DF.Table[BlockModule] bypass_restrict_ip_check_if_2fa_enabled: DF.Check code_editor_type: DF.Literal["vscode", "vim", "emacs"] + default_app: DF.Literal[None] default_workspace: DF.Link | None defaults: DF.Table[DefaultValue] desk_theme: DF.Literal["Light", "Dark", "Automatic"]