diff --git a/addons/event_booth_sale/models/sale_order_line.py b/addons/event_booth_sale/models/sale_order_line.py index 68da88c5db7..c6f873aacab 100644 --- a/addons/event_booth_sale/models/sale_order_line.py +++ b/addons/event_booth_sale/models/sale_order_line.py @@ -64,10 +64,9 @@ class SaleOrderLine(models.Model): if self.event_booth_pending_ids and (not self.event_id or self.event_id != self.event_booth_pending_ids.event_id): self.event_booth_pending_ids = None - @api.onchange('event_booth_pending_ids') - def _onchange_event_booth_pending_ids(self): - # trigger the description computation - self.product_id_change() + @api.depends('event_booth_pending_ids') + def _compute_name(self): + super()._compute_name() def _update_event_booths(self, set_paid=False): for so_line in self.filtered('is_event_booth'): diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index 201ea8824f3..d81abfb76f4 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -125,12 +125,18 @@ class SaleOrderLine(models.Model): @api.depends('product_uom', 'product_uom_qty') def _compute_price_unit(self): - super(SaleOrderLine, self.filtered(lambda l: not l.event_ticket_id))._compute_price_unit() + # We want to recompute the price if the product changes + # Not for other triggers like product_uom or product_uom_qty + # for event SOL + if self._origin.product_id != self.product_id: + super()._compute_price_unit() + else: + super(SaleOrderLine, self.filtered(lambda l: not l.event_ticket_id))._compute_price_unit() - @api.onchange('event_ticket_id') - def _onchange_event_ticket_id(self): + @api.depends('event_ticket_id') + def _compute_name(self): # we call this to force update the default name - self.product_id_change() + super()._compute_name() def unlink(self): self._unlink_associated_registrations() @@ -159,6 +165,8 @@ class SaleOrderLine(models.Model): def _get_display_price(self, product): if self.event_ticket_id and self.event_id: - return self.event_ticket_id.with_context(pricelist=self.order_id.pricelist_id.id, uom=self.product_uom.id).price_reduce + return self.event_ticket_id.with_context( + pricelist=self.order_id.pricelist_id.id, + uom=self.product_uom.id).price_reduce else: return super()._get_display_price(product) diff --git a/addons/event_sale/tests/test_event_sale.py b/addons/event_sale/tests/test_event_sale.py index 68346f72eb4..8991aa7ea64 100644 --- a/addons/event_sale/tests/test_event_sale.py +++ b/addons/event_sale/tests/test_event_sale.py @@ -242,12 +242,10 @@ class TestEventSale(TestEventSaleCommon): 'product_id': event_product.product_variant_id.id, 'product_uom_qty': 1, 'product_uom': event_product.uom_id.id, - 'price_unit': event_product.list_price, 'order_id': so.id, 'event_id': event.id, 'event_ticket_id': event_ticket.id, }) - sol.product_id_change() self.assertEqual(so.amount_total, 660.0, "Ticket is $1000 but the event product is on a pricelist 10 -> 6. So, $600 + a 10% tax.") @users('user_salesman') diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index 42275f3b6ea..d7630227e8c 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -150,7 +150,9 @@ class SaleOrder(models.Model): return [('id', 'not in', order_ids)] return ['&', ('order_line.invoice_lines.move_id.move_type', 'in', ('out_invoice', 'out_refund')), ('order_line.invoice_lines.move_id', operator, value)] - name = fields.Char(string='Order Reference', required=True, copy=False, readonly=True, states={'draft': [('readonly', False)]}, index=True, default=lambda self: _('New')) + name = fields.Char( + string='Order Reference', required=True, copy=False, readonly=True, + states={'draft': [('readonly', False)]}, index=True, default=lambda self: _('New')) origin = fields.Char(string='Source Document', help="Reference of the document that generated this sales order request.") client_order_ref = fields.Char(string='Customer Reference', copy=False) reference = fields.Char(string='Payment Ref.', copy=False, @@ -352,7 +354,7 @@ class SaleOrder(models.Model): tax_totals = account_move._get_tax_totals(order.partner_id, tax_lines_data, order.amount_total, order.amount_untaxed, order.currency_id) order.tax_totals_json = json.dumps(tax_totals) - # YTI TODO: Convert into compute method, however this introduce + # YTI TODO: Convert into compute method, however this introduces # a behavior change that breaks the test test_reservation_method_w_sale # Note: This should be the case @api.onchange('expected_date') @@ -488,7 +490,6 @@ class SaleOrder(models.Model): if partner.sale_warn == 'block': self.update({'partner_id': False, 'partner_invoice_id': False, 'partner_shipping_id': False, 'pricelist_id': False}) - return { 'warning': { 'title': _("Warning for %s", partner.name), diff --git a/addons/sale/models/sale_order_line.py b/addons/sale/models/sale_order_line.py index 3876473c526..f0e93e3bb5e 100644 --- a/addons/sale/models/sale_order_line.py +++ b/addons/sale/models/sale_order_line.py @@ -143,27 +143,11 @@ class SaleOrderLine(models.Model): taxes = line.product_id.taxes_id.filtered(lambda t: t.company_id == line.env.company) line.tax_id = fpos.map_tax(taxes) - @api.model - def _prepare_add_missing_fields(self, values): - """ Deduce missing required fields from the onchange """ - res = {} - onchange_fields = ['name', 'price_unit', 'product_uom', 'tax_id'] - if values.get('order_id') and values.get('product_id') and any(f not in values for f in onchange_fields): - line = self.new(values) - line.product_id_change() - for field in onchange_fields: - if field not in values: - res[field] = line._fields[field].convert_to_write(line[field], line) - return res - @api.model_create_multi def create(self, vals_list): for values in vals_list: if values.get('display_type', self.default_get(['display_type'])['display_type']): values.update(product_id=False, price_unit=0, product_uom_qty=0, product_uom=False, customer_lead=0) - - values.update(self._prepare_add_missing_fields(values)) - lines = super().create(vals_list) for line in lines: if line.product_id and line.order_id.state == 'sale': @@ -226,7 +210,9 @@ class SaleOrderLine(models.Model): return result order_id = fields.Many2one('sale.order', string='Order Reference', required=True, ondelete='cascade', index=True, copy=False) - name = fields.Text(string='Description', required=True) + name = fields.Text( + string='Description', required=True, + compute='_compute_name', store=True, readonly=False, pre_compute=True) sequence = fields.Integer(string='Sequence', default=10) invoice_lines = fields.Many2many('account.move.line', 'sale_order_line_invoice_rel', 'order_line_id', 'invoice_line_id', string='Invoice Lines', copy=False) @@ -238,7 +224,7 @@ class SaleOrderLine(models.Model): ], string='Invoice Status', compute='_compute_invoice_status', store=True, default='no') price_unit = fields.Float( 'Unit Price', required=True, digits='Product Price', - compute='_compute_price_unit', store=True, readonly=False) + compute='_compute_price_unit', store=True, readonly=False, pre_compute=True) price_subtotal = fields.Monetary(compute='_compute_amount', string='Subtotal', store=True) price_tax = fields.Float(compute='_compute_amount', string='Total Tax', store=True) @@ -264,14 +250,22 @@ class SaleOrderLine(models.Model): product_uom_qty = fields.Float( string='Quantity', digits='Product Unit of Measure', required=True, default=1.0, compute='_compute_product_uom_qty', store=True, readonly=False, pre_compute=True) - product_uom = fields.Many2one('uom.uom', string='Unit of Measure', domain="[('category_id', '=', product_uom_category_id)]", ondelete="restrict") + product_uom = fields.Many2one( + 'uom.uom', string='Unit of Measure', + compute='_compute_product_uom', store=True, readonly=False, pre_compute=True, + domain="[('category_id', '=', product_uom_category_id)]", ondelete="restrict") product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id') product_uom_readonly = fields.Boolean(compute='_compute_product_uom_readonly') - product_custom_attribute_value_ids = fields.One2many('product.attribute.custom.value', 'sale_order_line_id', string="Custom Values", copy=True) + product_custom_attribute_value_ids = fields.One2many( + 'product.attribute.custom.value', 'sale_order_line_id', + string="Custom Values", copy=True, + compute='_compute_custom_attribute_values', store=True, readonly=False) # M2M holding the values of product.attribute with create_variant field set to 'no_variant' # It allows keeping track of the extra_price associated to those attribute values and add them to the SO line description - product_no_variant_attribute_value_ids = fields.Many2many('product.template.attribute.value', string="Extra Values", ondelete='restrict') + product_no_variant_attribute_value_ids = fields.Many2many( + 'product.template.attribute.value', string="Extra Values", ondelete='restrict', + compute='_compute_no_variant_attribute_values', store=True, readonly=False) qty_delivered_method = fields.Selection([ ('manual', 'Manual'), @@ -325,11 +319,12 @@ class SaleOrderLine(models.Model): product_packaging_id = fields.Many2one( 'product.packaging', string='Packaging', - compute='_compute_product_packaging_id', store=True, readonly=False, + compute='_compute_product_packaging_id', store=True, readonly=False, pre_compute=True, domain="[('sales', '=', True), ('product_id','=',product_id)]", check_company=True) product_packaging_qty = fields.Float( - 'Packaging Quantity', compute='_compute_product_packaging_qty', store=True, readonly=False) + 'Packaging Quantity', + compute='_compute_product_packaging_qty', store=True, readonly=False, pre_compute=True) @api.depends('state') def _compute_product_uom_readonly(self): @@ -461,9 +456,17 @@ class SaleOrderLine(models.Model): packaging_uom_qty / line.product_packaging_id.qty, precision_rounding=packaging_uom.rounding) - @api.depends('product_packaging_qty') + @api.depends('product_id') + def _compute_product_uom(self): + for line in self: + if not line.product_uom or (line.product_id.uom_id.id != line.product_uom.id): + line.product_uom = line.product_id.uom_id + + @api.depends('product_packaging_qty', 'product_id') def _compute_product_uom_qty(self): for line in self: + if not line.product_uom or (line.product_id.uom_id.id != line.product_uom.id): + line.product_uom_qty = line.product_uom_qty or 1.0 if not line.product_packaging_id: continue packaging_uom = line.product_packaging_id.product_uom_id @@ -620,41 +623,47 @@ class SaleOrderLine(models.Model): # negative discounts (= surcharge) are included in the display price return max(base_price, final_price) + @api.depends('product_id') + def _compute_name(self): + for line in self: + if not line.product_id: + continue + product = line.product_id.with_context( + lang=get_lang(line.env, line.order_id.partner_id.lang).code, + partner=line.order_id.partner_id, + quantity=line.product_uom_qty, + date=line.order_id.date_order, + pricelist=line.order_id.pricelist_id.id, + uom=line.product_uom.id) + line.name = line.get_sale_order_line_multiline_description_sale(product) + + @api.depends('product_id') + def _compute_custom_attribute_values(self): + for line in self: + if not line.product_id: + continue + valid_values = line.product_id.product_tmpl_id.valid_product_template_attribute_line_ids.product_template_value_ids + # remove the is_custom values that don't belong to this template + for pacv in line.product_custom_attribute_value_ids: + if pacv.custom_product_template_attribute_value_id not in valid_values: + line.product_custom_attribute_value_ids -= pacv + + @api.depends('product_id') + def _compute_no_variant_attribute_values(self): + for line in self: + if not line.product_id: + continue + valid_values = line.product_id.product_tmpl_id.valid_product_template_attribute_line_ids.product_template_value_ids + # remove the no_variant attributes that don't belong to this template + for ptav in line.product_no_variant_attribute_value_ids: + if ptav._origin not in valid_values: + line.product_no_variant_attribute_value_ids -= ptav + @api.onchange('product_id') def product_id_change(self): if not self.product_id: return - valid_values = self.product_id.product_tmpl_id.valid_product_template_attribute_line_ids.product_template_value_ids - # remove the is_custom values that don't belong to this template - for pacv in self.product_custom_attribute_value_ids: - if pacv.custom_product_template_attribute_value_id not in valid_values: - self.product_custom_attribute_value_ids -= pacv - - # remove the no_variant attributes that don't belong to this template - for ptav in self.product_no_variant_attribute_value_ids: - if ptav._origin not in valid_values: - self.product_no_variant_attribute_value_ids -= ptav - - vals = {} - if not self.product_uom or (self.product_id.uom_id.id != self.product_uom.id): - vals['product_uom'] = self.product_id.uom_id - vals['product_uom_qty'] = self.product_uom_qty or 1.0 - - product = self.product_id.with_context( - lang=get_lang(self.env, self.order_id.partner_id.lang).code, - partner=self.order_id.partner_id, - quantity=vals.get('product_uom_qty') or self.product_uom_qty, - date=self.order_id.date_order, - pricelist=self.order_id.pricelist_id.id, - uom=self.product_uom.id - ) - - vals.update(name=self.get_sale_order_line_multiline_description_sale(product)) - - if self.order_id.pricelist_id and self.order_id.partner_id: - vals['price_unit'] = self.env['account.tax']._fix_tax_included_price_company(self._get_display_price(product), product.taxes_id, self.tax_id, self.company_id) - self.update(vals) - + product = self.product_id if product.sale_line_warn != 'no-message': if product.sale_line_warn == 'block': self.product_id = False @@ -671,8 +680,8 @@ class SaleOrderLine(models.Model): 'order_id.partner_id') def _compute_price_unit(self): for line in self: + line.price_unit = 0.0 if not line.product_uom or not line.product_id: - line.price_unit = 0.0 continue if line.order_id.pricelist_id and line.order_id.partner_id: product = line.product_id.with_context( diff --git a/addons/sale/tests/test_onchange.py b/addons/sale/tests/test_onchange.py index aef1a6f1aee..95e3a2997d6 100644 --- a/addons/sale/tests/test_onchange.py +++ b/addons/sale/tests/test_onchange.py @@ -151,13 +151,12 @@ class TestOnchangeProductId(TransactionCase): 'pricelist_id': christmas_pricelist.id, }) - order_line = self.env['sale.order.line'].new({ + order_line = self.env['sale.order.line'].create({ 'order_id': so.id, 'product_id': computer_case.id, }) # force compute uom and prices - order_line.product_id_change() order_line._onchange_discount() self.assertEqual(order_line.price_subtotal, 90, "Christmas discount pricelist rule not applied") self.assertEqual(order_line.discount, 10, "Christmas discount not equalt to 10%") @@ -207,13 +206,11 @@ class TestOnchangeProductId(TransactionCase): 'pricelist_id': second_pricelist.id, }) - order_line = self.env['sale.order.line'].new({ + order_line = self.env['sale.order.line'].create({ 'order_id': so.id, 'product_id': computer_case.id, }) - # force compute uom and prices - order_line.product_id_change() order_line._onchange_discount() self.assertEqual(order_line.price_subtotal, 81, "Second pricelist rule not applied") self.assertEqual(order_line.discount, 19, "Second discount not applied") @@ -270,7 +267,6 @@ class TestOnchangeProductId(TransactionCase): }) # force compute uom and prices - order_line.product_id_change() self.assertEqual(order_line.price_unit, 180, "First pricelist rule not applied") order_line.product_uom = new_uom self.assertEqual(order_line.price_unit, 1800, "First pricelist rule not applied") diff --git a/addons/sale/tests/test_reinvoice.py b/addons/sale/tests/test_reinvoice.py index 11f68dd4e97..14633a4e053 100644 --- a/addons/sale/tests/test_reinvoice.py +++ b/addons/sale/tests/test_reinvoice.py @@ -46,7 +46,6 @@ class TestReInvoice(TestSaleCommon): 'price_unit': self.company_data['product_order_cost'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line1.product_id_change() sale_order_line2 = self.env['sale.order.line'].create({ 'name': self.company_data['product_delivery_cost'].name, 'product_id': self.company_data['product_delivery_cost'].id, @@ -56,7 +55,6 @@ class TestReInvoice(TestSaleCommon): 'price_unit': self.company_data['product_delivery_cost'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line2.product_id_change() self.sale_order.action_confirm() @@ -164,7 +162,6 @@ class TestReInvoice(TestSaleCommon): 'price_unit': self.company_data['product_delivery_sales_price'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line1.product_id_change() sale_order_line2 = self.env['sale.order.line'].create({ 'name': self.company_data['product_order_sales_price'].name, 'product_id': self.company_data['product_order_sales_price'].id, @@ -174,7 +171,6 @@ class TestReInvoice(TestSaleCommon): 'price_unit': self.company_data['product_order_sales_price'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line2.product_id_change() self.sale_order.action_confirm() # create invoice lines and validate it @@ -268,7 +264,6 @@ class TestReInvoice(TestSaleCommon): 'discount': 100.00, 'order_id': self.sale_order.id, }) - so_line1.product_id_change() so_line2 = self.env['sale.order.line'].create({ 'name': self.company_data['product_delivery_sales_price'].name, 'product_id': self.company_data['product_delivery_sales_price'].id, @@ -278,7 +273,6 @@ class TestReInvoice(TestSaleCommon): 'discount': 100.00, 'order_id': self.sale_order.id, }) - so_line2.product_id_change() self.sale_order.action_confirm() diff --git a/addons/sale/tests/test_sale_flow.py b/addons/sale/tests/test_sale_flow.py index 8d07096001b..3095b5345da 100644 --- a/addons/sale/tests/test_sale_flow.py +++ b/addons/sale/tests/test_sale_flow.py @@ -69,8 +69,6 @@ class TestSaleFlow(TestSaleCommonBase): }), ], }) - for line in sale_order.order_line: - line.product_id_change() sale_order.action_confirm() diff --git a/addons/sale/tests/test_sale_order.py b/addons/sale/tests/test_sale_order.py index ff0627180a9..e260359d351 100644 --- a/addons/sale/tests/test_sale_order.py +++ b/addons/sale/tests/test_sale_order.py @@ -283,7 +283,6 @@ class TestSaleOrder(TestSaleCommon): # Trigger onchange to reset discount, unit price, subtotal, ... for line in self.sale_order.order_line: - line.product_id_change() line._onchange_discount() for line in self.sale_order.order_line: diff --git a/addons/sale/tests/test_sale_pricelist.py b/addons/sale/tests/test_sale_pricelist.py index 7c0fd5c5970..a7dc070cec4 100644 --- a/addons/sale/tests/test_sale_pricelist.py +++ b/addons/sale/tests/test_sale_pricelist.py @@ -121,7 +121,6 @@ class TestSaleOrder(TestSaleCommon): self.sale_order.write({'pricelist_id': self.pricelist_discount_incl.id}) # Trigger onchange to reset discount, unit price, subtotal, ... for line in self.sale_order.order_line: - line.product_id_change() line._onchange_discount() # Check that pricelist of the SO has been applied on the sale order lines or not for line in self.sale_order.order_line: @@ -145,7 +144,6 @@ class TestSaleOrder(TestSaleCommon): self.sale_order.write({'pricelist_id': self.pricelist_discount_excl.id}) # Trigger onchange to reset discount, unit price, subtotal, ... for line in self.sale_order.order_line: - line.product_id_change() line._onchange_discount() # Check pricelist of the SO apply or not on order lines where pricelist contains formula that add 15% on the cost price diff --git a/addons/sale_management/models/sale_order.py b/addons/sale_management/models/sale_order.py index 2b97877cf13..5086e31ec52 100644 --- a/addons/sale_management/models/sale_order.py +++ b/addons/sale_management/models/sale_order.py @@ -177,16 +177,16 @@ class SaleOrderLine(models.Model): sale_order_option_ids = fields.One2many('sale.order.option', 'line_id', 'Optional Products Lines') - # Take the description on the order template if the product is present in it - @api.onchange('product_id') - def product_id_change(self): - domain = super(SaleOrderLine, self).product_id_change() - if self.product_id and self.order_id.sale_order_template_id: - for line in self.order_id.sale_order_template_id.sale_order_template_line_ids: - if line.product_id == self.product_id: - self.name = line.with_context(lang=self.order_id.partner_id.lang).name + self._get_sale_order_line_multiline_description_variants() - break - return domain + @api.depends('product_id') + def _compute_name(self): + # Take the description on the order template if the product is present in it + super()._compute_name() + for line in self: + if line.product_id and line.order_id.sale_order_template_id: + for line in line.order_id.sale_order_template_id.sale_order_template_line_ids: + if line.product_id == line.product_id: + line.name = line.with_context(lang=line.order_id.partner_id.lang).name + line._get_sale_order_line_multiline_description_variants() + break class SaleOrderOption(models.Model): diff --git a/addons/sale_product_matrix/models/sale_order.py b/addons/sale_product_matrix/models/sale_order.py index c43c87737f8..4b11fd966ba 100644 --- a/addons/sale_product_matrix/models/sale_order.py +++ b/addons/sale_product_matrix/models/sale_order.py @@ -116,16 +116,13 @@ class SaleOrder(models.Model): product_no_variant_attribute_value_ids=no_variant_attribute_values.ids) )) if product_ids: - res = False if new_lines: # Add new SO lines self.update(dict(order_line=new_lines)) # Recompute prices for new/modified lines for line in self.order_line.filtered(lambda line: line.product_id.id in product_ids): - res = line.product_id_change() or res line._onchange_discount() - return res def _get_matrix(self, product_template): """Return the matrix of the given product, updated with current SOLines quantities. diff --git a/addons/sale_timesheet/tests/test_reinvoice.py b/addons/sale_timesheet/tests/test_reinvoice.py index 4171279dacb..699ac0026fb 100644 --- a/addons/sale_timesheet/tests/test_reinvoice.py +++ b/addons/sale_timesheet/tests/test_reinvoice.py @@ -61,7 +61,6 @@ class TestReInvoice(TestCommonSaleTimesheet): 'price_unit': self.company_data['product_order_cost'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line1.product_id_change() sale_order_line2 = self.env['sale.order.line'].create({ 'name': self.company_data['product_delivery_cost'].name, 'product_id': self.company_data['product_delivery_cost'].id, @@ -70,7 +69,6 @@ class TestReInvoice(TestCommonSaleTimesheet): 'price_unit': self.company_data['product_delivery_cost'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line2.product_id_change() self.sale_order.action_confirm() @@ -162,7 +160,6 @@ class TestReInvoice(TestCommonSaleTimesheet): 'price_unit': self.company_data['product_delivery_sales_price'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line1.product_id_change() sale_order_line2 = self.env['sale.order.line'].create({ 'name': self.company_data['product_order_sales_price'].name, 'product_id': self.company_data['product_order_sales_price'].id, @@ -172,7 +169,6 @@ class TestReInvoice(TestCommonSaleTimesheet): 'price_unit': self.company_data['product_order_sales_price'].list_price, 'order_id': self.sale_order.id, }) - sale_order_line2.product_id_change() self.sale_order.action_confirm() # let's log some timesheets (on the project created by sale_order_line1) diff --git a/addons/sale_timesheet/tests/test_sale_service.py b/addons/sale_timesheet/tests/test_sale_service.py index 7b2765aa15a..5b8f0ca2a5c 100644 --- a/addons/sale_timesheet/tests/test_sale_service.py +++ b/addons/sale_timesheet/tests/test_sale_service.py @@ -141,7 +141,6 @@ class TestSaleService(TestCommonSaleTimesheet): 'price_unit': self.product_delivery_timesheet2.list_price, 'order_id': self.sale_order.id, }) - so_line_deliver_global_project.product_id_change() self.sale_order.action_confirm() task_serv2 = self.env['project.task'].search([('sale_line_id', '=', so_line_deliver_global_project.id)]) @@ -187,7 +186,6 @@ class TestSaleService(TestCommonSaleTimesheet): 'price_unit': self.product_delivery_timesheet3.list_price, 'order_id': self.sale_order.id, }) - so_line_deliver_new_task_project.product_id_change() self.sale_order.action_confirm() task_serv2 = self.env['project.task'].search([('sale_line_id', '=', so_line_deliver_new_task_project.id)]) @@ -510,8 +508,6 @@ class TestSaleService(TestCommonSaleTimesheet): 'price_unit': self.product_delivery_timesheet3.list_price, 'order_id': self.sale_order.id, }) - so_line_deliver_new_task_project.product_id_change() - so_line_deliver_new_task_project_2.product_id_change() self.sale_order.action_confirm() project = so_line_deliver_new_task_project.project_id diff --git a/addons/sale_timesheet/tests/test_sale_timesheet.py b/addons/sale_timesheet/tests/test_sale_timesheet.py index f7d87d58727..b0bff62ae92 100644 --- a/addons/sale_timesheet/tests/test_sale_timesheet.py +++ b/addons/sale_timesheet/tests/test_sale_timesheet.py @@ -50,8 +50,6 @@ class TestSaleTimesheet(TestCommonSaleTimesheet): 'price_unit': self.product_order_timesheet2.list_price, 'order_id': sale_order.id, }) - so_line_ordered_project_only.product_id_change() - so_line_ordered_global_project.product_id_change() sale_order.action_confirm() task_serv2 = self.env['project.task'].search([('sale_line_id', '=', so_line_ordered_global_project.id)]) project_serv1 = self.env['project.project'].search([('sale_line_id', '=', so_line_ordered_project_only.id)]) @@ -188,8 +186,6 @@ class TestSaleTimesheet(TestCommonSaleTimesheet): 'price_unit': self.product_delivery_timesheet3.list_price, 'order_id': sale_order.id, }) - so_line_deliver_global_project.product_id_change() - so_line_deliver_task_project.product_id_change() # confirm SO sale_order.action_confirm() @@ -415,8 +411,6 @@ class TestSaleTimesheet(TestCommonSaleTimesheet): 'price_unit': self.product_delivery_timesheet3.list_price, 'order_id': sale_order.id, }) - so_line_deliver_global_project.product_id_change() - so_line_deliver_task_project.product_id_change() # confirm SO sale_order.action_confirm() diff --git a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py index 9c04244c79e..cf47621e3f1 100644 --- a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py +++ b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py @@ -185,7 +185,6 @@ class TestWebsiteSaleProductPricelist(TestSaleProductAttributeValueCommon): self.assertEqual(round(sol.price_total), 110.0, "110$ with 10% included tax") so.pricelist_id = pricelist so.fiscal_position_id = fpos - sol.product_id_change() with MockRequest(self.env, website=current_website, sale_order_id=so.id): so._cart_update(product_id=test_product.product_variant_id.id, line_id=sol.id, set_qty=1) self.assertEqual(round(sol.price_total), 50, "100$ with 50% discount + 0% tax (mapped from fp 10% -> 0%)")