From b1b66b82a6b9775e8b5f83be85012d7958c84ccf Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Fri, 20 May 2022 11:34:13 +0000 Subject: [PATCH] [FIX] crm, project: fixing some non-total order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Non total order can lead to randomized order in some case, making some test behaviour random and/or difficult to debug. Adding some fallback 'id' order shouldn't hurt closes odoo/odoo#99324 X-original-commit: 6e40e5fe775273a2d3a968ac113cbeb578318dd1 Signed-off-by: Xavier Dollé (xdo) --- addons/crm/models/crm_lead.py | 18 +++++++++--------- addons/project/models/project.py | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 9e42790a824..2586bceff1e 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -925,7 +925,7 @@ class Lead(models.Model): stage_ids = stages._search(search_domain, order=order, access_rights_uid=SUPERUSER_ID) return stages.browse(stage_ids) - def _stage_find(self, team_id=False, domain=None, order='sequence', limit=1): + def _stage_find(self, team_id=False, domain=None, order='sequence, id', limit=1): """ Determine the stage of the current lead with its teams, the given domain and the given team_id :param team_id :param domain : base search domain for stage @@ -1383,7 +1383,7 @@ class Lead(models.Model): # check if the stage is in the stages of the Sales Team. If not, assign the stage with the lowest sequence if merged_data.get('team_id'): - team_stage_ids = self.env['crm.stage'].search(['|', ('team_id', '=', merged_data['team_id']), ('team_id', '=', False)], order='sequence') + team_stage_ids = self.env['crm.stage'].search(['|', ('team_id', '=', merged_data['team_id']), ('team_id', '=', False)], order='sequence, id') if merged_data.get('stage_id') not in team_stage_ids.ids: merged_data['stage_id'] = team_stage_ids[0].id if team_stage_ids else False @@ -1996,9 +1996,9 @@ class Lead(models.Model): if field == 'stage_id' and value in won_stage_ids: won_leads.add(lead_id) leads_fields.add(field) - + leads_fields = sorted(leads_fields) # get all variable related records from frequency table, no matter the team_id - frequencies = self.env['crm.lead.scoring.frequency'].search([('variable', 'in', list(leads_fields))], order="team_id asc") + frequencies = self.env['crm.lead.scoring.frequency'].search([('variable', 'in', list(leads_fields))], order="team_id asc, id") # get all team_ids from frequencies frequency_teams = frequencies.mapped('team_id') @@ -2283,7 +2283,7 @@ class Lead(models.Model): else: lead_frequency_values[field] = value leads_frequency_values_by_team[team_id].append(lead_frequency_values) - leads_pls_fields = list(leads_pls_fields) + leads_pls_fields = sorted(leads_pls_fields) # get new frequencies new_frequencies_by_team = {} @@ -2392,7 +2392,7 @@ class Lead(models.Model): :return: won count, lost count and total count for all records in frequencies """ # TODO : check if we need to handle specific team_id stages [for lost count] (if first stage in sequence is team_specific) - first_stage_id = self.env['crm.stage'].search([('team_id', '=', False)], order='sequence', limit=1) + first_stage_id = self.env['crm.stage'].search([('team_id', '=', False)], order='sequence, id', limit=1) if str(first_stage_id.id) not in team_results.get('stage_id', []): return 0, 0, 0 stage_result = team_results['stage_id'][str(first_stage_id.id)] @@ -2406,7 +2406,7 @@ class Lead(models.Model): pls_fields = leads_pls_fields.copy() frequencies = dict((field, {}) for field in pls_fields) - stage_ids = self.env['crm.stage'].search_read([], ['sequence', 'name', 'id'], order='sequence') + stage_ids = self.env['crm.stage'].search_read([], ['sequence', 'name', 'id'], order='sequence, id') stage_sequences = {stage['id']: stage['sequence'] for stage in stage_ids} # Increment won / lost frequencies by criteria (field / value couple) @@ -2487,7 +2487,7 @@ class Lead(models.Model): self.flush_model() query = """SELECT id, probability, %s FROM %s - WHERE %s order by team_id asc""" + WHERE %s order by team_id asc, id desc""" query = sql.SQL(query % (str_fields, from_clause, where_clause)).format(*args) self._cr.execute(query, where_params) lead_results = self._cr.dictfetchall() @@ -2498,7 +2498,7 @@ class Lead(models.Model): FROM %s LEFT JOIN crm_tag_rel rel ON crm_lead.id = rel.lead_id LEFT JOIN crm_tag t ON rel.tag_id = t.id - WHERE %s order by crm_lead.team_id asc""" + WHERE %s order by crm_lead.team_id asc, crm_lead.id""" args.append(sql.Identifier('tag_id')) query = sql.SQL(query % (from_clause, where_clause)).format(*args) self._cr.execute(query, where_params) diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 0d70862e31d..3b78c60fb55 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -1750,7 +1750,7 @@ class Task(models.Model): # Case management # ---------------------------------------- - def stage_find(self, section_id, domain=[], order='sequence'): + def stage_find(self, section_id, domain=[], order='sequence, id'): """ Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or