bemade_fsm: work for creating tasks directly from templates.
This commit is contained in:
parent
0d5935a1e4
commit
8af9704b67
5 changed files with 116 additions and 0 deletions
|
|
@ -81,3 +81,38 @@ class TaskTemplate(models.Model):
|
|||
for rec in self:
|
||||
new_equipment_ids = [eq.id for eq in rec.equipment_ids if eq.partner_location_id == rec.customer]
|
||||
rec.write({'equipment_ids': [Command.set(new_equipment_ids)]})
|
||||
|
||||
def _prepare_new_task_values_from_self(self, project, name=False, parent_id=False):
|
||||
vals = {
|
||||
'project_id': project.id,
|
||||
'name': name or self.name,
|
||||
'description': self.description,
|
||||
'parent_id': parent_id,
|
||||
'user_ids': self.assignees.ids,
|
||||
'tag_ids': self.tags.ids,
|
||||
'planned_hours': self.planned_hours,
|
||||
'sequence': self.sequence,
|
||||
'equipment_ids': [Command.set(self.equipment_ids.ids)] if self.equipment_ids else False,
|
||||
'partner_id': project.partner_id and project.partner_id.id,
|
||||
'company_id': self.company_id.id,
|
||||
}
|
||||
return vals
|
||||
|
||||
def create_task_from_self(self, project, name=False, parent_id=False):
|
||||
""" Create a project.task from this template and return it. Can be called on a RecordSet of multiple templates.
|
||||
|
||||
:param project: project.project record the task should be added to
|
||||
:param name: name for the new task (defaults to template name)
|
||||
:param parent_id: parent task for the new task (none by default)
|
||||
:return: project.task record created from this template
|
||||
"""
|
||||
tasks = self.env['project.task']
|
||||
for rec in self:
|
||||
vals = rec._prepare_new_task_values_from_self(project, name, parent_id)
|
||||
task = rec.env['project.task'].create(vals)
|
||||
rec.subtasks.create_task_from_self(project, name=False, parent_id=task.id)
|
||||
tasks |= task
|
||||
return tasks
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -78,3 +78,17 @@ class TestTaskTemplate(BemadeFSMBaseTest):
|
|||
self.assertEqual(sol1.task_id.name, "Short Name 1")
|
||||
self.assertEqual(sol2.task_id.name, "Short Name 2")
|
||||
self.assertEqual(sol3.task_id.name, "Task")
|
||||
|
||||
def test_task_creation_directly_from_template(self):
|
||||
project = self.env.ref("industry_fsm.fsm_project")
|
||||
template = self._generate_task_template(names=['Task', 'Child', 'Grandchild'], structure=[2, 1])
|
||||
|
||||
task = template.create_task_from_self(project, "My new task")
|
||||
|
||||
self.assertEqual(len(task.child_ids), len(template.subtasks))
|
||||
self.assertEqual(len(task.child_ids[0].child_ids), len(template.subtasks[0].subtasks))
|
||||
self.assertEqual(len(task.child_ids[1].child_ids), len(template.subtasks[1].subtasks))
|
||||
self.assertEqual(task.name, "My new task")
|
||||
self.assertEqual(task.child_ids[0].name, template.subtasks[0].name)
|
||||
self.assertTrue(all([t.project_id == project for t in task | task._get_all_subtasks()]))
|
||||
|
||||
|
|
|
|||
1
bemade_fsm/wizard/__init__.py
Normal file
1
bemade_fsm/wizard/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from . import new_task_from_template
|
||||
44
bemade_fsm/wizard/new_task_from_template.py
Normal file
44
bemade_fsm/wizard/new_task_from_template.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class NewTaskFromTemplateWizard(models.TransientModel):
|
||||
_name = "project.task.from.template.wizard"
|
||||
|
||||
project_id = fields.Many2one(
|
||||
comodel_name='project.project',
|
||||
string='Project',
|
||||
help='The project the new task should be created in.',
|
||||
required=True,
|
||||
)
|
||||
|
||||
task_template_id = fields.Many2one(
|
||||
comodel_name='project.task.template',
|
||||
string='Task Template',
|
||||
help='The template to use when creating the new task.',
|
||||
required=True,
|
||||
)
|
||||
|
||||
new_task_title = fields.Char(
|
||||
help='The title (name) for the newly created task. If left blank, the name of the template will be used.',
|
||||
)
|
||||
|
||||
def default_get(self, fields_list):
|
||||
res = super().default_get(fields_list)
|
||||
if 'project_id' in fields_list:
|
||||
active_id = self.env.context.get('active_id', False)
|
||||
res.update({'project_id': active_id})
|
||||
return res
|
||||
|
||||
def action_create_task_from_template(self):
|
||||
self.ensure_one()
|
||||
task = self.task_template_id.create_task_from_self(self.project_id, self.new_task_title)
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'project.task',
|
||||
'res_id': task.id,
|
||||
'view_mode': 'form',
|
||||
'target': 'current',
|
||||
}
|
||||
|
||||
|
||||
22
bemade_fsm/wizard/new_task_from_template.xml
Normal file
22
bemade_fsm/wizard/new_task_from_template.xml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="project_task_from_template_wizard_view_form" model="ir.ui.view">
|
||||
<field name="name">project.task.from.template.wizard.view.form</field>
|
||||
<field name="model">project.task.from.template.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<header>
|
||||
<button name="action_create_task_from_template" type="object" string="Create Task"/>
|
||||
<button special="cancel" string="Cancel"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="task_template_id"/>
|
||||
<field name="new_task_title"/>
|
||||
<field name="project_id"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Loading…
Reference in a new issue