From 74ec46382a2f435263f2d1caf5496e679b3ea451 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Tue, 5 Dec 2023 14:56:06 -0500 Subject: [PATCH] bemade_fsm: Propagation of task assignee to subtasks (optional). --- bemade_fsm/__manifest__.py | 2 +- bemade_fsm/models/task.py | 17 ++++++++++++ bemade_fsm/tests/__init__.py | 1 + bemade_fsm/tests/test_sale_order.py | 2 +- bemade_fsm/tests/test_task.py | 40 +++++++++++++++++++++++++++++ bemade_fsm/views/task_views.xml | 3 +++ 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 bemade_fsm/tests/test_task.py diff --git a/bemade_fsm/__manifest__.py b/bemade_fsm/__manifest__.py index ecc58bc..9b7669d 100644 --- a/bemade_fsm/__manifest__.py +++ b/bemade_fsm/__manifest__.py @@ -20,7 +20,7 @@ ######################################################################################## { 'name': 'Improved Field Service Management', - 'version': '15.0.1.0.4', + 'version': '15.0.1.0.5', 'summary': 'Adds functionality necessary for managing field service operations at Durpro.', 'description': 'Adds functionality necessary for managing field service operations at Durpro.', 'category': 'Services/Field Service', diff --git a/bemade_fsm/models/task.py b/bemade_fsm/models/task.py index 296a7c6..c0b20e0 100644 --- a/bemade_fsm/models/task.py +++ b/bemade_fsm/models/task.py @@ -76,6 +76,12 @@ class Task(models.Model): work_order_number = fields.Char(readonly=True) + propagate_assignment = fields.Boolean( + string='Propagate Assignment', + help='Propagate assignment of this task to all subtasks.', + default=True, + ) + @api.model_create_multi def create(self, vals): res = super().create(vals) @@ -92,6 +98,16 @@ class Task(models.Model): + f"-{seq}" return res + def write(self, vals): + super().write(vals) + if not self: # End recursion on empty RecordSet + return + if 'user_ids' in vals: + to_propagate = self.filtered(lambda task: task.propagate_assignment) + # Here we use child_ids instead of _get_all_subtasks() so as to allow for setting propagate_assignment + # to false on a child task. + to_propagate.child_ids.write({'user_ids': vals['user_ids']}) + @api.depends('sale_order_id') def _compute_relevant_order_lines(self): for rec in self: @@ -199,6 +215,7 @@ class Task(models.Model): if self.child_ids: return self | self.child_ids._get_full_hierarchy() return self + def synchronize_name_fsm(self): """ Applies naming to the entire task tree for tasks that are part of this recordset. Root tasks are named: diff --git a/bemade_fsm/tests/__init__.py b/bemade_fsm/tests/__init__.py index 381536f..4b317ee 100644 --- a/bemade_fsm/tests/__init__.py +++ b/bemade_fsm/tests/__init__.py @@ -4,3 +4,4 @@ from . import test_sale_order from . import test_equipment from . import test_fsm_contact_setting from . import test_fsm_visit +from . import test_task diff --git a/bemade_fsm/tests/test_sale_order.py b/bemade_fsm/tests/test_sale_order.py index c51246c..484392e 100644 --- a/bemade_fsm/tests/test_sale_order.py +++ b/bemade_fsm/tests/test_sale_order.py @@ -251,7 +251,7 @@ class TestSalesOrder(BemadeFSMBaseTest): self.assertFalse(visit_task.user_ids) self.assertFalse(subtask1.user_ids) self.assertFalse(subtask2.user_ids) - + def test_long_line_name_overflows_to_task_description(self): so = self._generate_sale_order() product = self._generate_product() diff --git a/bemade_fsm/tests/test_task.py b/bemade_fsm/tests/test_task.py new file mode 100644 index 0000000..63185de --- /dev/null +++ b/bemade_fsm/tests/test_task.py @@ -0,0 +1,40 @@ +from .test_bemade_fsm_common import BemadeFSMBaseTest +from odoo.tests.common import tagged +from odoo import Command + + +@tagged('post_install', '-at_install') +class TaskTest(BemadeFSMBaseTest): + + def test_reassigning_assignment_propagating_task_changes_subtasks(self): + # This creation step is a bit lazy - we use defaults to make tasks with a hierachy and settings we want + so = self._generate_sale_order() + template = self._generate_task_template(names=['Parent', 'Child'], structure=[2]) + product = self._generate_product(task_template=template) + sol = self._generate_sale_order_line(sale_order=so, product=product) + user = self._generate_project_manager_user('Bob', 'Bob') + so.action_confirm() + task = sol.task_id + + task.write({ + 'user_ids': [Command.set([user.id])] + }) + + self.assertTrue(all([t.user_ids == user for t in task | task._get_all_subtasks()])) + + def test_reassigning_assignment_non_propagating_task_doesnt_change_subtasks(self): + so = self._generate_sale_order() + template = self._generate_task_template(names=['Parent', 'Child', 'Grandchild'], structure=[2, 1]) + product = self._generate_product(task_template=template) + sol = self._generate_sale_order_line(sale_order=so, product=product) + user = self._generate_project_manager_user('Bob', 'Bob') + so.action_confirm() + task = sol.task_id + task.child_ids.write({'propagate_assignment': False}) # Stop propagation after the first level + + task.write({ + 'user_ids': [Command.set([user.id])] + }) + + self.assertTrue(all([t.user_ids == user for t in task | task.child_ids])) + self.assertFalse(any([t.user_ids for t in task.child_ids.child_ids])) diff --git a/bemade_fsm/views/task_views.xml b/bemade_fsm/views/task_views.xml index 25f71be..8db34b3 100644 --- a/bemade_fsm/views/task_views.xml +++ b/bemade_fsm/views/task_views.xml @@ -46,6 +46,9 @@ + + +