From 2b583a2d73f29e9855f7299f000aa61abd1bd9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Volkan=20TA=C5=9ECI?= Date: Mon, 17 Aug 2026 20:56:06 +0300 Subject: [PATCH] [IMP] spreadsheet_dashboard_oca: manage dashboard share links Fold the dashboard share management feature previously proposed as the standalone spreadsheet_dashboard_share_oca module into the main module, following maintainer feedback on the original PR. Core's spreadsheet_dashboard only lets users create share links; there is no UI to list or revoke them. This adds a "Manage shares" dialog (list / copy / revoke) and a share-count badge next to the dashboard name, plus an ir.rule letting dashboard managers manage the shares of every user. Python and JS tests are moved along and the module version is bumped to 19.0.2.0.0. --- spreadsheet_dashboard_oca/README.rst | 23 ++- spreadsheet_dashboard_oca/__manifest__.py | 12 +- .../i18n/spreadsheet_dashboard_oca.pot | 62 ++++++++ spreadsheet_dashboard_oca/models/__init__.py | 1 + .../models/spreadsheet_dashboard_share.py | 39 +++++ spreadsheet_dashboard_oca/readme/CONFIGURE.md | 3 + .../readme/DESCRIPTION.md | 4 +- spreadsheet_dashboard_oca/readme/USAGE.md | 7 + .../security/ir_rule.xml | 12 ++ .../static/description/index.html | 47 ++++-- .../static/src/bundle/dashboard_badge.esm.js | 34 ++++ .../static/src/bundle/dashboard_badge.xml | 29 ++++ .../static/src/bundle/share_button.xml | 15 ++ .../src/bundle/share_button_patch.esm.js | 30 ++++ .../share_manage/share_manage_dialog.esm.js | 48 ++++++ .../share_manage/share_manage_dialog.xml | 53 +++++++ .../static/tests/share_manage_dialog.test.js | 79 ++++++++++ spreadsheet_dashboard_oca/tests/__init__.py | 1 + .../tests/test_share_management.py | 146 ++++++++++++++++++ 19 files changed, 628 insertions(+), 17 deletions(-) create mode 100644 spreadsheet_dashboard_oca/models/spreadsheet_dashboard_share.py create mode 100644 spreadsheet_dashboard_oca/readme/CONFIGURE.md create mode 100644 spreadsheet_dashboard_oca/readme/USAGE.md create mode 100644 spreadsheet_dashboard_oca/security/ir_rule.xml create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/dashboard_badge.esm.js create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/dashboard_badge.xml create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/share_button.xml create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/share_button_patch.esm.js create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.esm.js create mode 100644 spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml create mode 100644 spreadsheet_dashboard_oca/static/tests/share_manage_dialog.test.js create mode 100644 spreadsheet_dashboard_oca/tests/__init__.py create mode 100644 spreadsheet_dashboard_oca/tests/test_share_management.py diff --git a/spreadsheet_dashboard_oca/README.rst b/spreadsheet_dashboard_oca/README.rst index ebb36534..29ce78c3 100644 --- a/spreadsheet_dashboard_oca/README.rst +++ b/spreadsheet_dashboard_oca/README.rst @@ -33,13 +33,34 @@ Spreadsheet Dashboard Oca |badge1| |badge2| |badge3| |badge4| |badge5| This module allows to edit spreadsheet dashboards using OCA Spreadsheet -editor. +editor. It also allows to manage the public share links of those +dashboards: list, copy, and revoke them. Dashboard admins can manage the +shares created by any user. **Table of contents** .. contents:: :local: +Configuration +============= + +Users can only see and revoke the shares they created. Users in the +"Dashboards / Admin" group +(spreadsheet_dashboard.group_dashboard_manager) can see and revoke the +shares created by any user. + +Usage +===== + +- Open the "Dashboards" app (Rapor Panelleri). +- Open a dashboard and click on the **Share** button. +- Click on **Manage shares** to list every share link of the dashboard. +- Use the copy button to copy a link, or click **Revoke** to make a link + return a 404 error. +- A badge next to the dashboard name in the sidebar shows the number of + active shares. + Bug Tracker =========== diff --git a/spreadsheet_dashboard_oca/__manifest__.py b/spreadsheet_dashboard_oca/__manifest__.py index dd93ae2d..a2de0aa3 100644 --- a/spreadsheet_dashboard_oca/__manifest__.py +++ b/spreadsheet_dashboard_oca/__manifest__.py @@ -4,8 +4,9 @@ { "name": "Spreadsheet Dashboard Oca", "summary": """ - Use OCA Spreadsheets on dashboards configuration""", - "version": "19.0.1.0.0", + Use OCA Spreadsheets on dashboards configuration and manage + dashboard share links""", + "version": "19.0.2.0.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", @@ -15,6 +16,7 @@ ], "data": [ "security/ir.model.access.csv", + "security/ir_rule.xml", "wizards/spreadsheet_spreadsheet_import.xml", "wizards/spreadsheet_to_dashboard.xml", "views/spreadsheet_dashboard_group_views.xml", @@ -26,8 +28,12 @@ ( "after", "spreadsheet/static/src/o_spreadsheet/o_spreadsheet.js", - "spreadsheet_dashboard_oca/static/src/bundle/*.js", + "spreadsheet_dashboard_oca/static/src/bundle/**/*.js", ), + "spreadsheet_dashboard_oca/static/src/bundle/**/*.xml", + ], + "web.assets_unit_tests": [ + "spreadsheet_dashboard_oca/static/tests/**/*", ], }, } diff --git a/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot b/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot index 756e0a38..10a2e9ea 100644 --- a/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot +++ b/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot @@ -13,11 +13,23 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 +msgid "Actions" +msgstr "" + #. module: spreadsheet_dashboard_oca #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active msgid "Active" msgstr "" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/dashboard_badge.xml:0 +msgid "Active shares" +msgstr "" + #. module: spreadsheet_dashboard_oca #. odoo-javascript #: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 @@ -34,11 +46,28 @@ msgstr "" msgid "Cancel" msgstr "" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 +msgid "Close" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.esm.js:0 +msgid "Copied" +msgstr "" + #. module: spreadsheet_dashboard_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view msgid "Copy" msgstr "" +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard_share +msgid "Copy of a shared dashboard" +msgstr "" + #. module: spreadsheet_dashboard_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form msgid "Create" @@ -50,17 +79,23 @@ msgid "Create dashboard from spreadsheet" msgstr "" #. module: spreadsheet_dashboard_oca +#. odoo-javascript #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 msgid "Created by" msgstr "" #. module: spreadsheet_dashboard_oca +#. odoo-javascript #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 msgid "Created on" msgstr "" #. module: spreadsheet_dashboard_oca +#. odoo-javascript #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 msgid "Dashboard" msgstr "" @@ -81,6 +116,7 @@ msgstr "" #. module: spreadsheet_dashboard_oca #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__display_name +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard_share__display_name #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__display_name #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name msgid "Display Name" @@ -93,6 +129,7 @@ msgstr "" #. module: spreadsheet_dashboard_oca #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__id +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard_share__id #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__id #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id msgid "ID" @@ -113,6 +150,13 @@ msgstr "" msgid "Last Updated on" msgstr "" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_button.xml:0 +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_button_patch.esm.js:0 +msgid "Manage shares" +msgstr "" + #. module: spreadsheet_dashboard_oca #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name msgid "Name" @@ -123,12 +167,30 @@ msgstr "" msgid "New dashboard" msgstr "" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 +msgid "No shares yet." +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 +msgid "Revoke" +msgstr "" + #. module: spreadsheet_dashboard_oca #. odoo-python #: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 msgid "Search operation not supported" msgstr "" +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/share_manage/share_manage_dialog.xml:0 +msgid "Share link" +msgstr "" + #. module: spreadsheet_dashboard_oca #: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id msgid "Spreadsheet" diff --git a/spreadsheet_dashboard_oca/models/__init__.py b/spreadsheet_dashboard_oca/models/__init__.py index c20895dc..44b1b9cb 100644 --- a/spreadsheet_dashboard_oca/models/__init__.py +++ b/spreadsheet_dashboard_oca/models/__init__.py @@ -1 +1,2 @@ from . import spreadsheet_dashboard +from . import spreadsheet_dashboard_share diff --git a/spreadsheet_dashboard_oca/models/spreadsheet_dashboard_share.py b/spreadsheet_dashboard_oca/models/spreadsheet_dashboard_share.py new file mode 100644 index 00000000..d0ffdecb --- /dev/null +++ b/spreadsheet_dashboard_oca/models/spreadsheet_dashboard_share.py @@ -0,0 +1,39 @@ +# Copyright 2026 Volkan Tasci +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class SpreadsheetDashboardShare(models.Model): + _inherit = "spreadsheet.dashboard.share" + + @api.model + def action_get_dashboard_shares(self, dashboard_id): + """Return the shares of a dashboard the current user can see.""" + shares = self.search([("dashboard_id", "=", dashboard_id)]) + return [ + { + "id": share.id, + "full_url": share.full_url, + "create_date": ( + share.create_date.isoformat() if share.create_date else False + ), + "create_uid": ( + share.create_uid.display_name if share.create_uid else False + ), + "name": share.name, + } + for share in shares + ] + + @api.model + def action_unshare(self, share_ids): + """Revoke shares. ir.rule limits the user to the shares they may access.""" + self.browse(share_ids).unlink() + return True + + @api.model + def action_get_share_counts(self): + """Return {dashboard_id: share_count} for shares visible to the user.""" + counts = self._read_group([], ["dashboard_id"], ["__count"]) + return {count[0].id: count[1] for count in counts if count[0]} diff --git a/spreadsheet_dashboard_oca/readme/CONFIGURE.md b/spreadsheet_dashboard_oca/readme/CONFIGURE.md new file mode 100644 index 00000000..c80daf35 --- /dev/null +++ b/spreadsheet_dashboard_oca/readme/CONFIGURE.md @@ -0,0 +1,3 @@ +Users can only see and revoke the shares they created. Users in the +"Dashboards / Admin" group (spreadsheet_dashboard.group_dashboard_manager) +can see and revoke the shares created by any user. diff --git a/spreadsheet_dashboard_oca/readme/DESCRIPTION.md b/spreadsheet_dashboard_oca/readme/DESCRIPTION.md index c230bab9..2d387c2f 100644 --- a/spreadsheet_dashboard_oca/readme/DESCRIPTION.md +++ b/spreadsheet_dashboard_oca/readme/DESCRIPTION.md @@ -1,2 +1,4 @@ This module allows to edit spreadsheet dashboards using OCA Spreadsheet -editor. +editor. It also allows to manage the public share links of those +dashboards: list, copy, and revoke them. Dashboard admins can manage the +shares created by any user. diff --git a/spreadsheet_dashboard_oca/readme/USAGE.md b/spreadsheet_dashboard_oca/readme/USAGE.md new file mode 100644 index 00000000..0b40eae1 --- /dev/null +++ b/spreadsheet_dashboard_oca/readme/USAGE.md @@ -0,0 +1,7 @@ +- Open the "Dashboards" app (Rapor Panelleri). +- Open a dashboard and click on the **Share** button. +- Click on **Manage shares** to list every share link of the dashboard. +- Use the copy button to copy a link, or click **Revoke** to make a link + return a 404 error. +- A badge next to the dashboard name in the sidebar shows the number of + active shares. diff --git a/spreadsheet_dashboard_oca/security/ir_rule.xml b/spreadsheet_dashboard_oca/security/ir_rule.xml new file mode 100644 index 00000000..c891e454 --- /dev/null +++ b/spreadsheet_dashboard_oca/security/ir_rule.xml @@ -0,0 +1,12 @@ + + + + spreadsheet.dashboard.share: manager sees all + + + [(1, '=', 1)] + + diff --git a/spreadsheet_dashboard_oca/static/description/index.html b/spreadsheet_dashboard_oca/static/description/index.html index 1694129e..cee726bc 100644 --- a/spreadsheet_dashboard_oca/static/description/index.html +++ b/spreadsheet_dashboard_oca/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Spreadsheet Dashboard Oca