[IMP] project: add a wizard to merge tasks

This wizard allows the users to merge some task in a new task or an existing one

A user and a project are taken by default but may be configurable on the wizard.

The other tasks are archived. A message is posted on the tasks to report the target and a message is posted on the target to report the origin tasks.
This commit is contained in:
Yannick Tivisse
2016-12-02 14:47:23 +01:00
parent d075bc32f6
commit d1bd102b4b
6 changed files with 138 additions and 0 deletions
+1
View File
@@ -3,3 +3,4 @@
import models
import report
import wizard
+1
View File
@@ -45,6 +45,7 @@ Dashboard / Reports for Project Management will include:
'views/tour_views.xml',
'data/web_planner_data.xml',
'data/project_mail_template_data.xml',
'wizard/project_task_merge_wizard_views.xml',
],
'qweb': ['static/src/xml/project.xml'],
'demo': ['data/project_demo.xml'],
+18
View File
@@ -340,6 +340,24 @@
<field name="displayed_image_id" ref="msg_task_data_14_attach"/>
</record>
</data>
<template id="mail_template_task_merge">
<t t-if="target">
<t t-if="len(tasks) == 1"><p>The following task has been merged into this one:</p></t>
<t t-if="len(tasks) &gt; 1"><p>The following tasks have been merged into this one:</p></t>
<ul>
<t t-foreach="tasks" t-as="task">
<li><a href="#" t-att-data-oe-model="task._name" t-att-data-oe-id="task.id"><t t-esc="task.name"/></a></li>
</t>
</ul>
</t>
<t t-if="not target">
<p>This task has been merged into the following task:</p>
<ul>
<li><a href="#" t-att-data-oe-model="task._name" t-att-data-oe-id="task.id"><t t-esc="task.name"/></a></li>
</ul>
</t>
</template>
</odoo>
+5
View File
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import project_task_merge_wizard
@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
class ProjectTaskMergeWizard(models.TransientModel):
_name = 'project.task.merge.wizard'
task_ids = fields.Many2many('project.task', string="Tasks to Merge", required=True)
user_id = fields.Many2one('res.users', string="Assigned to", required=True)
create_new_task = fields.Boolean('Create a new task')
target_task_name = fields.Char('New task name')
target_project_id = fields.Many2one('project.project', string="Target Project")
target_task_id = fields.Many2one('project.task', string="Merge into an existing task")
@api.multi
def merge_tasks(self):
values = {
'user_id': self.user_id.id,
'description': self.merge_description(),
}
if self.create_new_task:
values.update({
'name': self.target_task_name,
'project_id': self.target_project_id.id
})
self.target_task_id = self.env['project.task'].create(values)
else:
self.target_task_id.write(values)
self.target_task_id.message_post_with_view(
self.env.ref('project.mail_template_task_merge'),
values={'target': True, 'tasks': self.task_ids - self.target_task_id},
subtype_id=self.env.ref('mail.mt_comment').id
)
(self.task_ids - self.target_task_id).message_post_with_view(
self.env.ref('project.mail_template_task_merge'),
values={'target': False, 'task': self.target_task_id},
subtype_id=self.env.ref('mail.mt_comment').id
)
(self.task_ids - self.target_task_id).write({'active': False})
return {
"type": "ir.actions.act_window",
"res_model": "project.task",
"views": [[False, "form"]],
"res_id": self.target_task_id.id,
}
@api.multi
def merge_description(self):
return '<br/>'.join(self.task_ids.mapped(lambda task: "Description from task <b>%s</b>:<br/>%s" % (task.name, task.description or 'No description')))
@api.model
def default_get(self, fields):
result = super(ProjectTaskMergeWizard, self).default_get(fields)
selected_tasks = self.env['project.task'].browse(self.env.context.get('active_ids', False))
assigned_tasks = selected_tasks.filtered(lambda task: task.user_id)
result.update({
'task_ids': [(4, task.id) for task in selected_tasks],
'user_id': assigned_tasks and assigned_tasks[0].user_id.id or False,
'target_project_id': selected_tasks[0].project_id.id,
'target_task_id': selected_tasks[0].id
})
return result
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="project_task_merge_wizard_form" model="ir.ui.view">
<field name='name'>project.task.merge.wizard.form</field>
<field name='model'>project.task.merge.wizard</field>
<field name='arch' type='xml'>
<form string='Merge Tasks'>
<sheet>
<group>
<group>
<field name="user_id"/>
<field name="task_ids" widget="many2many_tags"/>
</group>
<group>
<field name="create_new_task"/>
<field name="target_task_name" attrs="{'invisible': [('create_new_task', '=', False)], 'required': [('create_new_task', '=', True)]}"/>
<field name="target_project_id" attrs="{'invisible': [('create_new_task', '=', False)], 'required': [('create_new_task', '=', True)]}"/>
<field name="target_task_id" attrs="{'invisible': [('create_new_task', '=', True)], 'required': [('create_new_task', '=', False)]}"/>
</group>
</group>
<span class="text-muted">NB: This will archive the selected tasks (Except the destination task)</span>
</sheet>
<footer>
<button name='merge_tasks' string='Merge Tasks' class='oe_highlight' type='object'/>
<button special="cancel" string="Cancel" type="object" class="btn btn-default oe_inline"/>
</footer>
</form>
</field>
</record>
<act_window
id="project_task_actions_act_window_merge_tasks"
res_model="project.task.merge.wizard"
src_model="project.task"
target="new"
multi="True"
key2="client_action_multi"
view_mode="form"
name="Merge Selected Tasks"/>
<act_window
id="project_task_actions_act_window_merge_tasks"
res_model="project.task.merge.wizard"
src_model="project.task"
target="new"
multi="False"
key2="client_action_multi"
view_mode="form"
name="Merge Selected Tasks"/>
</odoo>