summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorVictor Feyens <vfe@odoo.com>2020-04-02 19:35:33 +0200
committerVictor Feyens <vfe@odoo.com>2020-04-27 12:00:45 +0200
commite3c329b9bcd7327d36279c45326cae1aed3a11c0 (patch)
tree764ad36f8690492e3ec958f77672e7d33cf78290 /addons
parentcf078da86e2f0e5dd6b02ccbe91b7be2062c7559 (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.py20
-rw-r--r--addons/base_vat/models/res_partner.py13
-rw-r--r--addons/digest/models/res_users.py13
-rw-r--r--addons/mail/models/res_users.py21
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)