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 @@
+
+