[IMP] sale: Write create methods in api_create_multi mode

This commit is contained in:
Yannick Tivisse
2021-12-02 12:12:01 +01:00
parent ec84b7e7bd
commit f503e69d3b
4 changed files with 37 additions and 33 deletions
+21 -19
View File
@@ -7,6 +7,7 @@ from itertools import groupby
import json
from odoo import api, fields, models, SUPERUSER_ID, _
from odoo.fields import Datetime
from odoo.exceptions import AccessError, UserError, ValidationError
from odoo.tools.misc import formatLang
from odoo.osv import expression
@@ -336,7 +337,7 @@ class SaleOrder(models.Model):
dt = line._expected_date()
dates_list.append(dt)
if dates_list:
order.expected_date = fields.Datetime.to_string(min(dates_list))
order.expected_date = Datetime.to_string(min(dates_list))
else:
order.expected_date = False
@@ -535,25 +536,26 @@ class SaleOrder(models.Model):
self.show_update_pricelist = False
self.message_post(body=_("Product prices have been recomputed according to pricelist <b>%s<b> ", self.pricelist_id.display_name))
@api.model
def create(self, vals):
if 'company_id' in vals:
self = self.with_company(vals['company_id'])
if vals.get('name', _('New')) == _('New'):
seq_date = None
if 'date_order' in vals:
seq_date = fields.Datetime.context_timestamp(self, fields.Datetime.to_datetime(vals['date_order']))
vals['name'] = self.env['ir.sequence'].next_by_code('sale.order', sequence_date=seq_date) or _('New')
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if 'company_id' in vals:
self = self.with_company(vals['company_id'])
if vals.get('name', _('New')) == _('New'):
seq_date = Datetime.context_timestamp(
self, Datetime.to_datetime(vals['date_order'])
) if 'date_order' in vals else None
vals['name'] = self.env['ir.sequence'].next_by_code(
'sale.order', sequence_date=seq_date) or _('New')
# Makes sure partner_invoice_id', 'partner_shipping_id' and 'pricelist_id' are defined
if any(f not in vals for f in ['partner_invoice_id', 'partner_shipping_id', 'pricelist_id']):
partner = self.env['res.partner'].browse(vals.get('partner_id'))
addr = partner.address_get(['delivery', 'invoice'])
vals['partner_invoice_id'] = vals.setdefault('partner_invoice_id', addr['invoice'])
vals['partner_shipping_id'] = vals.setdefault('partner_shipping_id', addr['delivery'])
vals['pricelist_id'] = vals.setdefault('pricelist_id', partner.property_product_pricelist.id)
result = super(SaleOrder, self).create(vals)
return result
# Makes sure partner_invoice_id', 'partner_shipping_id' and 'pricelist_id' are defined
if any(f not in vals for f in ['partner_invoice_id', 'partner_shipping_id', 'pricelist_id']):
partner = self.env['res.partner'].browse(vals.get('partner_id'))
addr = partner.address_get(['delivery', 'invoice'])
vals['partner_invoice_id'] = vals.setdefault('partner_invoice_id', addr['invoice'])
vals['partner_shipping_id'] = vals.setdefault('partner_shipping_id', addr['delivery'])
vals['pricelist_id'] = vals.setdefault('pricelist_id', partner.property_product_pricelist.id)
return super(SaleOrder, self).create(vals_list)
def _compute_field_value(self, field):
if field.name == 'invoice_status' and not self.env.context.get('mail_activity_automation_skip'):
@@ -42,10 +42,10 @@ class SaleOrderLine(models.Model):
website_description = fields.Html('Website Description', sanitize=False, translate=html_translate, sanitize_form=False)
@api.model
def create(self, values):
values = self._inject_quotation_description(values)
return super(SaleOrderLine, self).create(values)
@api.model_create_multi
def create(self, vals_list):
vals_list = [self._inject_quotation_description(vals) for vals in vals_list]
return super(SaleOrderLine, self).create(vals_list)
def write(self, values):
values = self._inject_quotation_description(values)
@@ -31,10 +31,10 @@ class SaleOrderTemplateLine(models.Model):
self.website_description = self.product_id.quotation_description
return ret
@api.model
def create(self, values):
values = self._inject_quotation_description(values)
return super(SaleOrderTemplateLine, self).create(values)
@api.model_create_multi
def create(self, vals_list):
vals_list = [self._inject_quotation_description(vals) for vals in vals_list]
return super(SaleOrderTemplateLine, self).create(vals_list)
def write(self, values):
values = self._inject_quotation_description(values)
+8 -6
View File
@@ -88,12 +88,14 @@ class SaleOrder(models.Model):
expected_date = min(dates_list) if order.picking_policy == 'direct' else max(dates_list)
order.expected_date = fields.Datetime.to_string(expected_date)
@api.model
def create(self, vals):
if 'warehouse_id' not in vals and 'company_id' in vals:
user = self.env['res.users'].browse(vals.get('user_id', False))
vals['warehouse_id'] = user.with_company(vals.get('company_id'))._get_default_warehouse_id().id
return super().create(vals)
@api.model_create_multi
def create(self, vals_list):
# YTI TODO: Achieve this with a compute method
for vals in vals_list:
if 'warehouse_id' not in vals and 'company_id' in vals:
user = self.env['res.users'].browse(vals.get('user_id', False))
vals['warehouse_id'] = user.with_company(vals.get('company_id'))._get_default_warehouse_id().id
return super().create(vals_list)
def write(self, values):
if values.get('order_line') and self.state == 'sale':