From 08b85d7024484f6ce121e36e89cffb86d6086941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org> Date: Tue, 23 Jan 2024 14:30:58 +0100 Subject: [PATCH] improved search --- contracts/admin.py | 2 +- .../commands/import_old_contracts.py | 3 +- contracts/templates/contracts/search.html | 55 ++----- contracts/views.py | 140 +++++------------- 4 files changed, 50 insertions(+), 150 deletions(-) diff --git a/contracts/admin.py b/contracts/admin.py index a03ffbf..96e15ee 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -1,11 +1,11 @@ import copy import json import logging +import threading import typing import uuid import requests -import threading from admin_auto_filters.filters import AutocompleteFilterFactory from django.conf import settings from django.contrib import admin diff --git a/contracts/management/commands/import_old_contracts.py b/contracts/management/commands/import_old_contracts.py index ea613d2..312f625 100644 --- a/contracts/management/commands/import_old_contracts.py +++ b/contracts/management/commands/import_old_contracts.py @@ -10,9 +10,10 @@ from django.conf import settings from django.core.files import File from django.core.management.base import BaseCommand from django.db import models -from git import Repo from postal.parser import parse_address +from git import Repo + from ...models import ( Contract, Contractee, diff --git a/contracts/templates/contracts/search.html b/contracts/templates/contracts/search.html index d80db8a..078044a 100644 --- a/contracts/templates/contracts/search.html +++ b/contracts/templates/contracts/search.html @@ -11,55 +11,18 @@ <form method="get" class="mb-10"> <div class="flex flex-col gap-2"> <input - id="name" - name="name" + id="q" + name="q" class="border border-black bg-grey-150 h-10 px-4 text-lg xl:h-14 xl:px-5" type="text" - value="{% if name %}{{ name }}{% endif %}" - placeholder="Název" - aria-label="VyhledávacĂ box pro název" + value="{% if query %}{{ query }}{% endif %}" + placeholder="Hledej..." + aria-label="VyhledávacĂ box" > - <input - id="summary" - name="summary" - class="border border-black bg-grey-150 h-10 px-4 text-lg xl:h-14 xl:px-5" - type="text" - value="{% if summary %}{{ summary }}{% endif %}" - placeholder="Sumarizace" - aria-label="VyhledávacĂ box pro sumarizaci" - > - - <input - id="signing_party_ico_number" - name="signing_party_ico_number" - class="border border-black bg-grey-150 h-10 px-4 text-lg xl:h-14 xl:px-5" - type="number" - min="0" - value="{% if signing_party_ico_number %}{{ signing_party_ico_number }}{% endif %}" - placeholder="IÄŚO smluvnĂch stran" - aria-label="VyhledávacĂ box pro IÄŚO smluvnĂch stran" - > - - <input - id="signing_party_name" - name="signing_party_name" - class="border border-black bg-grey-150 h-10 px-4 text-lg xl:h-14 xl:px-5" - type="text" - value="{% if signing_party_name %}{{ signing_party_name }}{% endif %}" - placeholder="Název smluvnĂch stran" - aria-label="VyhledávacĂ box pro názvy smluvnĂch stran" - > - - <input - id="signing_party_representative_name" - name="signing_party_representative_name" - class="border border-black bg-grey-150 h-10 px-4 text-lg xl:h-14 xl:px-5" - type="text" - value="{% if signing_party_representative_name %}{{ signing_party_representative_name }}{% endif %}" - placeholder="Zástupce smluvnĂch stran" - aria-label="VyhledávacĂ box pro zástupce smluvnĂch stran" - > + <span class="text-gray-400 mb-4"> + Prohledávána jsou jmĂ©na, souhrny, jmĂ©na smluvnĂch stran a jejich zástupcĹŻ. + </span> <button type="submit" class="btn text-lg"> <div class="btn__body h-10 xl:h-14 flex gap-3"> @@ -69,7 +32,7 @@ </div> </form> - {% if any_query_is_set %} + {% if query %} {% if page|length != 0 %} {% include "contracts/includes/contract_list.html" with page=page paginator=paginator %} {% else %} diff --git a/contracts/views.py b/contracts/views.py index c67cd49..4c126c5 100644 --- a/contracts/views.py +++ b/contracts/views.py @@ -123,118 +123,55 @@ def view_contract(request, id: int): def search(request): - request_filter = {} - - for url_parameter in ( - "name", - "summary", - "signing_party_ico_number", - "signing_party_name", - "signing_party_representative_name", - ): - request_filter[url_parameter] = request.GET.get(url_parameter) - - any_query_is_set = False - - for url_parameter_key in request_filter.keys(): - if request_filter[url_parameter_key] is None: - continue - - if request_filter[url_parameter_key].replace(" ", "") == "": - request_filter[url_parameter_key] = None - else: - any_query_is_set = True - - if request_filter["signing_party_ico_number"] is not None: - if not request_filter["signing_party_ico_number"].isnumeric(): - raise HTTPExceptions.BAD_REQUEST - - request_filter["signing_party_ico_number"] = int( - request_filter["signing_party_ico_number"] - ) + original_query = request.GET.get("q", default="") + query = original_query.lower() + + if query.isnumeric(): + number_query = int(query) + else: + number_query = 0 page = paginator = None title = "VyhledávánĂ" - if any_query_is_set: - filter = models.Q() - annotations = {} - - if request_filter["name"] is not None: - filter = filter & models.Q( - lower_name__contains=request_filter["name"].lower() - ) - annotations["lower_name"] = Lower("name") - - if request_filter["summary"] is not None: - filter = filter & models.Q( - lower_summary__contains=request_filter["summary"].lower() - ) - annotations["lower_summary"] = Lower("summary") - - if request_filter["signing_party_ico_number"] is not None: - filter = filter & models.Q( - models.Q( - contractee_signatures__contractee__ico_number=request_filter[ - "signing_party_ico_number" - ] - ) - | models.Q( - signee_signatures__signee__ico_number=request_filter[ - "signing_party_ico_number" - ] - ) - ) - - if request_filter["signing_party_name"] is not None: - filter = filter & models.Q( - models.Q( - contractee_signatures__contractee__name_lower__contains=request_filter[ - "signing_party_name" - ].lower() - ) - | models.Q( - signee_signatures__signee__name_lower__contains=request_filter[ - "signing_party_name" - ].lower() - ) + if query: + filter = models.Q( + models.Q(lower_name__contains=query) + | models.Q(lower_summary__contains=query) + | models.Q( + models.Q(contractee_signatures__contractee__ico_number=number_query) + | models.Q(signee_signatures__signee__ico_number=number_query) ) - - annotations.update( - { - "contractee_signatures__contractee__name_lower": Lower( - "contractee_signatures__contractee__name" - ), - "signee_signatures__signee__name_lower": Lower( - "signee_signatures__signee__name" - ), - } + | models.Q( + models.Q(contractee_signatures__contractee__name_lower__contains=query) + | models.Q(signee_signatures__signee__name_lower__contains=query) ) - - if request_filter["signing_party_representative_name"] is not None: - filter = filter & models.Q( + | models.Q( models.Q( - contractee_signatures__representatives__name_lower__contains=request_filter[ - "signing_party_representative_name" - ].lower() + contractee_signatures__representatives__name_lower__contains=query ) | models.Q( - signee_signatures__representatives__name_lower__contains=request_filter[ - "signing_party_representative_name" - ].lower() + signee_signatures__representatives__name_lower__contains=query ) ) + ) - annotations.update( - { - "contractee_signatures__representatives__name_lower": Lower( - "contractee_signatures__representatives__name" - ), - "signee_signatures__representatives__name_lower": Lower( - "signee_signatures__representatives__name" - ), - } - ) + annotations = { + "lower_name": Lower("name"), + "lower_summary": Lower("summary"), + "contractee_signatures__contractee__name_lower": Lower( + "contractee_signatures__contractee__name" + ), + "signee_signatures__signee__name_lower": Lower( + "signee_signatures__signee__name" + ), + "contractee_signatures__representatives__name_lower": Lower( + "contractee_signatures__representatives__name" + ), + "signee_signatures__representatives__name_lower": Lower( + "signee_signatures__representatives__name" + ), + } # WARNING: PostgreSQL-dependent page, paginator = get_paginated_contracts( @@ -252,8 +189,7 @@ def search(request): "description": "", "page": page, "paginator": paginator, - "any_query_is_set": any_query_is_set, - **request_filter, + "query": original_query, }, ) -- GitLab