[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:
parent
8f0392b490
commit
faa0df809f
|
@ -267,7 +267,44 @@ class project(osv.osv):
|
||||||
'date_end': p.end.strftime('%Y-%m-%d %H:%M:%S')
|
'date_end': p.end.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
}, context=context)
|
}, context=context)
|
||||||
return True
|
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):
|
class account_analytic_account(osv.osv):
|
||||||
_inherit = 'account.analytic.account'
|
_inherit = 'account.analytic.account'
|
||||||
|
|
Loading…
Reference in New Issue