tolta una informazione pleonastica
parent
9d4b789338
commit
bb6a45e560
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue