diff options
| author | Kevin Baptiste <kba@odoo.com> | 2020-02-26 12:17:28 +0000 |
|---|---|---|
| committer | Kevin Baptiste <kba@odoo.com> | 2020-04-22 08:29:51 +0000 |
| commit | 53954ad93efba227efb2cb129ea1b95253a18f2a (patch) | |
| tree | 167a83cd42baf10ea0623394741ad9b5aad63a05 /addons/project/models/project.py | |
| parent | 12acf49f1520a9792b3de077cd50583ede39c572 (diff) | |
[IMP] project: ease stage deletion
Before this commit, deleting a stage with tasks, the user received an
error.
With this commit, when deleting a stage containing tasks, a wizard
offers the choice to move the tasks to another stage.
closes odoo/odoo#46410
Taskid: 1869030
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Diffstat (limited to 'addons/project/models/project.py')
| -rw-r--r-- | addons/project/models/project.py | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/addons/project/models/project.py b/addons/project/models/project.py index ed79097320d..2e73c760ab4 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -18,6 +18,7 @@ class ProjectTaskType(models.Model): default_project_id = self.env.context.get('default_project_id') return [default_project_id] if default_project_id else None + active = fields.Boolean('Active', default=True) name = fields.Char(string='Stage Name', required=True, translate=True) description = fields.Text(translate=True) sequence = fields.Integer(default=1) @@ -49,16 +50,35 @@ class ProjectTaskType(models.Model): " * A good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n" " * A medium or a bad feedback will set the kanban state to 'blocked' (red bullet).\n") - def unlink(self): - stages = self - default_project_id = self.env.context.get('default_project_id') - if default_project_id: - shared_stages = self.filtered(lambda x: len(x.project_ids) > 1 and default_project_id in x.project_ids.ids) - tasks = self.env['project.task'].with_context(active_test=False).search([('project_id', '=', default_project_id), ('stage_id', 'in', self.ids)]) - if shared_stages and not tasks: - shared_stages.write({'project_ids': [(3, default_project_id)]}) - stages = self.filtered(lambda x: x not in shared_stages) - return super(ProjectTaskType, stages).unlink() + def unlink_wizard(self, stage_view=False): + self = self.with_context(active_test=False) + # retrieves all the projects with a least 1 task in that stage + # a task can be in a stage even if the project is not assigned to the stage + readgroup = self.with_context(active_test=False).env['project.task'].read_group([('stage_id', 'in', self.ids)], ['project_id'], ['project_id']) + project_ids = list(set([project['project_id'][0] for project in readgroup] + self.project_ids.ids)) + + wizard = self.with_context(project_ids=project_ids).env['project.task.type.delete.wizard'].create({ + 'project_ids': project_ids, + 'stage_ids': self.ids + }) + + context = dict(self.env.context) + context['stage_view'] = stage_view + return { + 'name': _('Delete Stage'), + 'view_mode': 'form', + 'res_model': 'project.task.type.delete.wizard', + 'views': [(self.env.ref('project.view_project_task_type_delete_wizard').id, 'form')], + 'type': 'ir.actions.act_window', + 'res_id': wizard.id, + 'target': 'new', + 'context': context, + } + + def write(self, vals): + if 'active' in vals and not vals['active']: + self.env['project.task'].search([('stage_id', 'in', self.ids)]).write({'active': False}) + return super(ProjectTaskType, self).write(vals) class Project(models.Model): |
