dd autocomplete meno invasivo e fixato bug

hasattr di request
my-submodulepoetico
Guido Longoni 2023-07-05 15:52:06 +02:00
parent ad4b9dc86b
commit 6ed94177dc
2 changed files with 97 additions and 82 deletions

View File

@ -31,10 +31,22 @@ 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)
drilldown_enabled = int(request.GET.get('drilldown'))
except ValueError:
raise PermissionDenied from e
try:
drilldown_enabled = {1:True, 0:False}[drilldown_enabled]
except KeyError:
raise PermissionDenied from e
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"]
@ -60,16 +72,15 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
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')
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
# print('Dopo:',qs.query,'\n\n')
else:
qs = qs.annotate(ddok=Value(1))
return qs
@ -79,8 +90,10 @@ 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=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

View File

@ -4,8 +4,8 @@
$.fn.djangoAdminSelect2 = function() {
$.each(this, function(i, element) {
$(element).select2({
ajax: {
var select2_config = {};
select2_config.ajax = {
data: (params)=>{
var field_name = element.dataset.fieldName
var out = {
@ -16,6 +16,7 @@
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;
@ -26,7 +27,6 @@
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;
}
@ -38,10 +38,11 @@
}
return out
}
},
templateResult: (item,container)=>{
var styleClass = '';
};
if (element.dataset.hasOwnProperty('linkedfields')) {
select2_config.templateResult = (item,container)=>{
var styleClass = '';
element.classList.add('drilldown');
if (item.ddok === 1) {
styleClass = 'drilldown_ok';
@ -56,10 +57,11 @@
})
}
}
}
return $('<span class="' + styleClass + '"></span>').text(item.text);
}
});
}
$(element).select2(select2_config);
});
return this;
}