tolta una informazione pleonastica

my-submodulepoetico
Guido Longoni 2023-07-06 02:20:43 +02:00
parent 9d4b789338
commit bb6a45e560
2 changed files with 39 additions and 53 deletions

View File

@ -32,69 +32,56 @@ class DrillDownAutocompleteJsonView(AutocompleteJsonView):
to_field_name to_field_name
) = super().process_request(request) ) = super().process_request(request)
if 'drilldown' in request.GET: if 'filtered_by_dict' in request.GET:
try: try:
drilldown_enabled = int(request.GET.get('drilldown')) filtered_by_dict = json.loads(
except ValueError: request.GET.get("filtered_by_dict"))
except json.decoder.JSONDecodeError as e:
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_enabled = {1: True, 0: False}[drilldown_enabled] drilldown_field = self.admin_site._registry[
except KeyError: source_model].get_drilldown_autocomplete_fields(request)[source_field.name]
filtered_by = set(drilldown_field['filtered_by'])
except KeyError as e:
raise PermissionDenied from e raise PermissionDenied from e
if (set(filtered_by_dict.keys()) > filtered_by):
self.drilldown_enabled = drilldown_enabled raise PermissionDenied
if drilldown_enabled: rel_paths = drilldown_field['relationship_path']
if 'filtered_by_dict' in request.GET: target_model = source_field.remote_field.model
try: try:
filtered_by_dict = json.loads( for v in rel_paths.values():
request.GET.get("filtered_by_dict")) target_model._meta.get_field(v)
except json.decoder.JSONDecodeError as e: except FieldDoesNotExist as e:
raise PermissionDenied from e raise PermissionDenied from e
app_label = request.GET["app_label"] self.target_model = target_model
model_name = request.GET["model_name"] self.filtered_by_dict = filtered_by_dict
source_model = apps.get_model(app_label, model_name) self.drilldown_field = drilldown_field
try: self.drilldown_filter_data = {
drilldown_field = self.admin_site._registry[ rel_paths[k]: v for k, v in filtered_by_dict.items()}
source_model].get_drilldown_autocomplete_fields(request)[source_field.name]
filtered_by = set(drilldown_field['filtered_by'])
except KeyError as e:
raise PermissionDenied from e
if (set(filtered_by_dict.keys()) > filtered_by):
raise PermissionDenied
rel_paths = drilldown_field['relationship_path']
target_model = source_field.remote_field.model
try:
for v in rel_paths.values():
target_model._meta.get_field(v)
except FieldDoesNotExist as e:
raise PermissionDenied from e
self.target_model = target_model
self.filtered_by_dict = filtered_by_dict
self.drilldown_field = drilldown_field
self.drilldown_filter_data = {
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
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() qs = super().get_queryset()
if getattr(self, 'drilldown_enabled', False): if hasattr(self, 'filtered_by_dict'):
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): self.autoselect = False
self.autoselect = False if dd_field.get('included_only', False):
if dd_field.get('included_only', False): qs = qs.filter(drilldown_filter_conditions).annotate(
qs = qs.filter(drilldown_filter_conditions).annotate( ddok=Value(1))
ddok=Value(1))
else:
qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value(
1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by)
if not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1:
self.autoselect = True
else: else:
qs = qs.annotate(ddok=Value(1)) qs = qs.annotate(ddok=Max(Case(When(drilldown_filter_conditions, then=Value(
1)), default=Value(0)))).order_by('-ddok', *qs.query.order_by)
if not getattr(self, 'autoselect', True) and qs.filter(ddok=1).count() == 1:
self.autoselect = True
else:
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):

View File

@ -17,7 +17,6 @@
}; };
if (element.dataset.hasOwnProperty('drilldown_enabled')) { if (element.dataset.hasOwnProperty('drilldown_enabled')) {
out.drilldown = 1;
if (element.dataset.hasOwnProperty('filtered_by')) { if (element.dataset.hasOwnProperty('filtered_by')) {
const filtered_by_fields = JSON.parse(element.dataset.filtered_by) const filtered_by_fields = JSON.parse(element.dataset.filtered_by)