diff --git a/__manifest__.py b/__manifest__.py index bbc2493..7400045 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -44,6 +44,7 @@ 'views/res_partner.xml', 'views/menus.xml', 'views/task_views.xml', + 'views/sale_order_views.xml', ], 'assets': { 'web.assets_tests': [ diff --git a/models/equipment.py b/models/equipment.py index 6ea99d6..bdc2e0b 100644 --- a/models/equipment.py +++ b/models/equipment.py @@ -41,13 +41,16 @@ class Equipment(models.Model): partner_id = fields.Many2one('res.partner', string="Owner", compute="_compute_partner", - search="_search_partner", ) + search="_search_partner",) + description = fields.Text(string="Description", tracking=True) partner_location_id = fields.Many2one('res.partner', string="Physical Address", - tracking=True, ) + tracking=True, + required=True, + ondelete='cascade') location_notes = fields.Text(string="Physical Location Notes", tracking=True) diff --git a/models/sale_order.py b/models/sale_order.py index 10b166b..8a1f792 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -18,6 +18,12 @@ class SaleOrder(models.Model): string='Work Order Recipients', store=True) + equipment_ids = fields.Many2many(comodel_name='bemade_fsm.equipment', + compute='_compute_equipment', + inverse='_inverse_equipment', + string='Equipment to Service', + store=True) + @api.depends('partner_id') def _compute_default_contacts(self): for rec in self: @@ -27,6 +33,14 @@ class SaleOrder(models.Model): def _inverse_default_contacts(self): pass + @api.depends('partner_id') + def _compute_equipment(self): + for rec in self: + rec.equipment_ids = self.partner_id.equipment_ids if len(self.partner_id.equipment_ids) <= 1 else False + + def _inverse_equipment(self): + pass + class SaleOrderLine(models.Model): _inherit = 'sale.order.line' diff --git a/static/tests/tours/task_equipment_tour.js b/static/tests/tours/task_equipment_tour.js index 4599fb5..c196d7b 100644 --- a/static/tests/tours/task_equipment_tour.js +++ b/static/tests/tours/task_equipment_tour.js @@ -1,10 +1,11 @@ /** @odoo-module **/ import tour from 'web_tour.tour'; + const TEST_COMPANY = "Test Partner Company"; const TEST_EQPT1 = "Test Equipment 1"; const TEST_EQPT2 = "Test Equipment 2"; -tour.register('task_equipment_tour', { +tour.register('equipment_base_tour', { test: true, url: '/web', }, /* Create a new "Test Equipment" and link it to "Test Partner Company" */ @@ -66,10 +67,40 @@ tour.register('task_equipment_tour', { content: 'Make sure we have a first test equipment', /*trigger: `div[name="equipment_ids"]:has(td:contains(${TEST_EQPT1}))`,*/ trigger: `td:contains(${TEST_EQPT1})`, - run: function() {}, + run: function () { + }, }, { content: 'Make sure we have a second test equipment', trigger: `div[name="equipment_ids"]:has(td:contains(${TEST_EQPT2}))`, - run: function() {}, + run: function () { + }, } - ]) \ No newline at end of file + ]); + +tour.register('equipment_sale_order_tour', { + test: true, + url: '/web', +}, [tour.stepUtils.showAppsMenuItem(), { + content: 'Navigate to the Sales menu', + trigger: '.o_app[data-menu-xmlid="sale.sale_menu_root"]', +}, { + content: 'Create an order', + trigger: 'button.o_list_button_add', +}, { + content: 'Select the test partner', + trigger: 'div[name="partner_id"] input', + run: `text ${TEST_COMPANY}`, +}, { + content: 'Click the partner in the dropdown', + trigger: `li a.dropdown-item:contains(${TEST_COMPANY})`, +}, { + content: 'Save', + trigger: 'button.o_form_button_save', +}, { + content: 'Navigate to the Field Service tab.', + trigger: 'a.nav-link[role="tab"]:contains(Field Service)' +}, { + content: 'Check that default equipment shows up.', + trigger: `tr:has(label.o_form_label:contains(Site Equipment)) td.o_field_cell:contains(${TEST_EQPT1})` +}, +]); \ No newline at end of file diff --git a/tests/test_equipment.py b/tests/test_equipment.py index 197938c..2f05a42 100644 --- a/tests/test_equipment.py +++ b/tests/test_equipment.py @@ -1,5 +1,7 @@ from odoo.tests.common import HttpCase, tagged from .test_bemade_fsm_common import FSMManagerUserTransactionCase +from odoo import Command +from odoo.exceptions import MissingError @tagged("-at_install", "post_install") @@ -32,8 +34,24 @@ class TestEquipmentCommon(FSMManagerUserTransactionCase): @tagged('-at_install', 'post_install') -class TestEquipmentTour(HttpCase, TestEquipmentCommon): +class TestEquipmentBase(TestEquipmentCommon): - def test_equipment_tour(self): - self.start_tour('/web', 'task_equipment_tour', + def test_crd(self): + # Just make sure the basic ORM stuff is OK + self.assertTrue(self.equipment in self.partner_company.equipment_ids) + self.assertTrue(len(self.partner_company.equipment_ids) == 1) + self.partner_company.write({'equipment_ids': [Command.set([])]}) + # Delete should cascade + with self.assertRaises(MissingError): + self.equipment.name + + +@tagged('-at_install', 'post_install') +class TestEquipmentTours(HttpCase, TestEquipmentCommon): + + def test_equipment_base_tour(self): + self.start_tour('/web', 'equipment_base_tour', login=self.user.login, ) + + def test_equipment_sale_order_tour(self): + self.start_tour('/web', 'equipment_sale_order_tour', login=self.user.login) \ No newline at end of file diff --git a/views/res_partner.xml b/views/res_partner.xml index d451cb9..6e14a42 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -25,10 +25,18 @@ + + + + + + + + - +