[IMP] sale: Convert onchange_partner_id into compute method

This commit is contained in:
Yannick Tivisse
2021-12-02 12:12:01 +01:00
parent f0f30828fc
commit 2806c5fd9f
9 changed files with 57 additions and 55 deletions
+49 -39
View File
@@ -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):
-2
View File
@@ -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()
-1
View File
@@ -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()
-2
View File
@@ -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):
+6 -5
View File
@@ -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 {
@@ -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()
@@ -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()
+1 -2
View File
@@ -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'):
+1 -2
View File
@@ -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)