diff --git a/dms_field/README.rst b/dms_field/README.rst index 48813f333..8ba438845 100644 --- a/dms_field/README.rst +++ b/dms_field/README.rst @@ -99,6 +99,10 @@ Contributors * Víctor Martínez * Carlos Roca +* `PyTech `_: + + * Simone Rubino + Maintainers ~~~~~~~~~~~ diff --git a/dms_field/models/dms_access_group.py b/dms_field/models/dms_access_group.py index b5ffdaf5f..de84138b8 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", "=", "%s,%s" % (record._name, record.id)), + ] + def _get_item_from_dms_field_ref(self, record): return self.env["dms.access.group"].search( - [("dms_field_ref", "=", "%s,%s" % (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 = "%s,%s" % (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/models/dms_field_template.py b/dms_field/models/dms_field_template.py index ba95beac2..103c25954 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,29 @@ 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, + "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): # 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) diff --git a/dms_field/readme/CONTRIBUTORS.rst b/dms_field/readme/CONTRIBUTORS.rst index 7792f8efe..ba6344163 100644 --- a/dms_field/readme/CONTRIBUTORS.rst +++ b/dms_field/readme/CONTRIBUTORS.rst @@ -5,3 +5,7 @@ * Víctor Martínez * Carlos Roca + +* `PyTech `_: + + * Simone Rubino diff --git a/dms_field/static/description/index.html b/dms_field/static/description/index.html index 8a7f66c74..ccd54bd59 100644 --- a/dms_field/static/description/index.html +++ b/dms_field/static/description/index.html @@ -443,6 +443,10 @@

Contributors

  • Carlos Roca
  • +
  • PyTech: +
  • diff --git a/dms_field/tests/test_dms_field.py b/dms_field/tests/test_dms_field.py index eb9ce8a4a..dbf6f40ff 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)