refactoring parte 2

my-submodulepoetico
Guido Longoni 2023-07-05 23:38:42 +02:00
parent c9327e267a
commit 3c86b3a2d2
3 changed files with 37 additions and 31 deletions

View File

@ -142,23 +142,25 @@ class EmailAdmin(HiddenModel, PolymorphicParentModelAdmin, PolymorphicChildModel
ddaf={ ddaf={
'cap': { 'cap': {
'filtered_by': { 'relationship_path': {
'comune': 'comuni', 'comune': 'comuni',
}, },
'reset_on_included': {}, 'filtered_by': [ 'comune' ],
'reset_on_included': [],
'reset_on_excluded': ['comune'], 'reset_on_excluded': ['comune'],
'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': False,
}, },
'comune': { 'comune': {
'filtered_by': { 'relationship_path': {
'cap': 'cap', 'cap': 'cap',
}, },
'reset_on_included': {}, 'filtered_by': [ 'cap' ],
'reset_on_included': [],
'reset_on_excluded': ['cap'], 'reset_on_excluded': ['cap'],
'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': False,

View File

@ -44,10 +44,10 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
self.drilldown_enabled = drilldown_enabled self.drilldown_enabled = drilldown_enabled
if drilldown_enabled: if drilldown_enabled:
if 'filtered_by_fields' in request.GET: if 'filtered_by_dict' in request.GET:
try: try:
filtered_by_fields = json.loads( filtered_by_dict = json.loads(
request.GET.get("filtered_by_fields")) request.GET.get("filtered_by_dict"))
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"]
@ -56,19 +56,23 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
try: try:
drilldown_field = self.admin_site._registry[ drilldown_field = self.admin_site._registry[
source_model].get_drilldown_autocomplete_fields(request)[source_field.name] source_model].get_drilldown_autocomplete_fields(request)[source_field.name]
filtered_by = set(drilldown_field['filtered_by'])
except KeyError as e: except KeyError as e:
raise PermissionDenied from 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: try:
for v in drilldown_field['filtered_by'].values(): for v in rel_paths.values():
remote_model._meta.get_field(v) target_model._meta.get_field(v)
except FieldDoesNotExist as e: except FieldDoesNotExist as e:
raise PermissionDenied from e raise PermissionDenied from e
self.remote_model = remote_model self.target_model = target_model
self.filtered_by_fields = filtered_by_fields self.filtered_by_dict = filtered_by_dict
self.drilldown_field = drilldown_field self.drilldown_field = drilldown_field
self.drilldown_filter_data = { 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 return term, model_admin, source_field, to_field_name
@ -76,7 +80,7 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
"""Return queryset based on ModelAdmin.get_search_results().""" """Return queryset based on ModelAdmin.get_search_results()."""
qs = super().get_queryset() qs = super().get_queryset()
if getattr(self, 'drilldown_enabled', False): if getattr(self, 'drilldown_enabled', False):
if hasattr(self, 'filtered_by_fields'): if hasattr(self, 'filtered_by_dict'):
dd_field = self.drilldown_field dd_field = self.drilldown_field
drilldown_filter_conditions = Q(**self.drilldown_filter_data) drilldown_filter_conditions = Q(**self.drilldown_filter_data)
if dd_field.get('autoselect_on_singleton', False): if dd_field.get('autoselect_on_singleton', False):
@ -136,8 +140,8 @@ class DrillDownAutocompleteModelAdmin(admin.options.BaseModelAdmin):
if db_field.name in daf: if db_field.name in daf:
attrs = {'data-drilldown_enabled': 1} attrs = {'data-drilldown_enabled': 1}
if 'filtered_by' in daf[db_field.name]: if 'filtered_by' in daf[db_field.name]:
attrs["data-filtered_by_fields"] = json.dumps( attrs["data-filtered_by"] = json.dumps(
list(daf[db_field.name]['filtered_by'].keys())) list(daf[db_field.name]['filtered_by']))
if daf[db_field.name].get('included_only', False): if daf[db_field.name].get('included_only', False):
attrs['data-included_only'] = 1 attrs['data-included_only'] = 1
else: else:

View File

@ -17,24 +17,24 @@
}; };
if (element.dataset.hasOwnProperty('drilldown_enabled')) { if (element.dataset.hasOwnProperty('drilldown_enabled')) {
out.drilldown = 1; out.drilldown = 1;
if (element.dataset.hasOwnProperty('filtered_by_fields')) { if (element.dataset.hasOwnProperty('filtered_by')) {
var filtered_by_fields = JSON.parse(element.dataset.filtered_by_fields) var filtered_by_fields = JSON.parse(element.dataset.filtered_by)
var filtered_by_fields_obj = {}; var filtered_by_dict = {};
var some_obj = false; var some_obj = false;
for (var i in filtered_by_fields) { for (var i in filtered_by_fields) {
if (filtered_by_fields.hasOwnProperty(i)) { 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 field_id = element.dataset.select2Id;
var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field; var filtering_field_id = field_id.slice(0, field_id.length - field_name.length) + filtering_field;
var value = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0].value; var filtering_value = document.querySelectorAll('[data-select2-id=' + filtering_field_id + '].admin-autocomplete')[0].value;
if (value !== '') { if (filtering_value !== '') {
filtered_by_fields_obj[remote_field] = value; filtered_by_dict[filtering_field] = filtering_value;
some_obj = true; some_obj = true;
} }
} }
} }
if (some_obj) { 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) { for (var i in reset_on_excluded) {
if (reset_on_excluded.hasOwnProperty(i)) { if (reset_on_excluded.hasOwnProperty(i)) {
var field_name = element.dataset.fieldName 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 field_id = element.dataset.select2Id;
var remote_id = field_id.slice(0, field_id.length - field_name.length) + remote_field; var id_to_reset = field_id.slice(0, field_id.length - field_name.length) + field_to_reset;
var remote_element = document.querySelectorAll('[data-select2-id=' + remote_id + '].admin-autocomplete')[0]; var element_to_reset = document.querySelectorAll('[data-select2-id=' + id_to_reset + '].admin-autocomplete')[0];
$(remote_element).val(null).trigger("change"); $(element_to_reset).val(null).trigger("change");
} }
} }
} }