From fba543d02994cb5fb8dea6522ded2b0c53fca6df Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Mon, 18 Aug 2025 11:32:25 +0200 Subject: [PATCH 1/3] [REF] dms_field: Allow to override generated group domain --- dms_field/README.rst | 28 ++++++++++---------- dms_field/models/dms_access_group.py | 20 +++++++++++---- dms_field/readme/CONTRIBUTORS.md | 3 +++ dms_field/static/description/index.html | 34 ++++++++++++------------- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/dms_field/README.rst b/dms_field/README.rst index 3c16e2290..e1a100af1 100644 --- a/dms_field/README.rst +++ b/dms_field/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ========= DMS Field ========= @@ -17,7 +13,7 @@ DMS Field .. |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-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github @@ -81,9 +77,9 @@ Usage Known issues / Roadmap ====================== -- Add drag & drop compatibility to the dms_tree mode -- Multiple selection support (e.g. cut several files and paste to - another folder). +- Add drag & drop compatibility to the dms_tree mode +- Multiple selection support (e.g. cut several files and paste to + another folder). Bug Tracker =========== @@ -106,12 +102,18 @@ Authors Contributors ------------ -- Enric Tobella -- Jaime Arroyo -- `Tecnativa `__: +- Enric Tobella + +- Jaime Arroyo + +- `Tecnativa `__: + + - Víctor Martínez + - Carlos Roca + +- `PyTech `__: - - Víctor Martínez - - Carlos Roca + - Simone Rubino simone.rubino@pytech.it Maintainers ----------- diff --git a/dms_field/models/dms_access_group.py b/dms_field/models/dms_access_group.py index ffdc74257..f7188b5a4 100644 --- a/dms_field/models/dms_access_group.py +++ b/dms_field/models/dms_access_group.py @@ -1,8 +1,10 @@ # Copyright 2024 Tecnativa - Víctor Martínez +# Copyright 2025 Simone Rubino - PyTech # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). from odoo import _, api, fields, models from odoo.exceptions import UserError +from odoo.osv import expression class DmsAccessGroups(models.Model): @@ -38,18 +40,26 @@ def _compute_company_id(self): else False ) + def _get_domain_for_item_from_dms_field_ref(self, record): + return [ + ("dms_field_ref", "=", f"{record._name},{record.id}"), + ] + def _get_item_from_dms_field_ref(self, record): return self.env["dms.access.group"].search( - [("dms_field_ref", "=", f"{record._name},{record.id}")] + self._get_domain_for_item_from_dms_field_ref(record) ) @api.constrains("dms_field_ref") def _check_dms_field_ref(self): for item in self.filtered("dms_field_ref"): - dms_field_ref = f"{item.dms_field_ref._name},{item.dms_field_ref.id}" - if self.search( - [("dms_field_ref", "=", dms_field_ref), ("id", "!=", item.id)] - ): + domain = expression.AND( + [ + item._get_domain_for_item_from_dms_field_ref(item.dms_field_ref), + [("id", "!=", item.id)], + ] + ) + if self.search(domain): raise UserError( _("There is already an access group created for this record.") ) diff --git a/dms_field/readme/CONTRIBUTORS.md b/dms_field/readme/CONTRIBUTORS.md index a199ce46e..754508f95 100644 --- a/dms_field/readme/CONTRIBUTORS.md +++ b/dms_field/readme/CONTRIBUTORS.md @@ -3,3 +3,6 @@ - [Tecnativa](https://www.tecnativa.com): - Víctor Martínez - Carlos Roca + +- [PyTech](https://www.pytech.it): + - Simone Rubino \ No newline at end of file diff --git a/dms_field/static/description/index.html b/dms_field/static/description/index.html index f9b606b5e..7f07e12ab 100644 --- a/dms_field/static/description/index.html +++ b/dms_field/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +DMS Field -
+
+

DMS Field

- - -Odoo Community Association - -
-

DMS Field

-

Beta License: LGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

This addon creates a new kind of view and allows to define a folder related to a record.

Table of contents

@@ -393,7 +388,7 @@

DMS Field

-

Configuration

+

Configuration

To use the embedded view in any module, the module must inherit from the mixin dms.field.mixin (You have an example with res.partner in this module).

@@ -419,7 +414,7 @@

Configuration

-

Usage

+

Usage

  1. Go to the form view of an existing partner and click on the “DMS” tab icon, a hierarchy of folders and files linked to that record will be @@ -429,7 +424,7 @@

    Usage

-

Known issues / Roadmap

+

Known issues / Roadmap

  • Add drag & drop compatibility to the dms_tree mode
  • Multiple selection support (e.g. cut several files and paste to @@ -437,7 +432,7 @@

    Known issues / Roadmap

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub 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 @@ -445,15 +440,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Creu Blanca
-

Contributors

+

Contributors

+
  • PyTech: +
  • -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -480,6 +479,5 @@

    Maintainers

    -
    From 1de1f291a7212b36fb3fa4e282d276c4b869bf7e Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Mon, 18 Aug 2025 11:34:52 +0200 Subject: [PATCH 2/3] [REF] dms_field: Allow to override child directory values --- dms_field/models/dms_field_template.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/dms_field/models/dms_field_template.py b/dms_field/models/dms_field_template.py index 956d0bfa8..b2cbe76f8 100644 --- a/dms_field/models/dms_field_template.py +++ b/dms_field/models/dms_field_template.py @@ -1,4 +1,5 @@ # Copyright 2024 Tecnativa - Víctor Martínez +# Copyright 2025 Simone Rubino - PyTech # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models from odoo.exceptions import UserError, ValidationError @@ -152,16 +153,24 @@ def _get_autogenerated_group(self, record): # Create the autogenerated group linked to the record return group_model.create(self._prepare_autogenerated_group(record)) + def _prepare_child_directory_vals(self, parent, template_child_directory): + """Values to create child directories on the record. + + :param parent: Directory already created from the template for the record + :param template_child_directory: Directory in the template directories structure + """ + return { + "name": template_child_directory.name, + "is_root_directory": False, + "parent_id": parent.id, + } + def _create_child_directories(self, parent, directory): # Create child directories (all leves) + files directory_model = self.env["dms.directory"].sudo() for child_directory in directory.child_directory_ids: child = directory_model.create( - { - "name": child_directory.name, - "is_root_directory": False, - "parent_id": parent.id, - } + self._prepare_child_directory_vals(parent, child_directory) ) self._copy_files_from_directory(child_directory, child) self._create_child_directories(child, child_directory) From 62a6860fd67ab08ca4055c749074bd894ab299dd Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Mon, 18 Aug 2025 11:35:38 +0200 Subject: [PATCH 3/3] [IMP] dms_field: Propagate groups from template --- dms_field/models/dms_field_template.py | 5 ++++ dms_field/tests/test_dms_field.py | 34 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/dms_field/models/dms_field_template.py b/dms_field/models/dms_field_template.py index b2cbe76f8..a155a85dc 100644 --- a/dms_field/models/dms_field_template.py +++ b/dms_field/models/dms_field_template.py @@ -163,6 +163,11 @@ def _prepare_child_directory_vals(self, parent, template_child_directory): "name": template_child_directory.name, "is_root_directory": False, "parent_id": parent.id, + "inherit_group_ids": template_child_directory.inherit_group_ids, + "group_ids": [ + fields.Command.link(group.id) + for group in template_child_directory.group_ids + ], } def _create_child_directories(self, parent, directory): diff --git a/dms_field/tests/test_dms_field.py b/dms_field/tests/test_dms_field.py index 398137843..1d4cc956d 100644 --- a/dms_field/tests/test_dms_field.py +++ b/dms_field/tests/test_dms_field.py @@ -244,3 +244,37 @@ def test_parents(self): {"id": directory.id, "name": directory.name}, directory.search_read_parents(fields=["id", "name"]), ) + + def test_child_values(self): + """Values of the child directory in the template + are propagated to the new directories.""" + # Arrange + partner = self.partner + access_group = self.env["dms.access.group"].create( + { + "name": "Test Access group", + } + ) + child_dir = self.subdirectory_1 + child_dir.inherit_group_ids = False + child_dir.group_ids = access_group + + # Act + self.env["dms.field.template"].with_context( + res_model=partner._name, + res_id=partner.id, + ).create_dms_directory() + + # Assert + partner.invalidate_model() + new_subdirectory_1 = partner.dms_directory_ids.child_directory_ids.filtered( + lambda d, dir_name=child_dir.name: d.name == dir_name + ) + self.assertFalse(new_subdirectory_1.inherit_group_ids) + self.assertEqual(new_subdirectory_1.group_ids, access_group) + + new_subdirectory_2 = partner.dms_directory_ids.child_directory_ids.filtered( + lambda d, dir_name=self.subdirectory_2.name: d.name == dir_name + ) + self.assertTrue(new_subdirectory_2.inherit_group_ids) + self.assertIn(self.group, new_subdirectory_2.complete_group_ids.group_ids)