From db79d20a1d24ddfc5a994e73fc1f7b1eb0eb1bd5 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Mon, 27 Apr 2020 14:43:05 +0200 Subject: [PATCH 1/3] [IMP] snailmail: res.partner write performance Do not loop through the partners, doing the same stuff n times, and potentially doing multiple searches when one is enough. X-original-commit: 35713d2ff46dcfc4a578c41dad6f786919754ca2 --- addons/snailmail/models/res_partner.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/addons/snailmail/models/res_partner.py b/addons/snailmail/models/res_partner.py index ae50e43c999..c7f40f7b3a8 100644 --- a/addons/snailmail/models/res_partner.py +++ b/addons/snailmail/models/res_partner.py @@ -10,16 +10,18 @@ class ResPartner(models.Model): _inherit = "res.partner" def write(self, vals): - for id in self.ids: - letter_address_vals = {} - address_fields = ['street', 'street2', 'city', 'zip', 'state_id', 'country_id'] - for field in address_fields: - if field in vals: - letter_address_vals[field] = vals[field] + letter_address_vals = {} + address_fields = ['street', 'street2', 'city', 'zip', 'state_id', 'country_id'] + for field in address_fields: + if field in vals: + letter_address_vals[field] = vals[field] - if len(letter_address_vals): - letter_ids = self.env['snailmail.letter'].search([('state', 'not in', ['sent', 'canceled']), ('partner_id', '=', id)]) - letter_ids.write(letter_address_vals) + if letter_address_vals: + letters = self.env['snailmail.letter'].search([ + ('state', 'not in', ['sent', 'canceled']), + ('partner_id', 'in', self.ids), + ]) + letters.write(letter_address_vals) return super(ResPartner, self).write(vals) From e8f3146ff3be412097971f70ea0901ec9451d459 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Tue, 28 Apr 2020 17:15:17 +0200 Subject: [PATCH 2/3] [IMP] note: create users in batch When note is installed, res.users are created one by one because its create override isn't adapted to work in batched. This commit ensures the create override is adapted to ensure users are still created in batch when note is installed. X-original-commit: 1cf7e1ac5dbf174e756a01f9b75abd09b168e52a --- addons/note/models/res_users.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/note/models/res_users.py b/addons/note/models/res_users.py index 0623a3d7a8a..a2780f865f9 100644 --- a/addons/note/models/res_users.py +++ b/addons/note/models/res_users.py @@ -12,13 +12,13 @@ class Users(models.Model): _name = 'res.users' _inherit = ['res.users'] - @api.model - def create(self, values): - user = super(Users, self).create(values) + @api.model_create_multi + def create(self, vals_list): + users = super().create(vals_list) + user_group_id = self.env['ir.model.data'].xmlid_to_res_id('base.group_user') # for new employee, create his own 5 base note stages - if user.has_group('base.group_user'): - user._create_note_stages() - return user + users.filtered_domain([('groups_id', 'in', [user_group_id])])._create_note_stages() + return users @api.model def _init_data_user_note_stages(self): From bc232dcc311125b521d059b92a25aa4814dc8b8b Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Thu, 30 Apr 2020 10:45:54 +0200 Subject: [PATCH 3/3] [IMP] base: reduce ref calls in users write override. ref() always trigger a database query to verify record still exists. In frequently used methods, it's best to avoid ref calls if not needed: * either the records should always exist * either the record isn't always needed and the ref can be sometimes avoided. X-original-commit: c1e05da7b71c8274aff00d67f8d1bc7e209fcaab --- odoo/addons/base/models/res_users.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index f16cb7eee8d..4d012ad0ee4 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -1271,8 +1271,10 @@ class UsersView(models.Model): def write(self, values): values = self._remove_reified_groups(values) res = super(UsersView, self).write(values) + if 'company_ids' not in values: + return res group_multi_company = self.env.ref('base.group_multi_company', False) - if group_multi_company and 'company_ids' in values: + if group_multi_company: for user in self: if len(user.company_ids) <= 1 and user.id in group_multi_company.users.ids: user.write({'groups_id': [(3, group_multi_company.id)]})