bemade_fsm: Convert task_template.equipment_id to a Many2many field. Fixes #58.

This commit is contained in:
Marc Durepos 2023-07-17 09:35:11 -04:00
parent 82b51907a5
commit 963fa748c6
8 changed files with 52 additions and 25 deletions

View file

@ -35,7 +35,6 @@ class Equipment(models.Model):
tag_ids = fields.Many2many('bemade_fsm.equipment.tag', tag_ids = fields.Many2many('bemade_fsm.equipment.tag',
string='Application', string='Application',
tracking=True,
help="Classify and analyze your equipment categories like: Boiler, Laboratory, " help="Classify and analyze your equipment categories like: Boiler, Laboratory, "
"Waste water, Pure water") "Waste water, Pure water")
partner_id = fields.Many2one('res.partner', partner_id = fields.Many2one('res.partner',

View file

@ -114,8 +114,8 @@ class SaleOrderLine(models.Model):
vals['user_ids'] = template.assignees.ids vals['user_ids'] = template.assignees.ids
vals['tag_ids'] = template.tags.ids vals['tag_ids'] = template.tags.ids
vals['planned_hours'] = template.planned_hours vals['planned_hours'] = template.planned_hours
if template.equipment_id: if template.equipment_ids:
vals['equipment_ids'] = [Command.set([template.equipment_id.id])] vals['equipment_ids'] = [Command.set(template.equipment_ids.ids)]
return vals return vals
tmpl = self.product_id.task_template_id tmpl = self.product_id.task_template_id

View file

@ -1,4 +1,4 @@
from odoo import models, fields, api, _ from odoo import models, fields, api, _, Command
class TaskTemplate(models.Model): class TaskTemplate(models.Model):
@ -24,7 +24,11 @@ class TaskTemplate(models.Model):
sequence = fields.Integer(string="Sequence") sequence = fields.Integer(string="Sequence")
company_id = fields.Many2one("res.company", string="Company", index=1, default=_current_company) company_id = fields.Many2one("res.company", string="Company", index=1, default=_current_company)
planned_hours = fields.Float("Initially Planned Hours") planned_hours = fields.Float("Initially Planned Hours")
equipment_id = fields.Many2one(comodel_name="bemade_fsm.equipment", string="Equipment", ) equipment_ids = fields.Many2many(comodel_name="bemade_fsm.equipment",
relation="bemade_fsm_task_template_equipment_rel",
column1="task_template_id",
column2="equipment_id",
string="Equipment to Service",)
def action_open_task(self): def action_open_task(self):
return { return {
@ -34,3 +38,9 @@ class TaskTemplate(models.Model):
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'context': self._context 'context': self._context
} }
@api.onchange('customer')
def _onchange_customer(self):
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)]})

View file

@ -149,7 +149,7 @@ class BemadeFSMBaseTest(TransactionCase):
'name': name, 'name': name,
'parent': parent and parent.id or False, 'parent': parent and parent.id or False,
'planned_hours': planned_hours, 'planned_hours': planned_hours,
'equipment_id': equipment and equipment.id or False, 'equipment_ids': [Command.set(equipment and [equipment.id] or [])],
}) })
parent = template parent = template
while structure: while structure:

View file

@ -7,18 +7,18 @@ from odoo.exceptions import MissingError
@tagged("-at_install", "post_install") @tagged("-at_install", "post_install")
class TestEquipment(BemadeFSMBaseTest): class TestEquipment(BemadeFSMBaseTest):
def test_crud(self): def test_crud(self):
self.partner_company = self._generate_partner() partner_company = self._generate_partner()
self.partner_contact = self._generate_partner('Site Contact', 'person', self.partner_company) partner_contact = self._generate_partner('Site Contact', 'person', partner_company)
self.equipment = self._generate_equipment('Test Equipment 1', self.partner_company) equipment = self._generate_equipment('Test Equipment 1', partner_company)
# Just make sure the basic ORM stuff is OK # Just make sure the basic ORM stuff is OK
self.assertTrue(self.equipment in self.partner_company.equipment_ids) self.assertTrue(equipment in partner_company.equipment_ids)
self.assertTrue(len(self.partner_company.equipment_ids) == 1) self.assertTrue(len(partner_company.equipment_ids) == 1)
# Delete should cascade # Delete should cascade
self.partner_company.write({'equipment_ids': [Command.set([])]}) partner_company.write({'equipment_ids': [Command.set([])]})
with self.assertRaises(MissingError): with self.assertRaises(MissingError):
self.equipment.name equipment.name
@tagged('-at_install', 'post_install', 'slow') @tagged('-at_install', 'post_install', 'slow')

View file

@ -1,10 +1,10 @@
from .test_task_template import TestTaskTemplateCommon from .test_task_template import BemadeFSMBaseTest
from odoo.tests.common import tagged, HttpCase, Form from odoo.tests.common import tagged, HttpCase, Form
from odoo import Command from odoo import Command
@tagged("-at_install", "post_install") @tagged("-at_install", "post_install")
class TestSalesOrder(TestTaskTemplateCommon): class TestSalesOrder(BemadeFSMBaseTest):
@tagged('-at_install', 'post_install') @tagged('-at_install', 'post_install')
def test_order_confirmation_simple_template(self): def test_order_confirmation_simple_template(self):
""" Confirming the order should create a task in the global project based on the task template. """ """ Confirming the order should create a task in the global project based on the task template. """
@ -24,20 +24,23 @@ class TestSalesOrder(TestTaskTemplateCommon):
def test_order_confirmation_tree_template(self): def test_order_confirmation_tree_template(self):
partner = self._generate_partner() partner = self._generate_partner()
so = self._generate_sale_order(partner=partner) so = self._generate_sale_order(partner=partner)
task_template = self._generate_task_template(structure=[2, 1], parent_task = self._generate_task_template(structure=[2, 1],
names=['Parent Template', 'Child Template', names=['Parent Template', 'Child Template',
'Grandchild Template']) 'Grandchild Template'])
product = self._generate_product(task_template=task_template) child_task_1 = parent_task.subtasks[0]
child_task_2 = parent_task.subtasks[1]
grandchild_task = parent_task.subtasks[0].subtasks[0]
product = self._generate_product(task_template=parent_task)
sol = self._generate_sale_order_line(so, product=product) sol = self._generate_sale_order_line(so, product=product)
so.action_confirm() so.action_confirm()
self.assertTrue(sol.task_id.child_ids and len(sol.task_id.child_ids) == 2) self.assertTrue(sol.task_id.child_ids and len(sol.task_id.child_ids) == 2)
self.assertTrue(self.parent_task.name in sol.task_id.name) self.assertTrue(parent_task.name in sol.task_id.name)
self.assertTrue(self.child_task_1.name in sol.task_id.child_ids[0].name) self.assertTrue(child_task_1.name in sol.task_id.child_ids[0].name)
self.assertTrue(self.child_task_2.name in sol.task_id.child_ids[1].name) self.assertTrue(child_task_2.name in sol.task_id.child_ids[1].name)
self.assertTrue(sol.task_id.child_ids[0].child_ids and len(sol.task_id.child_ids[0].child_ids) == 1) self.assertTrue(sol.task_id.child_ids[0].child_ids and len(sol.task_id.child_ids[0].child_ids) == 1)
self.assertTrue(self.grandchild_task.name in sol.task_id.child_ids.child_ids[0].name) self.assertTrue(grandchild_task.name in sol.task_id.child_ids.child_ids[0].name)
def test_order_confirmation_equipment(self): def test_order_confirmation_equipment(self):
""" The equipment selected on the SO should transfer to the task.""" """ The equipment selected on the SO should transfer to the task."""

View file

@ -1,5 +1,5 @@
from .test_bemade_fsm_common import BemadeFSMBaseTest from .test_bemade_fsm_common import BemadeFSMBaseTest
from odoo.tests.common import HttpCase, tagged from odoo.tests.common import HttpCase, tagged, Form
from odoo.exceptions import MissingError from odoo.exceptions import MissingError
from odoo import Command from odoo import Command
from psycopg2.errors import ForeignKeyViolation from psycopg2.errors import ForeignKeyViolation
@ -57,6 +57,19 @@ class TestTaskTemplate(TestTaskTemplateCommon):
with self.assertRaises(MissingError): with self.assertRaises(MissingError):
test = self.grandchild_task.name test = self.grandchild_task.name
def test_dissociating_customer_resets_equipment_appropriately(self):
partner1 = self._generate_partner()
partner2 = self._generate_partner()
equipment1 = self._generate_equipment(partner=partner1)
form = Form(self.task1)
form.customer = partner1
form.equipment_ids.add(equipment1)
# Switching the partner should trigger on_change that makes sure equipments are linked to the new partner
form.customer = partner2
self.assertFalse(equipment1 in self.task1.equipment_ids)
@tagged('-at_install', 'post_install', 'slow') @tagged('-at_install', 'post_install', 'slow')
class TestTaskTemplateTour(HttpCase, TestTaskTemplateCommon): class TestTaskTemplateTour(HttpCase, TestTaskTemplateCommon):

View file

@ -23,7 +23,9 @@
</group> </group>
<group> <group>
<field name="customer"/> <field name="customer"/>
<field name="equipment_id" domain="[('partner_location_id', '=', customer)]"/> <field name="equipment_ids"
domain="[('partner_location_id', '=', customer)]"
context="{'tree_view_ref': 'bemade_fsm.equipment_view_tree'}"/>
<field name="tags" widget="many2many_tags"/> <field name="tags" widget="many2many_tags"/>
<field name="company_id" /> <field name="company_id" />
</group> </group>