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,47 +31,58 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
source_field, source_field,
to_field_name to_field_name
) = super().process_request(request) ) = super().process_request(request)
linkedfields = request.GET.get("linkedfields")
if linkedfields: if 'drilldown' in request.GET:
try: try:
linkedfields = json.loads(linkedfields) drilldown_enabled = int(request.GET.get('drilldown'))
except json.decoder.JSONDecodeError as e: except ValueError:
raise PermissionDenied from 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: try:
drilldown_field = self.admin_site._registry[ drilldown_enabled = {1:True, 0:False}[drilldown_enabled]
source_model].get_drilldown_autocomplete_fields(request)[source_field.name] except KeyError:
except KeyError as e:
raise PermissionDenied from e raise PermissionDenied from e
remote_model = source_field.remote_field.model
try: self.drilldown_enabled = drilldown_enabled
for v in drilldown_field['linked'].values(): if drilldown_enabled:
remote_model._meta.get_field(v) if 'linkedfields' in request.GET:
except FieldDoesNotExist as e: try:
raise PermissionDenied from e linkedfields = json.loads(request.GET.get("linkedfields"))
self.remote_model = remote_model except json.decoder.JSONDecodeError as e:
self.linkedfields = linkedfields raise PermissionDenied from e
self.drilldown_filter_data = { app_label = request.GET["app_label"]
v: linkedfields[k] for k, v in drilldown_field['linked'].items() if k in linkedfields} 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 return term, model_admin, source_field, to_field_name
def get_queryset(self): def get_queryset(self):
"""Return queryset based on ModelAdmin.get_search_results().""" """Return queryset based on ModelAdmin.get_search_results()."""
qs = super().get_queryset().only() qs = super().get_queryset()
self.autoselect = False if getattr(self, 'drilldown_enabled', False):
# print('Prima:',qs.query,'\n\n') if hasattr(self, 'linkedfields'):
if hasattr(self, 'linkedfields'): self.autoselect = False
drilldown_filter_conditions = Q(**self.drilldown_filter_data) drilldown_filter_conditions = Q(**self.drilldown_filter_data)
qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value( qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value(
1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by) 1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by)
if qs.filter(ddok=1).count() == 1: if qs.filter(ddok=1).count() == 1:
self.autoselect = True self.autoselect = True
# print('Dopo:',qs.query,'\n\n') else:
else: qs = qs.annotate(ddok=Value(1))
qs = qs.annotate(ddok=Value(1))
return qs return qs
def serialize_result(self, obj, to_field_name): 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 Convert the provided model object to a dictionary that is added to the
results list. results list.
""" """
out = {"id": str(getattr(obj, to_field_name)), "text": str(obj), "ddok": obj.ddok} out=super().serialize_result(obj, to_field_name)
if self.autoselect and obj.ddok == 1: if hasattr(obj, 'ddok'):
out['autoselect'] = True out['ddok'] = obj.ddok
if getattr(self,'autoselect',False) and obj.ddok == 1:
out['autoselect'] = True
return out return out

View File

@ -4,62 +4,64 @@
$.fn.djangoAdminSelect2 = function() { $.fn.djangoAdminSelect2 = function() {
$.each(this, function(i, element) { $.each(this, function(i, element) {
$(element).select2({ var select2_config = {};
ajax: { select2_config.ajax = {
data: (params)=>{ data: (params)=>{
var field_name = element.dataset.fieldName var field_name = element.dataset.fieldName
var out = { var out = {
term: params.term, term: params.term,
page: params.page, page: params.page,
app_label: element.dataset.appLabel, app_label: element.dataset.appLabel,
model_name: element.dataset.modelName, model_name: element.dataset.modelName,
field_name: field_name field_name: field_name
}; };
if (element.dataset.hasOwnProperty('linkedfields')) { if (element.dataset.hasOwnProperty('linkedfields')) {
var linkedfields = JSON.parse(element.dataset.linkedfields) out.drilldown = 1;
var linkedfields_obj = {}; var linkedfields = JSON.parse(element.dataset.linkedfields)
var some_obj = false; var linkedfields_obj = {};
for (var i in linkedfields) { var some_obj = false;
if (linkedfields.hasOwnProperty(i)) { for (var i in linkedfields) {
var remote_field = linkedfields[i]; if (linkedfields.hasOwnProperty(i)) {
var field_id = element.dataset.select2Id; var remote_field = linkedfields[i];
var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field; var field_id = element.dataset.select2Id;
var value = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0].value; var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field;
if (value !== '') { var value = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0].value;
//console.log(field + '=' + value); if (value !== '') {
linkedfields_obj[remote_field] = value; linkedfields_obj[remote_field] = value;
some_obj = true; some_obj = true;
}
} }
} }
if (some_obj) {
out['linkedfields'] = JSON.stringify(linkedfields_obj);
}
} }
return out if (some_obj) {
out['linkedfields'] = JSON.stringify(linkedfields_obj);
}
} }
}, return out
templateResult: (item,container)=>{ }
};
if (element.dataset.hasOwnProperty('linkedfields')) {
select2_config.templateResult = (item,container)=>{
var styleClass = ''; var styleClass = '';
if (element.dataset.hasOwnProperty('linkedfields')) {
element.classList.add('drilldown'); element.classList.add('drilldown');
if (item.ddok === 1) { if (item.ddok === 1) {
styleClass = 'drilldown_ok'; styleClass = 'drilldown_ok';
} else { } else {
styleClass = 'drilldown_ko'; styleClass = 'drilldown_ko';
} }
container.classList.add(styleClass); container.classList.add(styleClass);
if (item.hasOwnProperty('autoselect')) { if (item.hasOwnProperty('autoselect')) {
if ($(element).select2('data').length == 0) { if ($(element).select2('data').length == 0) {
$(element).select2("trigger", "select", { $(element).select2("trigger", "select", {
data: item data: item
}) })
}
} }
} }
return $('<span class="' + styleClass + '"></span>').text(item.text); return $('<span class="' + styleClass + '"></span>').text(item.text);
} }
}); }
$(element).select2(select2_config);
}); });
return this; return this;
} }