From d875bcd79d4d6dac0bfdf6b3072d167ba921102f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 6 Sep 2021 13:18:15 +0000 Subject: [PATCH] [IMP] gamification, google_drive, project: limit usage of search on ir.model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Purpose of this commit is to globally improve code performance by limiting search impact by using cache when accessing ir.model. Note that tests are left untouched as they are generally done using admin (or at least data preparation is done as admin). Diff is kept small currently. Task-2638444 PR odoo/odoo#76005 Co-Authored-By: Thibault Delavallée Co-Authored-By: Victor Feyens --- addons/calendar/models/calendar_event.py | 6 ++---- addons/gamification/models/challenge.py | 20 +++++++++---------- addons/google_drive/models/google_drive.py | 2 +- addons/project/wizard/project_share_wizard.py | 3 ++- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py index 182c6bfa163..167de1abfd9 100644 --- a/addons/calendar/models/calendar_event.py +++ b/addons/calendar/models/calendar_event.py @@ -56,9 +56,7 @@ class Meeting(models.Model): # super default_model='crm.lead' for easier use in addons if self.env.context.get('default_res_model') and not self.env.context.get('default_res_model_id'): self = self.with_context( - default_res_model_id=self.env['ir.model'].sudo().search([ - ('model', '=', self.env.context['default_res_model']) - ], limit=1).id + default_res_model_id=self.env['ir.model']._get_id(self.env.context['default_res_model']) ) defaults = super(Meeting, self).default_get(fields) @@ -66,7 +64,7 @@ class Meeting(models.Model): # support active_model / active_id as replacement of default_* if not already given if 'res_model_id' not in defaults and 'res_model_id' in fields and \ self.env.context.get('active_model') and self.env.context['active_model'] != 'calendar.event': - defaults['res_model_id'] = self.env['ir.model'].sudo().search([('model', '=', self.env.context['active_model'])], limit=1).id + defaults['res_model_id'] = self.env['ir.model']._get_id(self.env.context['active_model']) defaults['res_model'] = self.env.context.get('active_model') if 'res_id' not in defaults and 'res_id' in fields and \ defaults.get('res_model_id') and self.env.context.get('active_id'): diff --git a/addons/gamification/models/challenge.py b/addons/gamification/models/challenge.py index a62c4d2dc47..36cad9077f4 100644 --- a/addons/gamification/models/challenge.py +++ b/addons/gamification/models/challenge.py @@ -262,18 +262,18 @@ class Challenge(models.Model): for challenge in self: if challenge.last_report_date != fields.Date.today(): - # goals closed but still opened at the last report date - closed_goals_to_report = Goals.search([ - ('challenge_id', '=', challenge.id), - ('start_date', '>=', challenge.last_report_date), - ('end_date', '<=', challenge.last_report_date) - ]) - if challenge.next_report_date and fields.Date.today() >= challenge.next_report_date: challenge.report_progress() - elif closed_goals_to_report: - # some goals need a final report - challenge.report_progress(subset_goals=closed_goals_to_report) + else: + # goals closed but still opened at the last report date + closed_goals_to_report = Goals.search([ + ('challenge_id', '=', challenge.id), + ('start_date', '>=', challenge.last_report_date), + ('end_date', '<=', challenge.last_report_date) + ]) + if closed_goals_to_report: + # some goals need a final report + challenge.report_progress(subset_goals=closed_goals_to_report) self._check_challenge_reward() return True diff --git a/addons/google_drive/models/google_drive.py b/addons/google_drive/models/google_drive.py index 699b2935cf6..420ac3b8c68 100644 --- a/addons/google_drive/models/google_drive.py +++ b/addons/google_drive/models/google_drive.py @@ -154,7 +154,7 @@ class GoogleDrive(models.Model): ''' # TO DO in master: fix my signature and my model if isinstance(res_model, str): - res_model = self.env['ir.model'].sudo().search([('model', '=', res_model)]).id + res_model = self.env['ir.model']._get_id(res_model) if not res_id: raise UserError(_("Creating google drive may only be done by one at a time.")) # check if a model is configured with a template diff --git a/addons/project/wizard/project_share_wizard.py b/addons/project/wizard/project_share_wizard.py index 113f0252023..8aae1700394 100644 --- a/addons/project/wizard/project_share_wizard.py +++ b/addons/project/wizard/project_share_wizard.py @@ -21,7 +21,8 @@ class ProjectShareWizard(models.TransientModel): @api.model def _selection_target_model(self): - return [(model.model, model.name) for model in self.env['ir.model'].sudo().search([('model', '=', 'project.project')])] + project_model = self.env['ir.model']._get('project.project') + return [(project_model.model, project_model.name)] access_mode = fields.Selection([('read', 'Readonly'), ('edit', 'Edit')]) display_access_mode = fields.Boolean()