From 9d4b78933835059b711fc7acb796d553cffea438 Mon Sep 17 00:00:00 2001 From: Guido Longoni Date: Thu, 6 Jul 2023 02:04:39 +0200 Subject: [PATCH] reset_on_reset da testare --- django/contatti_app/drilldown_autocomplete.py | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/django/contatti_app/drilldown_autocomplete.py b/django/contatti_app/drilldown_autocomplete.py index 82e94e1..fbb0b4d 100644 --- a/django/contatti_app/drilldown_autocomplete.py +++ b/django/contatti_app/drilldown_autocomplete.py @@ -56,10 +56,10 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): try: drilldown_field = self.admin_site._registry[ source_model].get_drilldown_autocomplete_fields(request)[source_field.name] - filtered_by = set(drilldown_field['filtered_by']) + filtered_by = set(drilldown_field['filtered_by']) except KeyError as e: raise PermissionDenied from e - if(set(filtered_by_dict.keys()) > filtered_by): + if (set(filtered_by_dict.keys()) > filtered_by): raise PermissionDenied rel_paths = drilldown_field['relationship_path'] target_model = source_field.remote_field.model @@ -72,7 +72,7 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): 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()} + rel_paths[k]: v for k, v in filtered_by_dict.items()} return term, model_admin, source_field, to_field_name @@ -138,6 +138,19 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin): if "widget" not in kwargs: daf = self.get_drilldown_autocomplete_fields(request) if db_field.name in daf: + def get_fields_to_reset_recursive(daf, fields_to_reset, seen=None): + to_reset = set() + if seen is None: + seen = set() + for f in fields_to_reset: + if f in daf: + to_reset.add(f) + if f not in seen and 'reset_on_reset' in daf[f]: + seen.add(f) + to_reset.update(get_fields_to_reset_recursive( + daf, daf[f]['reset_on_reset'], seen)) + return to_reset + attrs = {'data-drilldown_enabled': 1} if 'filtered_by' in daf[db_field.name]: attrs["data-filtered_by"] = json.dumps( @@ -146,11 +159,20 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin): attrs['data-included_only'] = 1 else: if 'reset_on_excluded' in daf[db_field.name]: + reset_on_excluded = set( + daf[db_field.name]['reset_on_excluded']) + reset_on_excluded = get_fields_to_reset_recursive( + daf, reset_on_excluded) attrs['data-reset_on_excluded'] = json.dumps( - list(daf[db_field.name]['reset_on_excluded'])) + list(reset_on_excluded)) + if 'reset_on_included' in daf[db_field.name]: + reset_on_included = set( + daf[db_field.name]['reset_on_included']) + reset_on_included = get_fields_to_reset_recursive( + daf, reset_on_included) attrs['data-reset_on_included'] = json.dumps( - list(daf[db_field.name]['reset_on_included'])) + list(reset_on_included)) kwargs["widget"] = DrillDownAutocompleteSelect( db_field, self.admin_site, attrs=attrs, using=db )