diff --git a/django/contatti_app/drilldown_autocomplete.py b/django/contatti_app/drilldown_autocomplete.py index 83e360e..62794b9 100644 --- a/django/contatti_app/drilldown_autocomplete.py +++ b/django/contatti_app/drilldown_autocomplete.py @@ -31,47 +31,58 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): source_field, to_field_name ) = super().process_request(request) - linkedfields = request.GET.get("linkedfields") - if linkedfields: + + if 'drilldown' in request.GET: try: - linkedfields = json.loads(linkedfields) - except json.decoder.JSONDecodeError as e: + drilldown_enabled = int(request.GET.get('drilldown')) + except ValueError: 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] - except KeyError as e: + drilldown_enabled = {1:True, 0:False}[drilldown_enabled] + except KeyError: raise PermissionDenied from e - remote_model = source_field.remote_field.model - try: - for v in drilldown_field['linked'].values(): - remote_model._meta.get_field(v) - except FieldDoesNotExist as e: - raise PermissionDenied from e - self.remote_model = remote_model - self.linkedfields = linkedfields - self.drilldown_filter_data = { - v: linkedfields[k] for k, v in drilldown_field['linked'].items() if k in linkedfields} + + self.drilldown_enabled = drilldown_enabled + if drilldown_enabled: + if 'linkedfields' in request.GET: + try: + linkedfields = json.loads(request.GET.get("linkedfields")) + 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] + except KeyError as e: + raise PermissionDenied from e + remote_model = source_field.remote_field.model + try: + for v in drilldown_field['linked'].values(): + remote_model._meta.get_field(v) + except FieldDoesNotExist as e: + raise PermissionDenied from e + self.remote_model = remote_model + self.linkedfields = linkedfields + self.drilldown_filter_data = { + v: linkedfields[k] for k, v in drilldown_field['linked'].items() if k in linkedfields} 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().only() - self.autoselect = False - # print('Prima:',qs.query,'\n\n') - if hasattr(self, 'linkedfields'): - drilldown_filter_conditions = Q(**self.drilldown_filter_data) - qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value( - 1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by) - if qs.filter(ddok=1).count() == 1: - self.autoselect = True - # print('Dopo:',qs.query,'\n\n') - else: - qs = qs.annotate(ddok=Value(1)) + qs = super().get_queryset() + if getattr(self, 'drilldown_enabled', False): + if hasattr(self, 'linkedfields'): + self.autoselect = False + drilldown_filter_conditions = Q(**self.drilldown_filter_data) + qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value( + 1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by) + if 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): @@ -79,9 +90,11 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView): Convert the provided model object to a dictionary that is added to the results list. """ - out = {"id": str(getattr(obj, to_field_name)), "text": str(obj), "ddok": obj.ddok} - if self.autoselect and obj.ddok == 1: - out['autoselect'] = True + out=super().serialize_result(obj, to_field_name) + if hasattr(obj, 'ddok'): + out['ddok'] = obj.ddok + if getattr(self,'autoselect',False) and obj.ddok == 1: + out['autoselect'] = True return out diff --git a/django/static/admin/js/autocomplete.js b/django/static/admin/js/autocomplete.js index 3ebaa75..6e4ed4c 100644 --- a/django/static/admin/js/autocomplete.js +++ b/django/static/admin/js/autocomplete.js @@ -4,62 +4,64 @@ $.fn.djangoAdminSelect2 = function() { $.each(this, function(i, element) { - $(element).select2({ - ajax: { - data: (params)=>{ - var field_name = element.dataset.fieldName - var out = { - term: params.term, - page: params.page, - app_label: element.dataset.appLabel, - model_name: element.dataset.modelName, - field_name: field_name - }; - if (element.dataset.hasOwnProperty('linkedfields')) { - var linkedfields = JSON.parse(element.dataset.linkedfields) - var linkedfields_obj = {}; - var some_obj = false; - for (var i in linkedfields) { - if (linkedfields.hasOwnProperty(i)) { - var remote_field = linkedfields[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 !== '') { - //console.log(field + '=' + value); - linkedfields_obj[remote_field] = value; - some_obj = true; - } + var select2_config = {}; + select2_config.ajax = { + data: (params)=>{ + var field_name = element.dataset.fieldName + var out = { + term: params.term, + page: params.page, + app_label: element.dataset.appLabel, + model_name: element.dataset.modelName, + field_name: field_name + }; + if (element.dataset.hasOwnProperty('linkedfields')) { + out.drilldown = 1; + var linkedfields = JSON.parse(element.dataset.linkedfields) + var linkedfields_obj = {}; + var some_obj = false; + for (var i in linkedfields) { + if (linkedfields.hasOwnProperty(i)) { + var remote_field = linkedfields[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 !== '') { + linkedfields_obj[remote_field] = value; + some_obj = true; } } - if (some_obj) { - out['linkedfields'] = JSON.stringify(linkedfields_obj); - } } - return out + if (some_obj) { + out['linkedfields'] = JSON.stringify(linkedfields_obj); + } } - }, - templateResult: (item,container)=>{ + return out + } + }; + if (element.dataset.hasOwnProperty('linkedfields')) { + select2_config.templateResult = (item,container)=>{ var styleClass = ''; - if (element.dataset.hasOwnProperty('linkedfields')) { - element.classList.add('drilldown'); - if (item.ddok === 1) { - styleClass = 'drilldown_ok'; - } else { - styleClass = 'drilldown_ko'; - } - container.classList.add(styleClass); - if (item.hasOwnProperty('autoselect')) { - if ($(element).select2('data').length == 0) { - $(element).select2("trigger", "select", { - data: item - }) - } + + element.classList.add('drilldown'); + if (item.ddok === 1) { + styleClass = 'drilldown_ok'; + } else { + styleClass = 'drilldown_ko'; + } + container.classList.add(styleClass); + if (item.hasOwnProperty('autoselect')) { + if ($(element).select2('data').length == 0) { + $(element).select2("trigger", "select", { + data: item + }) } } + return $('').text(item.text); } - }); + } + $(element).select2(select2_config); }); return this; }