diff --git a/tests/test_module.py b/tests/test_module.py index 9a5384d552..f27fa7b4ff 100644 --- a/tests/test_module.py +++ b/tests/test_module.py @@ -181,5 +181,24 @@ class ProjectTestCase( {'project.work': map(int, works)}): self.assertFalse(TimesheetLine.default_work()) + @with_transaction() + def test_copy_work_with_children(self): + "Test copy work with children" + pool = Pool() + ProjectWork = pool.get('project.work') + + company = create_company() + with set_company(company): + work, = ProjectWork.create([ + {'name': "Parent", 'children': [('create', [ + {'name': "Work 1", 'timesheet_available': True}, + {'name': "Work 2", 'timesheet_available': False}, + ])]}]) + new_work, = ProjectWork.copy([work]) + + child1, child2 = new_work.children + self.assertTrue(child1.timesheet_available) + self.assertFalse(child2.timesheet_available) + del ModuleTestCase diff --git a/work.py b/work.py index 081429b29e..9705a2488e 100644 --- a/work.py +++ b/work.py @@ -505,11 +505,20 @@ class Work(sequence_ordered(), tree(separator='\\'), ModelSQL, ModelView): default = {} else: default = default.copy() - default.setdefault('children', None) default.setdefault('progress', None) default.setdefault( 'status', lambda data: WorkStatus.get_default_status(data['type'])) - return super().copy(project_works, default=default) + new_works = super().copy(project_works, default=default) + to_save = [] + for work, new_work in zip(project_works, new_works): + if work.timesheet_available: + new_work.timesheet_available = work.timesheet_available + new_work.timesheet_start_date = work.timesheet_start_date + new_work.timesheet_end_date = work.timesheet_end_date + to_save.append(new_work) + if to_save: + cls.save(to_save) + return new_works @classmethod def delete(cls, project_works):