From 2806c5fd9f00128b24e49d6a84a9dd03abff489a Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Thu, 28 Oct 2021 14:23:35 +0200 Subject: [PATCH] [IMP] sale: Convert onchange_partner_id into compute method --- addons/sale/models/sale_order.py | 88 +++++++++++-------- addons/sale/tests/test_reinvoice.py | 2 - addons/sale/tests/test_sale_flow.py | 1 - addons/sale/tests/test_sale_order.py | 2 - addons/sale_management/models/sale_order.py | 11 +-- addons/sale_timesheet/tests/test_reinvoice.py | 1 - .../wizard/project_create_sale_order.py | 1 - addons/website_sale/controllers/main.py | 3 +- addons/website_sale/models/website.py | 3 +- 9 files changed, 57 insertions(+), 55 deletions(-) diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index dad902d7cb9..588f26c23e1 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -187,6 +187,7 @@ class SaleOrder(models.Model): user_id = fields.Many2one( 'res.users', string='Salesperson', index=True, tracking=2, default=lambda self: self.env.user, + compute='_compute_order_info_from_partner', store=True, readonly=False, domain=lambda self: [('groups_id', 'in', self.env.ref('sales_team.group_sale_salesman').id)]) partner_id = fields.Many2one( 'res.partner', string='Customer', readonly=True, @@ -195,12 +196,14 @@ class SaleOrder(models.Model): domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) partner_invoice_id = fields.Many2one( 'res.partner', string='Invoice Address', - readonly=True, required=True, - states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]}, + readonly=False, required=True, + states={'draft': [('done', True)], 'cancel': [('readonly', True)]}, + compute='_compute_order_info_from_partner', store=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) partner_shipping_id = fields.Many2one( - 'res.partner', string='Delivery Address', readonly=True, required=True, - states={'draft': [('readonly', False)], 'sent': [('readonly', False)], 'sale': [('readonly', False)]}, + 'res.partner', string='Delivery Address', readonly=False, required=True, + states={'draft': [('done', True)], 'cancel': [('readonly', True)]}, + compute='_compute_order_info_from_partner', store=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) pricelist_id = fields.Many2one( @@ -227,7 +230,9 @@ class SaleOrder(models.Model): ('no', 'Nothing to Invoice') ], string='Invoice Status', compute='_get_invoice_status', store=True) - note = fields.Html('Terms and conditions', default=_default_note) + note = fields.Html( + 'Terms and conditions', default=_default_note, + compute='_compute_order_info_from_partner', store=True, readonly=False) terms_type = fields.Selection(related='company_id.terms_type') amount_untaxed = fields.Monetary(string='Untaxed Amount', store=True, compute='_amount_all', tracking=5) @@ -238,6 +243,7 @@ class SaleOrder(models.Model): payment_term_id = fields.Many2one( 'account.payment.term', string='Payment Terms', check_company=True, # Unrequired company + compute='_compute_order_info_from_partner', store=True, readonly=False, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",) fiscal_position_id = fields.Many2one( 'account.fiscal.position', string='Fiscal Position', @@ -253,6 +259,7 @@ class SaleOrder(models.Model): team_id = fields.Many2one( 'crm.team', 'Sales Team', ondelete="set null", tracking=True, + compute='_compute_order_info_from_partner', store=True, readonly=False, change_default=True, default=_get_default_team, check_company=True, # Unrequired company domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") @@ -413,8 +420,8 @@ class SaleOrder(models.Model): )._get_fiscal_position(order.partner_id, order.partner_shipping_id) order.fiscal_position_id = cache[key] - @api.onchange('partner_id') - def onchange_partner_id(self): + @api.depends('partner_id') + def _compute_order_info_from_partner(self): """ Update the following fields when the partner is changed: - Pricelist @@ -422,42 +429,45 @@ class SaleOrder(models.Model): - Invoice address - Delivery address - Sales Team + - User + - Note """ - if not self.partner_id: - self.update({ - 'partner_invoice_id': False, - 'partner_shipping_id': False, - 'fiscal_position_id': False, - }) - return + for order in self: + if not order.partner_id: + order.update({ + 'partner_invoice_id': False, + 'partner_shipping_id': False, + 'fiscal_position_id': False, + }) + continue - self = self.with_company(self.company_id) + order = order.with_company(order.company_id) - addr = self.partner_id.address_get(['delivery', 'invoice']) - partner_user = self.partner_id.user_id or self.partner_id.commercial_partner_id.user_id - values = { - 'pricelist_id': self.partner_id.property_product_pricelist and self.partner_id.property_product_pricelist.id or False, - 'payment_term_id': self.partner_id.property_payment_term_id and self.partner_id.property_payment_term_id.id or False, - 'partner_invoice_id': addr['invoice'], - 'partner_shipping_id': addr['delivery'], - } - user_id = partner_user.id - if not self.env.context.get('not_self_saleperson'): - user_id = user_id or self.env.context.get('default_user_id', self.env.uid) - if user_id and self.user_id.id != user_id: - values['user_id'] = user_id + addr = order.partner_id.address_get(['delivery', 'invoice']) + partner_user = order.partner_id.user_id or order.partner_id.commercial_partner_id.user_id + values = { + 'pricelist_id': order.partner_id.property_product_pricelist and order.partner_id.property_product_pricelist.id or False, + 'payment_term_id': order.partner_id.property_payment_term_id and order.partner_id.property_payment_term_id.id or False, + 'partner_invoice_id': addr['invoice'], + 'partner_shipping_id': addr['delivery'], + } + user_id = partner_user.id + if not self.env.context.get('not_self_saleperson'): + user_id = user_id or self.env.context.get('default_user_id', self.env.uid) + if user_id and order.user_id.id != user_id: + values['user_id'] = user_id - if self.env['ir.config_parameter'].sudo().get_param('account.use_invoice_terms'): - if self.terms_type == 'html' and self.env.company.invoice_terms_html: - baseurl = html_keep_url(self.get_base_url() + '/terms') - values['note'] = _('Terms & Conditions: %s', baseurl) - elif not is_html_empty(self.env.company.invoice_terms): - values['note'] = self.with_context(lang=self.partner_id.lang).env.company.invoice_terms - if not self.env.context.get('not_self_saleperson') or not self.team_id: - values['team_id'] = self.env['crm.team'].with_context( - default_team_id=self.partner_id.team_id.id - )._get_default_team_id(domain=['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], user_id=user_id) - self.update(values) + if self.env['ir.config_parameter'].sudo().get_param('account.use_invoice_terms'): + if order.terms_type == 'html' and self.env.company.invoice_terms_html: + baseurl = html_keep_url(order.get_base_url() + '/terms') + values['note'] = _('Terms & Conditions: %s', baseurl) + elif not is_html_empty(self.env.company.invoice_terms): + values['note'] = order.with_context(lang=order.partner_id.lang).env.company.invoice_terms + if not self.env.context.get('not_self_saleperson') or not order.team_id: + values['team_id'] = self.env['crm.team'].with_context( + default_team_id=order.partner_id.team_id.id + )._get_default_team_id(domain=['|', ('company_id', '=', self.company_id.id), ('company_id', '=', False)], user_id=user_id) + order.update(values) @api.onchange('user_id') def onchange_user_id(self): diff --git a/addons/sale/tests/test_reinvoice.py b/addons/sale/tests/test_reinvoice.py index be414b81e8c..1a9fc279c16 100644 --- a/addons/sale/tests/test_reinvoice.py +++ b/addons/sale/tests/test_reinvoice.py @@ -58,7 +58,6 @@ class TestReInvoice(TestSaleCommon): }) sale_order_line2.product_id_change() - self.sale_order.onchange_partner_id() self.sale_order._compute_tax_id() self.sale_order.action_confirm() @@ -284,7 +283,6 @@ class TestReInvoice(TestSaleCommon): }) so_line2.product_id_change() - self.sale_order.onchange_partner_id() self.sale_order._compute_tax_id() self.sale_order.action_confirm() diff --git a/addons/sale/tests/test_sale_flow.py b/addons/sale/tests/test_sale_flow.py index c18d645f9b1..b5d10c67439 100644 --- a/addons/sale/tests/test_sale_flow.py +++ b/addons/sale/tests/test_sale_flow.py @@ -72,7 +72,6 @@ class TestSaleFlow(TestSaleCommonBase): for line in sale_order.order_line: line.product_id_change() - sale_order.onchange_partner_id() sale_order._compute_tax_id() sale_order.action_confirm() diff --git a/addons/sale/tests/test_sale_order.py b/addons/sale/tests/test_sale_order.py index 803c2f7a720..37d50eff4f7 100644 --- a/addons/sale/tests/test_sale_order.py +++ b/addons/sale/tests/test_sale_order.py @@ -512,7 +512,6 @@ class TestSaleOrder(TestSaleCommon): sale_order = self.env['sale.order'].create({ 'partner_id': partner.id, }) - sale_order.onchange_partner_id() self.assertEqual(sale_order.team_id.id, self.crm_team0.id, 'Should assign to team of sales person') def test_assign_sales_team_from_partner_team(self): @@ -525,7 +524,6 @@ class TestSaleOrder(TestSaleCommon): sale_order = self.env['sale.order'].create({ 'partner_id': partner.id, }) - sale_order.onchange_partner_id() self.assertEqual(sale_order.team_id.id, self.crm_team1.id, 'Should assign to team of partner') def test_assign_sales_team_when_changing_user(self): diff --git a/addons/sale_management/models/sale_order.py b/addons/sale_management/models/sale_order.py index 4bbc71c34de..5fa998ce4fa 100644 --- a/addons/sale_management/models/sale_order.py +++ b/addons/sale_management/models/sale_order.py @@ -50,11 +50,12 @@ class SaleOrder(models.Model): default['validity_date'] = fields.Date.context_today(self) + timedelta(self.sale_order_template_id.number_of_days) return super(SaleOrder, self).copy(default=default) - @api.onchange('partner_id') - def onchange_partner_id(self): - super(SaleOrder, self).onchange_partner_id() - template = self.sale_order_template_id.with_context(lang=self.partner_id.lang) - self.note = template.note if not is_html_empty(template.note) else self.note + @api.depends('partner_id') + def _compute_order_info_from_partner(self): + super(SaleOrder, self)._compute_order_info_from_partner() + for order in self: + template = order.sale_order_template_id.with_context(lang=order.partner_id.lang) + order.note = template.note if not is_html_empty(template.note) else order.note def _compute_line_data_for_template_change(self, line): return { diff --git a/addons/sale_timesheet/tests/test_reinvoice.py b/addons/sale_timesheet/tests/test_reinvoice.py index 42054d046e9..5b815f56f98 100644 --- a/addons/sale_timesheet/tests/test_reinvoice.py +++ b/addons/sale_timesheet/tests/test_reinvoice.py @@ -72,7 +72,6 @@ class TestReInvoice(TestCommonSaleTimesheet): }) sale_order_line2.product_id_change() - self.sale_order.onchange_partner_id() self.sale_order._compute_tax_id() self.sale_order.action_confirm() diff --git a/addons/sale_timesheet/wizard/project_create_sale_order.py b/addons/sale_timesheet/wizard/project_create_sale_order.py index 7459f4cfd19..f89f3999191 100644 --- a/addons/sale_timesheet/wizard/project_create_sale_order.py +++ b/addons/sale_timesheet/wizard/project_create_sale_order.py @@ -117,7 +117,6 @@ class ProjectCreateSalesOrder(models.TransientModel): 'client_order_ref': self.project_id.name, 'company_id': self.project_id.company_id.id, }) - sale_order.onchange_partner_id() # rewrite the user as the onchange_partner_id erases it sale_order.write({'user_id': self.project_id.user_id.id}) sale_order.onchange_user_id() diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 507ac2552b1..eecfcccd1c4 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -834,8 +834,7 @@ class WebsiteSale(http.Controller): else: partner_id = self._checkout_form_save(mode, post, kw) if mode[1] == 'billing': - order.partner_id = partner_id - order.with_context(not_self_saleperson=True).onchange_partner_id() + order.with_context(not_self_saleperson=True).partner_id = partner_id # This is the *only* thing that the front end user will see/edit anyway when choosing billing address order.partner_invoice_id = partner_id if not kw.get('use_same'): diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py index 8d2cf5a4f87..7a587aaad2f 100644 --- a/addons/website_sale/models/website.py +++ b/addons/website_sale/models/website.py @@ -328,8 +328,7 @@ class Website(models.Model): fiscal_position = sale_order.fiscal_position_id.id # change the partner, and trigger the onchange - sale_order.write({'partner_id': partner.id}) - sale_order.with_context(not_self_saleperson=True).onchange_partner_id() + sale_order.with_context(not_self_saleperson=True).write({'partner_id': partner.id}) sale_order.write({'partner_invoice_id': partner.id}) sale_order['payment_term_id'] = self.sale_get_payment_term(partner)