From bb6a45e560f1571376b27242c1dc8f8d33afabc0 Mon Sep 17 00:00:00 2001 From: Guido Longoni Date: Thu, 6 Jul 2023 02:20:43 +0200 Subject: [PATCH] tolta una informazione pleonastica --- django/contatti_app/drilldown_autocomplete.py | 91 ++++++++----------- django/static/admin/js/autocomplete.js | 1 - 2 files changed, 39 insertions(+), 53 deletions(-) diff --git a/django/contatti_app/drilldown_autocomplete.py b/django/contatti_app/drilldown_autocomplete.py index fbb0b4d..409c51b 100644 --- a/django/contatti_app/drilldown_autocomplete.py +++ b/django/contatti_app/drilldown_autocomplete.py @@ -32,69 +32,56 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): to_field_name ) = super().process_request(request) - if 'drilldown' in request.GET: + if 'filtered_by_dict' in request.GET: try: - drilldown_enabled = int(request.GET.get('drilldown')) - except ValueError: + filtered_by_dict = json.loads( + request.GET.get("filtered_by_dict")) + except json.decoder.JSONDecodeError as e: raise PermissionDenied from e + app_label = request.GET["app_label"] + model_name = request.GET["model_name"] + source_model = apps.get_model(app_label, model_name) try: - drilldown_enabled = {1: True, 0: False}[drilldown_enabled] - except KeyError: + drilldown_field = self.admin_site._registry[ + source_model].get_drilldown_autocomplete_fields(request)[source_field.name] + filtered_by = set(drilldown_field['filtered_by']) + except KeyError as e: raise PermissionDenied from e - - self.drilldown_enabled = drilldown_enabled - if drilldown_enabled: - if 'filtered_by_dict' in request.GET: - try: - filtered_by_dict = json.loads( - request.GET.get("filtered_by_dict")) - except json.decoder.JSONDecodeError as e: - raise PermissionDenied from e - app_label = request.GET["app_label"] - model_name = request.GET["model_name"] - source_model = apps.get_model(app_label, model_name) - try: - drilldown_field = self.admin_site._registry[ - source_model].get_drilldown_autocomplete_fields(request)[source_field.name] - filtered_by = set(drilldown_field['filtered_by']) - except KeyError as e: - raise PermissionDenied from e - if (set(filtered_by_dict.keys()) > filtered_by): - raise PermissionDenied - rel_paths = drilldown_field['relationship_path'] - target_model = source_field.remote_field.model - try: - for v in rel_paths.values(): - target_model._meta.get_field(v) - except FieldDoesNotExist as e: - raise PermissionDenied from e - self.target_model = target_model - self.filtered_by_dict = filtered_by_dict - self.drilldown_field = drilldown_field - self.drilldown_filter_data = { - rel_paths[k]: v for k, v in filtered_by_dict.items()} + if (set(filtered_by_dict.keys()) > filtered_by): + raise PermissionDenied + rel_paths = drilldown_field['relationship_path'] + target_model = source_field.remote_field.model + try: + for v in rel_paths.values(): + target_model._meta.get_field(v) + except FieldDoesNotExist as e: + raise PermissionDenied from e + self.target_model = target_model + self.filtered_by_dict = filtered_by_dict + self.drilldown_field = drilldown_field + self.drilldown_filter_data = { + rel_paths[k]: v for k, v in filtered_by_dict.items()} return term, model_admin, source_field, to_field_name def get_queryset(self): """Return queryset based on ModelAdmin.get_search_results().""" qs = super().get_queryset() - if getattr(self, 'drilldown_enabled', False): - if hasattr(self, 'filtered_by_dict'): - dd_field = self.drilldown_field - drilldown_filter_conditions = Q(**self.drilldown_filter_data) - if dd_field.get('autoselect_on_singleton', False): - self.autoselect = False - if dd_field.get('included_only', False): - qs = qs.filter(drilldown_filter_conditions).annotate( - ddok=Value(1)) - else: - qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value( - 1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by) - if not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1: - self.autoselect = True + if hasattr(self, 'filtered_by_dict'): + dd_field = self.drilldown_field + drilldown_filter_conditions = Q(**self.drilldown_filter_data) + if dd_field.get('autoselect_on_singleton', False): + self.autoselect = False + if dd_field.get('included_only', False): + qs = qs.filter(drilldown_filter_conditions).annotate( + ddok=Value(1)) else: - qs = qs.annotate(ddok=Value(1)) + qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value( + 1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by) + if not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1: + self.autoselect = True + else: + qs = qs.annotate(ddok=Value(1)) return qs def serialize_result(self, obj, to_field_name): diff --git a/django/static/admin/js/autocomplete.js b/django/static/admin/js/autocomplete.js index 4e4b18d..5e6816b 100644 --- a/django/static/admin/js/autocomplete.js +++ b/django/static/admin/js/autocomplete.js @@ -17,7 +17,6 @@ }; if (element.dataset.hasOwnProperty('drilldown_enabled')) { - out.drilldown = 1; if (element.dataset.hasOwnProperty('filtered_by')) { const filtered_by_fields = JSON.parse(element.dataset.filtered_by)