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