mpeltriaux
d785285805
* refactors konova/autocompletes.py by splitting into individual files and moving them to fitting apps * autocomplete files now live in APPNAME/autocomplete/...
75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
"""
|
|
Author: Michel Peltriaux
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
Contact: ksp-servicestelle@sgdnord.rlp.de
|
|
Created on: 18.08.22
|
|
|
|
"""
|
|
from dal_select2.views import Select2GroupQuerySetView
|
|
from django.db.models import Q
|
|
|
|
from codelist.models import KonovaCode
|
|
|
|
|
|
class KonovaCodeAutocomplete(Select2GroupQuerySetView):
|
|
"""
|
|
Provides simple autocomplete functionality for codes
|
|
|
|
Parameter support:
|
|
* q: Search for a word inside long_name of a code
|
|
* c: Search inside a special codelist
|
|
|
|
"""
|
|
paginate_by = 50
|
|
|
|
def order_by(self, qs):
|
|
""" Orders by a predefined value
|
|
|
|
Wrapped in a function to provide inheritance-based different orders
|
|
|
|
Args:
|
|
qs (QuerySet): The queryset to be ordered
|
|
|
|
Returns:
|
|
qs (QuerySet): The ordered queryset
|
|
"""
|
|
return qs.order_by(
|
|
"long_name"
|
|
)
|
|
|
|
def get_queryset(self):
|
|
if self.request.user.is_anonymous:
|
|
return KonovaCode.objects.none()
|
|
qs = KonovaCode.objects.filter(
|
|
is_archived=False,
|
|
is_selectable=True,
|
|
is_leaf=True,
|
|
)
|
|
qs = self.order_by(qs)
|
|
if self.c:
|
|
qs = qs.filter(
|
|
code_lists__in=[self.c]
|
|
)
|
|
if self.q:
|
|
# Remove whitespaces from self.q and split input in all keywords (if multiple given)
|
|
q = dict.fromkeys(self.q.strip().split(" "))
|
|
# Create one filter looking up for all keys where all keywords can be found in the same result
|
|
_filter = Q()
|
|
for keyword in q:
|
|
q_or = Q()
|
|
q_or |= Q(long_name__icontains=keyword)
|
|
q_or |= Q(short_name__icontains=keyword)
|
|
q_or |= Q(parent__long_name__icontains=keyword)
|
|
q_or |= Q(parent__short_name__icontains=keyword)
|
|
q_or |= Q(parent__parent__long_name__icontains=keyword)
|
|
q_or |= Q(parent__parent__short_name__icontains=keyword)
|
|
_filter.add(q_or, Q.AND)
|
|
qs = qs.filter(_filter).distinct()
|
|
return qs
|
|
|
|
def get_result_label(self, result):
|
|
return f"{result.long_name}"
|
|
|
|
def get_selected_result_label(self, result):
|
|
return f"{result.__str__()}"
|