From 5ff87e8039676db5a0c48422998d0cabd556a12d Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Thu, 26 Apr 2018 15:43:43 -0700 Subject: [PATCH] [FIX] website: make filter_duplicate work itertools' groupby function expects the iterable to be sorted as hinted to in the documentation: "Generally, the iterable needs to already be sorted on the same key function." When running groupby on an unsorted iterable non-adjacent duplicates will remain: >>> from itertools import groupby >>> [e[0] for e in groupby([1, 2, 1])] [1, 2, 1] Because of this filter_duplicate would occassionally return duplicates. To resolve this sort on the key field. Afterwards sort the result on the usual inherit order: (priority, id). --- addons/website/models/ir_ui_view.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index c3c9de8016d..9a793b84fe6 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -55,9 +55,9 @@ class View(models.Model): def filter_duplicate(self): """ Filter current recordset only keeping the most suitable view per distinct key """ filtered = self.env['ir.ui.view'] - for dummy, group in groupby(self, key=lambda record: record.key): + for dummy, group in groupby(self.sorted('key'), key=lambda record: record.key): filtered += sorted(group, key=lambda record: record._sort_suitability_key())[0] - return filtered + return filtered.sorted(key=lambda view: (view.priority, view.id)) @api.model def _view_obj(self, view_id):