diff --git a/django/contatti_app/admin.py b/django/contatti_app/admin.py index 30aef73..cb2e784 100644 --- a/django/contatti_app/admin.py +++ b/django/contatti_app/admin.py @@ -142,23 +142,25 @@ class EmailAdmin(HiddenModel, PolymorphicParentModelAdmin, PolymorphicChildModel ddaf={ 'cap': { - 'filtered_by': { + 'relationship_path': { 'comune': 'comuni', }, - 'reset_on_included': {}, + 'filtered_by': [ 'comune' ], + 'reset_on_included': [], 'reset_on_excluded': ['comune'], - 'reset_on_reset': {}, + 'reset_on_reset': [], 'autoupdate_on_reset': False, 'autoselect_on_singleton': True, 'included_only': False, }, 'comune': { - 'filtered_by': { + 'relationship_path': { 'cap': 'cap', }, - 'reset_on_included': {}, + 'filtered_by': [ 'cap' ], + 'reset_on_included': [], 'reset_on_excluded': ['cap'], - 'reset_on_reset': {}, + 'reset_on_reset': [], 'autoupdate_on_reset': False, 'autoselect_on_singleton': True, 'included_only': False, diff --git a/django/contatti_app/drilldown_autocomplete.py b/django/contatti_app/drilldown_autocomplete.py index fdf4087..ba3d132 100644 --- a/django/contatti_app/drilldown_autocomplete.py +++ b/django/contatti_app/drilldown_autocomplete.py @@ -44,10 +44,10 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): self.drilldown_enabled = drilldown_enabled if drilldown_enabled: - if 'filtered_by_fields' in request.GET: + if 'filtered_by_dict' in request.GET: try: - filtered_by_fields = json.loads( - request.GET.get("filtered_by_fields")) + 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"] @@ -56,19 +56,23 @@ 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']) except KeyError as e: raise PermissionDenied from e - remote_model = source_field.remote_field.model + 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 drilldown_field['filtered_by'].values(): - remote_model._meta.get_field(v) + for v in rel_paths.values(): + target_model._meta.get_field(v) except FieldDoesNotExist as e: raise PermissionDenied from e - self.remote_model = remote_model - self.filtered_by_fields = filtered_by_fields + self.target_model = target_model + self.filtered_by_dict = filtered_by_dict self.drilldown_field = drilldown_field self.drilldown_filter_data = { - v: filtered_by_fields[k] for k, v in drilldown_field['filtered_by'].items() if k in filtered_by_fields} + rel_paths[k]: v for k,v in filtered_by_dict.items()} return term, model_admin, source_field, to_field_name @@ -76,7 +80,7 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): """Return queryset based on ModelAdmin.get_search_results().""" qs = super().get_queryset() if getattr(self, 'drilldown_enabled', False): - if hasattr(self, 'filtered_by_fields'): + 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): @@ -136,8 +140,8 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin): if db_field.name in daf: attrs = {'data-drilldown_enabled': 1} if 'filtered_by' in daf[db_field.name]: - attrs["data-filtered_by_fields"] = json.dumps( - list(daf[db_field.name]['filtered_by'].keys())) + attrs["data-filtered_by"] = json.dumps( + list(daf[db_field.name]['filtered_by'])) if daf[db_field.name].get('included_only', False): attrs['data-included_only'] = 1 else: diff --git a/django/static/admin/js/autocomplete.js b/django/static/admin/js/autocomplete.js index 55af7a2..76b0420 100644 --- a/django/static/admin/js/autocomplete.js +++ b/django/static/admin/js/autocomplete.js @@ -17,24 +17,24 @@ }; if (element.dataset.hasOwnProperty('drilldown_enabled')) { out.drilldown = 1; - if (element.dataset.hasOwnProperty('filtered_by_fields')) { - var filtered_by_fields = JSON.parse(element.dataset.filtered_by_fields) - var filtered_by_fields_obj = {}; + if (element.dataset.hasOwnProperty('filtered_by')) { + var filtered_by_fields = JSON.parse(element.dataset.filtered_by) + var filtered_by_dict = {}; var some_obj = false; for (var i in filtered_by_fields) { if (filtered_by_fields.hasOwnProperty(i)) { - var remote_field = filtered_by_fields[i]; + var filtering_field = filtered_by_fields[i]; var field_id = element.dataset.select2Id; - var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field; - var value = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0].value; - if (value !== '') { - filtered_by_fields_obj[remote_field] = value; + var filtering_field_id = field_id.slice(0, field_id.length - field_name.length) + filtering_field; + var filtering_value = document.querySelectorAll('[data-select2-id=' + filtering_field_id + '].admin-autocomplete')[0].value; + if (filtering_value !== '') { + filtered_by_dict[filtering_field] = filtering_value; some_obj = true; } } } if (some_obj) { - out['filtered_by_fields'] = JSON.stringify(filtered_by_fields_obj); + out['filtered_by_dict'] = JSON.stringify(filtered_by_dict); } } } @@ -74,11 +74,11 @@ for (var i in reset_on_excluded) { if (reset_on_excluded.hasOwnProperty(i)) { var field_name = element.dataset.fieldName - var remote_field = reset_on_excluded[i]; + var field_to_reset = reset_on_excluded[i]; var field_id = element.dataset.select2Id; - var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field; - var remote_element = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0]; - $(remote_element).val(null).trigger("change"); + var id_to_reset = field_id.slice(0, field_id.length - field_name.length) + field_to_reset; + var element_to_reset = document.querySelectorAll('[data-select2-id=' + id_to_reset + '].admin-autocomplete')[0]; + $(element_to_reset).val(null).trigger("change"); } } }