diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index d79b536d333..5583e54dc5d 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -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 %s ", 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'): diff --git a/addons/sale_quotation_builder/models/sale_order.py b/addons/sale_quotation_builder/models/sale_order.py index 22c88388fc5..a4c391ccdd0 100644 --- a/addons/sale_quotation_builder/models/sale_order.py +++ b/addons/sale_quotation_builder/models/sale_order.py @@ -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) diff --git a/addons/sale_quotation_builder/models/sale_order_template.py b/addons/sale_quotation_builder/models/sale_order_template.py index c7fe6a08f6a..5c4b8d86111 100644 --- a/addons/sale_quotation_builder/models/sale_order_template.py +++ b/addons/sale_quotation_builder/models/sale_order_template.py @@ -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) diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index dc31e57b068..6d98f0cd958 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -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':