From 4ed25ad0856ddb03aceddffe051745cbf0014da9 Mon Sep 17 00:00:00 2001 From: Thomas Druez Date: Mon, 26 Sep 2022 20:39:02 +0400 Subject: [PATCH] Fix the GroupingQuerySetMixin.less_common logic #526 Signed-off-by: Thomas Druez --- scanpipe/filters.py | 2 +- scanpipe/models.py | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/scanpipe/filters.py b/scanpipe/filters.py index 4594a68c3..27ba9c6fa 100644 --- a/scanpipe/filters.py +++ b/scanpipe/filters.py @@ -108,7 +108,7 @@ def filter_queryset(self, queryset): if value == self.empty_value: queryset = queryset.filter(**{f"{field_name}__in": EMPTY_VALUES}) elif value == self.other_value: - return queryset.less_common(field_name) + return queryset.less_common(name) else: queryset = self.filters[name].filter(queryset, value) diff --git a/scanpipe/models.py b/scanpipe/models.py index 83628961f..e8ba34126 100644 --- a/scanpipe/models.py +++ b/scanpipe/models.py @@ -938,24 +938,22 @@ def less_common(self, field_name, limit=most_common_limit): Return a QuerySet filtered by the less common values for the provided `field_name` starting at the `limit`. """ - field = self.model._meta.get_field(field_name) - - if not isinstance(field, models.JSONField): - less_common_values = self.less_common_values(field_name, limit) - return self.filter(**{f"{field_name}__in": less_common_values}) - - field_name, data_field = { + json_fields_mapping = { "license_key": ("licenses", "key"), "license_category": ("licenses", "category"), "copyrights": ("copyrights", "copyright"), "holders": ("holders", "holder"), - }.get(field_name) + } - values_list = self.values_from_json_field(field_name, data_field) - sorted_by_occurrence = list(dict(Counter(values_list).most_common()).keys()) - less_common_values = sorted_by_occurrence[limit:] + if field_name in json_fields_mapping: + field_name, data_field = json_fields_mapping.get(field_name) + values_list = self.values_from_json_field(field_name, data_field) + sorted_by_occurrence = list(dict(Counter(values_list).most_common()).keys()) + less_common_values = sorted_by_occurrence[limit:] + return self.json_list_contains(field_name, data_field, less_common_values) - return self.json_list_contains(field_name, data_field, less_common_values) + less_common_values = self.less_common_values(field_name, limit) + return self.filter(**{f"{field_name}__in": less_common_values}) class JSONFieldQuerySetMixin: