From caeda18becedf6bee6a876c034fb04467ef95895 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Tue, 3 Nov 2020 14:29:49 +0000 Subject: [PATCH] [IMP] base, various: support batch creation Done for res.partner.bank, res.company and board models. Some override may have been ignored because heavily linked to business code (like company in stock). See merge commit for more details. Task ID-2330149 COM PR odoo/odoo#61246 ENT PR odoo/enterprise#14561 --- addons/base_iban/models/res_partner_bank.py | 19 +++++----- addons/board/models/board.py | 4 +- addons/l10n_fr/models/res_company.py | 17 +++++---- addons/l10n_fr_pos_cert/models/res_company.py | 17 +++++---- addons/product/models/res_company.py | 38 ++++++++++--------- addons/web/models/models.py | 10 ++--- 6 files changed, 56 insertions(+), 49 deletions(-) diff --git a/addons/base_iban/models/res_partner_bank.py b/addons/base_iban/models/res_partner_bank.py index 2c9f4f868b9..dfe1031acd5 100644 --- a/addons/base_iban/models/res_partner_bank.py +++ b/addons/base_iban/models/res_partner_bank.py @@ -67,15 +67,16 @@ class ResPartnerBank(models.Model): raise UserError(_("Cannot compute the BBAN because the account number is not an IBAN.")) return get_bban_from_iban(self.acc_number) - @api.model - def create(self, vals): - if vals.get('acc_number'): - try: - validate_iban(vals['acc_number']) - vals['acc_number'] = pretty_iban(normalize_iban(vals['acc_number'])) - except ValidationError: - pass - return super(ResPartnerBank, self).create(vals) + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get('acc_number'): + try: + validate_iban(vals['acc_number']) + vals['acc_number'] = pretty_iban(normalize_iban(vals['acc_number'])) + except ValidationError: + pass + return super(ResPartnerBank, self).create(vals_list) def write(self, vals): if vals.get('acc_number'): diff --git a/addons/board/models/board.py b/addons/board/models/board.py index a3355755b2f..738f9850e08 100644 --- a/addons/board/models/board.py +++ b/addons/board/models/board.py @@ -9,8 +9,8 @@ class Board(models.AbstractModel): _description = "Board" _auto = False - @api.model - def create(self, vals): + @api.model_create_multi + def create(self, vals_list): return self @api.model diff --git a/addons/l10n_fr/models/res_company.py b/addons/l10n_fr/models/res_company.py index 4088a1afac4..6235d207b9a 100644 --- a/addons/l10n_fr/models/res_company.py +++ b/addons/l10n_fr/models/res_company.py @@ -23,14 +23,15 @@ class ResCompany(models.Model): return False return self.country_id and self.country_id.code in self._get_unalterable_country() - @api.model - def create(self, vals): - company = super(ResCompany, self).create(vals) - #when creating a new french company, create the securisation sequence as well - if company._is_accounting_unalterable(): - sequence_fields = ['l10n_fr_closing_sequence_id'] - company._create_secure_sequence(sequence_fields) - return company + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) + for company in companies: + #when creating a new french company, create the securisation sequence as well + if company._is_accounting_unalterable(): + sequence_fields = ['l10n_fr_closing_sequence_id'] + company._create_secure_sequence(sequence_fields) + return companies def write(self, vals): res = super(ResCompany, self).write(vals) diff --git a/addons/l10n_fr_pos_cert/models/res_company.py b/addons/l10n_fr_pos_cert/models/res_company.py index c701c6f348e..e509dd52005 100644 --- a/addons/l10n_fr_pos_cert/models/res_company.py +++ b/addons/l10n_fr_pos_cert/models/res_company.py @@ -26,14 +26,15 @@ class ResCompany(models.Model): l10n_fr_pos_cert_sequence_id = fields.Many2one('ir.sequence') - @api.model - def create(self, vals): - company = super(ResCompany, self).create(vals) - #when creating a new french company, create the securisation sequence as well - if company._is_accounting_unalterable(): - sequence_fields = ['l10n_fr_pos_cert_sequence_id'] - company._create_secure_sequence(sequence_fields) - return company + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) + for company in companies: + #when creating a new french company, create the securisation sequence as well + if company._is_accounting_unalterable(): + sequence_fields = ['l10n_fr_pos_cert_sequence_id'] + company._create_secure_sequence(sequence_fields) + return companies def write(self, vals): res = super(ResCompany, self).write(vals) diff --git a/addons/product/models/res_company.py b/addons/product/models/res_company.py index 30ae4e95931..e9420ed5133 100644 --- a/addons/product/models/res_company.py +++ b/addons/product/models/res_company.py @@ -7,24 +7,28 @@ from odoo import api, models, _ class ResCompany(models.Model): _inherit = "res.company" - @api.model - def create(self, vals): - new_company = super(ResCompany, self).create(vals) + @api.model_create_multi + def create(self, vals_list): + companies = super(ResCompany, self).create(vals_list) ProductPricelist = self.env['product.pricelist'] - pricelist = ProductPricelist.search([('currency_id', '=', new_company.currency_id.id), ('company_id', '=', False)], limit=1) - if not pricelist: - params = {'currency': new_company.currency_id.name} - pricelist = ProductPricelist.create({ - 'name': _("Default %(currency)s pricelist") % params, - 'currency_id': new_company.currency_id.id, - }) - self.env['ir.property']._set_default( - 'property_product_pricelist', - 'res.partner', - pricelist, - new_company, - ) - return new_company + for new_company in companies: + pricelist = ProductPricelist.search([ + ('currency_id', '=', new_company.currency_id.id), + ('company_id', '=', False) + ], limit=1) + if not pricelist: + params = {'currency': new_company.currency_id.name} + pricelist = ProductPricelist.create({ + 'name': _("Default %(currency)s pricelist") % params, + 'currency_id': new_company.currency_id.id, + }) + self.env['ir.property']._set_default( + 'property_product_pricelist', + 'res.partner', + pricelist, + new_company, + ) + return companies def write(self, values): # When we modify the currency of the company, we reflect the change on the list0 pricelist, if diff --git a/addons/web/models/models.py b/addons/web/models/models.py index 092dd9a1681..ba431b8addc 100644 --- a/addons/web/models/models.py +++ b/addons/web/models/models.py @@ -755,13 +755,13 @@ class Base(models.AbstractModel): class ResCompany(models.Model): _inherit = 'res.company' - @api.model - def create(self, values): - res = super().create(values) + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) style_fields = {'external_report_layout_id', 'font', 'primary_color', 'secondary_color'} - if not style_fields.isdisjoint(values): + if any(not style_fields.isdisjoint(values) for values in vals_list): self._update_asset_style() - return res + return companies def write(self, values): res = super().write(values)