Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions base_view_action_visibility/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

===========================
Base View Action Visibility
===========================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3e14bf64536a24db79c8623c6e64f6005a0865e85d3d163b0907435d44535d29
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github
:target: https://github.com/OCA/server-ux/tree/15.0/base_view_action_visibility
:alt: OCA/server-ux
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-ux-15-0/server-ux-15-0-base_view_action_visibility
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=15.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows restricting standard view actions (Duplicate and Delete) on a per-model
basis through configuration on the ir.model settings. You can restrict these actions to
specific security groups, or leave them unrestricted to allow all users to see them.

The Duplicate action restriction applies to form views, while the Delete action restriction
applies to form, tree, and kanban views.

Note: This module controls the visibility of UI actions only. It does not enforce server-side restrictions.

**Table of contents**

.. contents::
:local:

Configuration
=============

To configure action visibility for a model:

#. Activate developer mode.
#. Go to *Settings > Technical > Database Structure > Models*.
#. Select the model for which you want to restrict actions.
#. In the *View Action Visibility* section:

* Add groups to *Duplicate Allowed Groups* to restrict the duplicate action in form views to only those groups. Leave empty to allow all users to duplicate.
* Add groups to *Delete Allowed Groups* to restrict the delete action in form, tree, and kanban views to only those groups. Leave empty to allow all users to delete.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-ux/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/server-ux/issues/new?body=module:%20base_view_action_visibility%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* Quartile

Contributors
~~~~~~~~~~~~

* `Quartile <https://www.quartile.co>`_:

* Aung Ko Ko Lin

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/server-ux <https://github.com/OCA/server-ux/tree/15.0/base_view_action_visibility>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions base_view_action_visibility/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
15 changes: 15 additions & 0 deletions base_view_action_visibility/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright 2026 Quartile (https://www.quartile.co)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Base View Action Visibility",
"summary": "Hide standard view actions (Duplicate, Delete) per model",
"version": "15.0.1.0.0",
"category": "Server tools",
"website": "https://github.com/OCA/server-ux",
"author": "Quartile, Odoo Community Association (OCA)",
"license": "AGPL-3",
"depends": ["base"],
"data": [
"views/ir_model_views.xml",
],
}
2 changes: 2 additions & 0 deletions base_view_action_visibility/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import ir_model
from . import models
27 changes: 27 additions & 0 deletions base_view_action_visibility/models/ir_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Copyright 2026 Quartile (https://www.quartile.co)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class IrModel(models.Model):
_inherit = "ir.model"

duplicate_allowed_group_ids = fields.Many2many(
"res.groups",
"ir_model_duplicate_group_rel",
"model_id",
"group_id",
string="Duplicate Allowed Groups",
help="Restrict the 'Duplicate' action in form views to these groups. "
"Leave empty to allow all users to duplicate records.",
)
delete_allowed_group_ids = fields.Many2many(
"res.groups",
"ir_model_delete_group_rel",
"model_id",
"group_id",
string="Delete Allowed Groups",
help="Restrict the 'Delete' action in form, tree, and kanban views to these groups. "
"Leave empty to allow all users to delete records.",
)
40 changes: 40 additions & 0 deletions base_view_action_visibility/models/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Copyright 2026 Quartile (https://www.quartile.co)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from lxml import etree

from odoo import models


class Base(models.AbstractModel):
_inherit = "base"

def _should_hide_action(self, allowed_group_ids):
if not allowed_group_ids:
return False
user_groups = self.env.user.groups_id
user_has_permission = bool(allowed_group_ids & user_groups)
return not user_has_permission

def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
result = super().fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
ir_model = (
self.env["ir.model"].sudo().search([("model", "=", self._name)], limit=1)
)
if view_type not in ("form", "tree", "kanban") or not ir_model:
return result
hide_duplicate = self._should_hide_action(ir_model.duplicate_allowed_group_ids)
hide_delete = self._should_hide_action(ir_model.delete_allowed_group_ids)
if not hide_duplicate and not hide_delete:
return result
arch = etree.fromstring(result["arch"])
if view_type == "form" and hide_duplicate:
arch.set("duplicate", "0")
if hide_delete:
arch.set("delete", "0")
result["arch"] = etree.tostring(arch, encoding="unicode")
return result
9 changes: 9 additions & 0 deletions base_view_action_visibility/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
To configure action visibility for a model:

#. Activate developer mode.
#. Go to *Settings > Technical > Database Structure > Models*.
#. Select the model for which you want to restrict actions.
#. In the *View Action Visibility* section:

* Add groups to *Duplicate Allowed Groups* to restrict the duplicate action in form views to only those groups. Leave empty to allow all users to duplicate.
* Add groups to *Delete Allowed Groups* to restrict the delete action in form, tree, and kanban views to only those groups. Leave empty to allow all users to delete.
3 changes: 3 additions & 0 deletions base_view_action_visibility/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* `Quartile <https://www.quartile.co>`_:

* Aung Ko Ko Lin
8 changes: 8 additions & 0 deletions base_view_action_visibility/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
This module allows restricting standard view actions (Duplicate and Delete) on a per-model
basis through configuration on the ir.model settings. You can restrict these actions to
specific security groups, or leave them unrestricted to allow all users to see them.

The Duplicate action restriction applies to form views, while the Delete action restriction
applies to form, tree, and kanban views.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
applies to form, tree, and kanban views.
applies to form, tree, and kanban views.
Note: This module controls the visibility of UI actions only. It does not enforce server-side restrictions.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated!


Note: This module controls the visibility of UI actions only. It does not enforce server-side restrictions.
Loading
Loading