[FIX] project_long_term: avoid bad duplication of phases

When we duplicate a project, the related phases need to be duplicated as well but keeping references between each other.
e.g. 'project 1' with 'phase A' follwed by 'phase B' should become 'project 1 (copy)' with 'phase A (copy)' followed by 'phase B (copy)'.
Fixing bug lp:1212860, opw 607062
This commit is contained in:
Martin Trigaux 2014-07-30 15:27:58 +02:00
parent 8f0392b490
commit faa0df809f
1 changed files with 38 additions and 1 deletions

View File

@ -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'