From ec69556b1c0982e44b1fec2106ad3bb2e1b2b2a2 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 15 Feb 2022 15:33:25 +0100 Subject: [PATCH] #112 Autocomplete enhancements * enhances filtering for Autocomplete -> parent_parent will be searched for match as well * adds rendering of parent_parent group for BiotopeAutocomplete * enhances ordering of registration office autocomplete --- konova/autocompletes.py | 49 +++++++++++++++++++++++++++++- konova/static/css/konova.css | 13 ++++++-- konova/utils/message_templates.py | 2 +- locale/de/LC_MESSAGES/django.mo | Bin 37895 -> 37936 bytes locale/de/LC_MESSAGES/django.po | 20 +++++++----- 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/konova/autocompletes.py b/konova/autocompletes.py index 3a79ab68..b07e2088 100644 --- a/konova/autocompletes.py +++ b/konova/autocompletes.py @@ -5,7 +5,12 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 07.12.20 """ +import collections + from dal_select2.views import Select2QuerySetView, Select2GroupQuerySetView +from django.core.exceptions import ImproperlyConfigured + +from konova.utils.message_templates import UNGROUPED from user.models import User from django.db.models import Q @@ -139,6 +144,8 @@ class KonovaCodeAutocomplete(Select2GroupQuerySetView): 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 @@ -214,6 +221,41 @@ class BiotopeCodeAutocomplete(KonovaCodeAutocomplete): def get_result_label(self, result): return f"{result.long_name} ({result.short_name})" + def get_results(self, context): + """Return the options grouped by a common related model. + + Raises ImproperlyConfigured if self.group_by_name is not configured + """ + if not self.group_by_related: + raise ImproperlyConfigured("Missing group_by_related.") + + super_groups = collections.OrderedDict() + + object_list = context['object_list'] + + for result in object_list: + group = result.parent if result.parent else None + group_name = f"{group.long_name} ({group.short_name})" if group else UNGROUPED + super_group = result.parent.parent if result.parent else None + super_group_name = f"{super_group.long_name} ({super_group.short_name})" if super_group else UNGROUPED + super_groups.setdefault(super_group_name, {}) + super_groups[super_group_name].setdefault(group_name, []) + super_groups[super_group_name][group_name].append(result) + + return [{ + 'id': None, + 'text': super_group, + 'children': [{ + "id": None, + "text": group, + "children": [{ + 'id': self.get_result_value(result), + 'text': self.get_result_label(result), + 'selected_text': self.get_selected_result_label(result), + } for result in results] + } for group, results in groups.items()] + } for super_group, groups in super_groups.items()] + class BiotopeExtraCodeAutocomplete(KonovaCodeAutocomplete): """ @@ -284,6 +326,11 @@ class RegistrationOfficeCodeAutocomplete(KonovaCodeAutocomplete): self.c = CODELIST_REGISTRATION_OFFICE_ID super().__init__(*args, **kwargs) + def order_by(self, qs): + return qs.order_by( + "parent__long_name" + ) + class ConservationOfficeCodeAutocomplete(KonovaCodeAutocomplete): """ @@ -297,4 +344,4 @@ class ConservationOfficeCodeAutocomplete(KonovaCodeAutocomplete): super().__init__(*args, **kwargs) def get_result_label(self, result): - return f"{result.long_name} ({result.short_name})" \ No newline at end of file + return f"{result.long_name} ({result.short_name})" diff --git a/konova/static/css/konova.css b/konova/static/css/konova.css index 709d3eb3..7e7f3fd1 100644 --- a/konova/static/css/konova.css +++ b/konova/static/css/konova.css @@ -242,15 +242,24 @@ Similar to bootstraps 'shadow-lg' .select2-results__option--highlighted{ background-color: var(--rlp-red) !important; } +/* .select2-container--default .select2-results__group{ background-color: var(--rlp-gray-light); } .select2-container--default .select2-results__option .select2-results__option{ - padding-left: 2em !important; + padding-left: 1em !important; +} + + */ +.select2-results__options--nested{ + padding-left: 1em !important; } .select2-container--default .select2-results > .select2-results__options{ max-height: 500px !important; } +/* .select2-container--default .select2-results__option .select2-results__option{ padding-left: 2em; -} \ No newline at end of file +} + + */ \ No newline at end of file diff --git a/konova/utils/message_templates.py b/konova/utils/message_templates.py index c7a2be00..5809b3b6 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -7,7 +7,7 @@ Created on: 02.08.21 """ from django.utils.translation import gettext_lazy as _ - +UNGROUPED = _("Ungrouped") FORM_INVALID = _("There was an error on this form.") PARAMS_INVALID = _("Invalid parameters") INTERVENTION_INVALID = _("There are errors in this intervention.") diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 87e1e03a5d6b5139726bf84ca2cdc849f3fe98fe..022e9e1a728d186a0e8be95eee8ae29ea5928bee 100644 GIT binary patch delta 8795 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 A4*&oF delta 8770 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\n" "Language-Team: LANGUAGE \n" @@ -565,8 +565,9 @@ msgid "" "action types are expected to be performed according to the amount and unit " "below on this form." msgstr "" -"Eine Maßnahme kann aus mehreren verschiedenen Maßnahmentypen bestehen. Alle hier gewählten " -"Einträge sollen mit der weiter unten angegebenen Einheit und Menge umgesetzt werden. " +"Eine Maßnahme kann aus mehreren verschiedenen Maßnahmentypen bestehen. Alle " +"hier gewählten Einträge sollen mit der weiter unten angegebenen Einheit und " +"Menge umgesetzt werden. " #: compensation/forms/modalForms.py:418 compensation/forms/modalForms.py:430 msgid "Action Type detail" @@ -1765,6 +1766,11 @@ msgstr "Neu" msgid "Show" msgstr "Anzeigen" +#: konova/templates/konova/widgets/checkbox-tree-select.html:4 +#: templates/generic_index.html:56 +msgid "Search" +msgstr "Suchen" + #: konova/templates/konova/widgets/generate-content-input.html:6 msgid "Generate new" msgstr "Neu generieren" @@ -1805,6 +1811,10 @@ msgstr "{} - Freigegebene Daten geprüft" msgid "Request for new API token" msgstr "Anfrage für neuen API Token" +#: konova/utils/message_templates.py:10 +msgid "Ungrouped" +msgstr "Ohne Zuordnung" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -2270,10 +2280,6 @@ msgstr "Neu" msgid "Search for keywords" msgstr "Nach Schlagwörtern suchen" -#: templates/generic_index.html:56 -msgid "Search" -msgstr "Suchen" - #: templates/generic_index.html:57 msgid "Start search" msgstr "Starte Suche"