diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index 109f0c03c6f..0758d4181e2 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -267,7 +267,44 @@ class project(osv.osv): 'date_end': p.end.strftime('%Y-%m-%d %H:%M:%S') }, context=context) return True -project() + + def map_phase(self, cr, uid, old_project_id, new_project_id, context=None): + """ copy and map phases from old to new project while keeping order relations """ + project_phase = self.pool['project.phase'] + project_task = self.pool['project.task'] + # mapping source and copy ids to recreate m2m links + phase_ids_mapping = {} + project = self.browse(cr, uid, old_project_id, context=context) + if project.phase_ids: + for phase in project.phase_ids: + phase_default = { + 'project_id': new_project_id, + 'previous_phase_ids': [], + 'next_phase_ids': [], + 'task_ids': [], + } + # adding relationships with already copied phases + for previous_phase in phase.previous_phase_ids: + if previous_phase.id in phase_ids_mapping: + phase_default['previous_phase_ids'].append((4, phase_ids_mapping[previous_phase.id])) + for next_phase in phase.next_phase_ids: + if next_phase.id in phase_ids_mapping: + phase_default['previous_phase_ids'].append((4, phase_ids_mapping[next_phase.id])) + phase_ids_mapping[phase.id] = project_phase.copy(cr, uid, phase.id, phase_default, context=context) + if project.tasks: + # if has copied tasks, need to update phase_id + for task in self.browse(cr, uid, new_project_id, context=context).tasks: + if task.phase_id and task.phase_id.id in phase_ids_mapping: + project_task.write(cr, uid, task.id, {'phase_id': phase_ids_mapping[phase.id]}, context=context) + return True + + def copy(self, cr, uid, id, default=None, context=None): + if default is None: + default = {} + default.update(phase_ids=[]) + new_project_id = super(project, self).copy(cr, uid, id, default, context) + self.map_phase(cr, uid, id, new_project_id, context=context) + return new_project_id class account_analytic_account(osv.osv): _inherit = 'account.analytic.account'