opzione included_only ora attiva e funzionante

my-submodulepoetico
Guido Longoni 2023-07-05 16:57:38 +02:00
parent e93193585f
commit 762120134a
3 changed files with 50 additions and 17 deletions

View File

@ -144,6 +144,30 @@ class RecapitoInline(StackedPolymorphicInline, DrillDownAutocompleteModelAdmin):
class IndirizzoInline(StackedPolymorphicInline.Child, DrillDownAutocompleteModelAdmin): class IndirizzoInline(StackedPolymorphicInline.Child, DrillDownAutocompleteModelAdmin):
model = models.Indirizzo model = models.Indirizzo
autocomplete_fields = ('dug','comune','cap','nazione',) autocomplete_fields = ('dug','comune','cap','nazione',)
drilldown_autocomplete_fields = {
'cap': {
'linked': {
'comune': 'comuni',
},
'reset_on_included': {},
'reset_on_excluded': {},
'reset_on_reset': {},
'autoupdate_on_reset': False,
'autoselect_on_singleton': True,
'included_only': True,
},
'comune': {
'linked': {
'cap': 'cap',
},
'reset_on_included': {},
'reset_on_excluded': {},
'reset_on_reset': {},
'autoupdate_on_reset': False,
'autoselect_on_singleton': True,
'included_only': False,
}
}
class SedeInline(StackedPolymorphicInline.Child): class SedeInline(StackedPolymorphicInline.Child):
model = models.Sede model = models.Sede
@ -277,7 +301,7 @@ class IndirizzoAdmin(HiddenModel, DrillDownAutocompleteModelAdmin, RicercaOrdina
'reset_on_reset': {}, 'reset_on_reset': {},
'autoupdate_on_reset': False, 'autoupdate_on_reset': False,
'autoselect_on_singleton': True, 'autoselect_on_singleton': True,
'included_only': False, 'included_only': True,
}, },
'comune': { 'comune': {
'linked': { 'linked': {
@ -287,7 +311,7 @@ class IndirizzoAdmin(HiddenModel, DrillDownAutocompleteModelAdmin, RicercaOrdina
'reset_on_excluded': {}, 'reset_on_excluded': {},
'reset_on_reset': {}, 'reset_on_reset': {},
'autoupdate_on_reset': False, 'autoupdate_on_reset': False,
'autoselect_on_singleton': False, 'autoselect_on_singleton': True,
'included_only': False, 'included_only': False,
} }
} }

View File

@ -46,7 +46,8 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
if drilldown_enabled: if drilldown_enabled:
if 'linkedfields' in request.GET: if 'linkedfields' in request.GET:
try: try:
linkedfields = json.loads(request.GET.get("linkedfields")) linkedfields = json.loads(
request.GET.get("linkedfields"))
except json.decoder.JSONDecodeError as e: except json.decoder.JSONDecodeError as e:
raise PermissionDenied from e raise PermissionDenied from e
app_label = request.GET["app_label"] app_label = request.GET["app_label"]
@ -76,9 +77,14 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
qs = super().get_queryset() qs = super().get_queryset()
if getattr(self, 'drilldown_enabled', False): if getattr(self, 'drilldown_enabled', False):
if hasattr(self, 'linkedfields'): if hasattr(self, 'linkedfields'):
if(self.drilldown_field['autoselect_on_singleton']): dd_field = self.drilldown_field
self.autoselect = False
drilldown_filter_conditions = Q(**self.drilldown_filter_data) drilldown_filter_conditions = Q(**self.drilldown_filter_data)
if dd_field.get('autoselect_on_singleton', False):
self.autoselect = False
if dd_field.get('included_only', False):
qs = qs.filter(drilldown_filter_conditions).annotate(
ddok=Value(1))
else:
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 not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1: if not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1:
@ -110,6 +116,7 @@ class DrillDownAutocompleteSelect(AutocompleteSelect, DrillDownAutocompleteMixin
class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin): class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin):
drilldown_autocomplete_fields = dict() drilldown_autocomplete_fields = dict()
class Media: class Media:
css = { css = {
'all': ('admin/css/drilldown_autocomplete.css',) 'all': ('admin/css/drilldown_autocomplete.css',)
@ -127,10 +134,12 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin):
if "widget" not in kwargs: if "widget" not in kwargs:
daf = self.get_drilldown_autocomplete_fields(request) daf = self.get_drilldown_autocomplete_fields(request)
if db_field.name in daf: if db_field.name in daf:
attrs = {
"data-linkedfields": json.dumps(list(daf[db_field.name]['linked'].keys())), }
if daf[db_field.name].get('included_only',False):
attrs['data-included_only'] = 1
kwargs["widget"] = DrillDownAutocompleteSelect( kwargs["widget"] = DrillDownAutocompleteSelect(
db_field, self.admin_site, attrs={ db_field, self.admin_site, attrs=attrs, using=db
"data-linkedfields": json.dumps(list(daf[db_field.name]['linked'].keys())),
}, using=db
) )
return super().formfield_for_foreignkey(db_field, request, **kwargs) return super().formfield_for_foreignkey(db_field, request, **kwargs)

View File

@ -51,7 +51,7 @@
} }
container.classList.add(styleClass); container.classList.add(styleClass);
if (item.hasOwnProperty('autoselect')) { if (item.hasOwnProperty('autoselect')) {
if ($(element).select2('data').length == 0) { if ((element.dataset.included_only ?? false) || $(element).select2('data').length == 0) {
$(element).select2("trigger", "select", { $(element).select2("trigger", "select", {
data: item data: item
}) })