diff options
| author | Victor Feyens <vfe@odoo.com> | 2020-04-02 19:35:33 +0200 |
|---|---|---|
| committer | Victor Feyens <vfe@odoo.com> | 2020-04-27 12:00:45 +0200 |
| commit | e3c329b9bcd7327d36279c45326cae1aed3a11c0 (patch) | |
| tree | 764ad36f8690492e3ec958f77672e7d33cf78290 /addons | |
| parent | cf078da86e2f0e5dd6b02ccbe91b7be2062c7559 (diff) | |
[IMP] *: create users and partners in batch
The main classes of partners and users support batch creation, but
the majority of their overrides doesn't support creation in batch.
Adapting those overrides to support records creation in batch shows
great performance gains:
* On `res_partner` : 2 to 3 times faster
* On `res_users`, with the inherited `res_partner` created in batch:
up to 10 times faster.
Tests done with 500 to 4k records:
* `res_partner` with only a name provided
* `res_users` with a name and login
X-original-commit: 9c3c5f161580039c1fe50f68acac808c18817997
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/auth_signup/models/res_users.py | 20 | ||||
| -rw-r--r-- | addons/base_vat/models/res_partner.py | 13 | ||||
| -rw-r--r-- | addons/digest/models/res_users.py | 13 | ||||
| -rw-r--r-- | addons/mail/models/res_users.py | 21 |
4 files changed, 36 insertions, 31 deletions
diff --git a/addons/auth_signup/models/res_users.py b/addons/auth_signup/models/res_users.py index dc1a471421a..c600d969e9d 100644 --- a/addons/auth_signup/models/res_users.py +++ b/addons/auth_signup/models/res_users.py @@ -233,16 +233,18 @@ class ResUsers(models.Model): inactive_users.with_context(create_user=True).action_reset_password() return res - @api.model - def create(self, values): + @api.model_create_multi + def create(self, vals_list): # overridden to automatically invite user to sign up - user = super(ResUsers, self).create(values) - if user.email and not self.env.context.get('no_reset_password'): - try: - user.with_context(create_user=True).action_reset_password() - except MailDeliveryException: - user.partner_id.with_context(create_user=True).signup_cancel() - return user + users = super(ResUsers, self).create(vals_list) + if not self.env.context.get('no_reset_password'): + users_with_email = users.filtered('email') + if users_with_email: + try: + users_with_email.with_context(create_user=True).action_reset_password() + except MailDeliveryException: + users_with_email.partner_id.with_context(create_user=True).signup_cancel() + return users @api.returns('self', lambda value: value.id) def copy(self, default=None): diff --git a/addons/base_vat/models/res_partner.py b/addons/base_vat/models/res_partner.py index 24f581f9a31..c3376cd0ba5 100644 --- a/addons/base_vat/models/res_partner.py +++ b/addons/base_vat/models/res_partner.py @@ -481,12 +481,13 @@ class ResPartner(models.Model): vat_number = format_func(vat_number) return vat_country.upper() + vat_number - @api.model - def create(self, values): - if values.get('vat'): - country_id = values.get('country_id') - values['vat'] = self._fix_vat_number(values['vat'], country_id) - return super(ResPartner, self).create(values) + @api.model_create_multi + def create(self, vals_list): + for values in vals_list: + if values.get('vat'): + country_id = values.get('country_id') + values['vat'] = self._fix_vat_number(values['vat'], country_id) + return super(ResPartner, self).create(vals_list) def write(self, values): if values.get('vat') and len(self.mapped('country_id')) == 1: diff --git a/addons/digest/models/res_users.py b/addons/digest/models/res_users.py index 767ec444391..0f006b08dc7 100644 --- a/addons/digest/models/res_users.py +++ b/addons/digest/models/res_users.py @@ -6,13 +6,14 @@ from odoo import api, models class ResUsers(models.Model): _inherit = "res.users" - @api.model - def create(self, vals): + @api.model_create_multi + def create(self, vals_list): """ Automatically subscribe employee users to default digest if activated """ - user = super(ResUsers, self).create(vals) + users = super(ResUsers, self).create(vals_list) default_digest_emails = self.env['ir.config_parameter'].sudo().get_param('digest.default_digest_emails') default_digest_id = self.env['ir.config_parameter'].sudo().get_param('digest.default_digest_id') - if user.has_group('base.group_user') and default_digest_emails and default_digest_id: + if default_digest_emails and default_digest_id: digest = self.env['digest.digest'].sudo().browse(int(default_digest_id)) - digest.user_ids |= user - return user + user_group_id = self.env['ir.model.data'].xmlid_to_res_id('base.group_user') + digest.user_ids |= users.filtered_domain([('groups_id', 'in', [user_group_id])]) + return users diff --git a/addons/mail/models/res_users.py b/addons/mail/models/res_users.py index 64e0d1cd746..ce00a1d2b72 100644 --- a/addons/mail/models/res_users.py +++ b/addons/mail/models/res_users.py @@ -71,17 +71,18 @@ GROUP BY channel_moderator.res_users_id""", [tuple(self.ids)]) type(self).SELF_READABLE_FIELDS.extend(['notification_type']) return init_res - @api.model - def create(self, values): - if not values.get('login', False): - action = self.env.ref('base.action_res_users') - msg = _("You cannot create a new user from here.\n To create new user please go to configuration panel.") - raise exceptions.RedirectWarning(msg, action.id, _('Go to the configuration panel')) - - user = super(Users, self).create(values) + @api.model_create_multi + def create(self, vals_list): + for values in vals_list: + if not values.get('login', False): + action = self.env.ref('base.action_res_users') + msg = _("You cannot create a new user from here.\n To create new user please go to configuration panel.") + raise exceptions.RedirectWarning(msg, action.id, _('Go to the configuration panel')) + + users = super(Users, self).create(vals_list) # Auto-subscribe to channels - self.env['mail.channel'].search([('group_ids', 'in', user.groups_id.ids)])._subscribe_users() - return user + self.env['mail.channel'].search([('group_ids', 'in', users.groups_id.ids)])._subscribe_users() + return users def write(self, vals): write_res = super(Users, self).write(vals) |
