[IMP] sale: Convert onchange_user_id into a compute method

This commit is contained in:
Yannick Tivisse
2021-12-02 12:12:01 +01:00
parent f503e69d3b
commit f9f68adb2c
5 changed files with 43 additions and 54 deletions
+1 -1
View File
@@ -579,7 +579,7 @@ class PurchaseOrder(models.Model):
'narration': self.notes,
'currency_id': self.currency_id.id,
'invoice_user_id': self.user_id and self.user_id.id or self.env.user.id,
'partner_id': partner_invoice,
'partner_id': partner_invoice.id,
'fiscal_position_id': (self.fiscal_position_id or self.fiscal_position_id._get_fiscal_position(partner_invoice)).id,
'payment_reference': self.partner_ref or '',
'partner_bank_id': self.partner_id.bank_ids[:1].id,
+25 -30
View File
@@ -117,10 +117,6 @@ class SaleOrder(models.Model):
return _('Terms & Conditions: %s', baseurl)
return use_invoice_terms and self.env.company.invoice_terms or ''
@api.model
def _get_default_team(self):
return self.env['crm.team']._get_default_team_id()
def _search_invoice_ids(self, operator, value):
if operator == 'in' and value:
self.env.cr.execute("""
@@ -179,30 +175,31 @@ class SaleOrder(models.Model):
create_date = fields.Datetime(string='Creation Date', readonly=True, index=True, help="Date on which sales order is created.")
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,
'res.users', string='Salesperson', index=True, tracking=2,
compute='_compute_user_id', store=True, readonly=False, pre_compute=True,
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, pre_compute=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
'res.partner', string='Customer', readonly=False, pre_compute=True,
states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]},
required=True, change_default=True, index=True, tracking=1,
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",)
partner_invoice_id = fields.Many2one(
'res.partner', string='Invoice Address',
readonly=False, required=True, pre_compute=True,
states={'draft': [('done', True)], 'cancel': [('readonly', True)]},
states={'done': [('readonly', 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=False, required=True,
states={'draft': [('done', True)], 'cancel': [('readonly', True)]},
states={'done': [('readonly', True)], 'cancel': [('readonly', True)]},
compute='_compute_order_info_from_partner', store=True, pre_compute=True,
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]",)
pricelist_id = fields.Many2one(
'product.pricelist', string='Pricelist', check_company=True, # Unrequired company
required=True, readonly=True, pre_compute=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
required=False, readonly=False, store=True,
compute='_compute_order_info_from_partner', pre_compute=True,
states={'sale': [('readonly', True)], 'done': [('readonly', True)], 'cancel': [('readonly', True)]},
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]", tracking=1,
help="If you change the pricelist, only newly added lines will be affected.")
currency_id = fields.Many2one(related='pricelist_id.currency_id', depends=["pricelist_id"], store=True, ondelete="restrict")
@@ -253,8 +250,8 @@ 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
compute='_compute_team_id', store=True, readonly=False, pre_compute=True,
change_default=True, check_company=True, # Unrequired company
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
signature = fields.Image('Signature', help='Signature received through the portal.', copy=False, attachment=True, max_width=1024, max_height=1024)
@@ -440,18 +437,12 @@ class SaleOrder(models.Model):
order = order.with_company(order.company_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 order.terms_type == 'html' and self.env.company.invoice_terms_html:
@@ -459,18 +450,22 @@ class SaleOrder(models.Model):
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):
if self.user_id:
self.team_id = self.env['crm.team'].with_context(
default_team_id=self.team_id.id
)._get_default_team_id(user_id=self.user_id.id, domain=None)
@api.depends('partner_id')
def _compute_user_id(self):
for order in self:
order.user_id = order.partner_id.user_id or order.partner_id.commercial_partner_id.user_id or self.env.user
@api.depends('partner_id', 'user_id')
def _compute_team_id(self):
for order in self:
order.team_id = self.env['crm.team'].with_context(
default_team_id=(order.team_id or order.partner_id.team_id).id
)._get_default_team_id(
user_id=self.user_id.id,
domain=[('company_id', 'in', [self.company_id.id, False])]
)
@api.onchange('partner_id')
def _onchange_partner_id_warning(self):
-2
View File
@@ -534,7 +534,6 @@ class TestSaleOrder(TestSaleCommon):
'team_id': self.crm_team1.id
})
sale_order.user_id = self.user_in_team
sale_order.onchange_user_id()
self.assertEqual(sale_order.team_id.id, self.crm_team0.id, 'Should assign to team of sales person')
def test_keep_sales_team_when_changing_user_with_no_team(self):
@@ -544,7 +543,6 @@ class TestSaleOrder(TestSaleCommon):
'team_id': self.crm_team1.id
})
sale_order.user_id = self.user_not_in_team
sale_order.onchange_user_id()
self.assertEqual(sale_order.team_id.id, self.crm_team1.id, 'Should not reset the team to default')
def test_onchange_packaging_00(self):
+17 -20
View File
@@ -17,12 +17,6 @@ _logger = logging.getLogger(__name__)
class SaleOrder(models.Model):
_inherit = "sale.order"
@api.model
def _default_warehouse_id(self):
# !!! Any change to the default value may have to be repercuted
# on _init_column() below.
return self.env.user._get_default_warehouse_id()
incoterm = fields.Many2one(
'account.incoterms', 'Incoterm',
help="International Commercial Terms are a series of predefined commercial terms used in international transactions.")
@@ -34,9 +28,10 @@ class SaleOrder(models.Model):
,help="If you deliver all products at once, the delivery order will be scheduled based on the greatest "
"product lead time. Otherwise, it will be based on the shortest.")
warehouse_id = fields.Many2one(
'stock.warehouse', string='Warehouse',
required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
default=_default_warehouse_id, check_company=True)
'stock.warehouse', string='Warehouse', required=True,
compute='_compute_warehouse_id', store=True, readonly=False, pre_compute=True,
states={'sale': [('readonly', True)], 'done': [('readonly', False)], 'cancel': [('readonly', False)]},
check_company=True)
picking_ids = fields.One2many('stock.picking', 'sale_id', string='Transfers')
delivery_count = fields.Integer(string='Delivery Orders', compute='_compute_picking_ids')
procurement_group_id = fields.Many2one('procurement.group', 'Procurement Group', copy=False)
@@ -155,17 +150,19 @@ class SaleOrder(models.Model):
for order in self:
order.delivery_count = len(order.picking_ids)
@api.onchange('company_id')
def _onchange_company_id(self):
if self.company_id:
warehouse_id = self.env['ir.default'].get_model_defaults('sale.order').get('warehouse_id')
self.warehouse_id = warehouse_id or self.user_id.with_company(self.company_id.id)._get_default_warehouse_id().id
@api.onchange('user_id')
def onchange_user_id(self):
super().onchange_user_id()
if self.state in ['draft', 'sent']:
self.warehouse_id = self.user_id.with_company(self.company_id.id)._get_default_warehouse_id().id
@api.depends('user_id', 'company_id')
def _compute_warehouse_id(self):
default_warehouse_id = self.env['ir.default'].get_model_defaults('sale.order').get('warehouse_id')
for order in self:
if order.company_id and order.company_id != order._origin.company_id:
warehouse = default_warehouse_id
else:
warehouse = self.env['stock.warehouse']
if order.state in ['draft', 'sent']:
order.warehouse_id = warehouse or order.user_id.with_company(order.company_id.id)._get_default_warehouse_id()
# In case we create a record in another state (eg: demo data, or business code)
if not order.warehouse_id:
order.warehouse_id = self.env.user._get_default_warehouse_id()
@api.onchange('partner_shipping_id')
def _onchange_partner_shipping_id(self):
@@ -119,7 +119,6 @@ class ProjectCreateSalesOrder(models.TransientModel):
})
# 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()
# create the sale lines, the map (optional), and assign existing timesheet to sale lines
self._make_billable(sale_order)