From 581e878823ee6aad079274a147a36e7b23226edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org> Date: Thu, 13 Apr 2023 21:25:18 +0200 Subject: [PATCH] add searching --- contracts/templates/contracts/search.html | 16 ++++++----- contracts/urls.py | 5 ++++ contracts/views.py | 32 ++++++++++++++++++---- shared/templates/shared/includes/base.html | 6 ++-- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/contracts/templates/contracts/search.html b/contracts/templates/contracts/search.html index e6eaf27..825d270 100644 --- a/contracts/templates/contracts/search.html +++ b/contracts/templates/contracts/search.html @@ -4,25 +4,27 @@ {% block content %} {% include "contracts/includes/double_heading.html" with icon="ico--search" heading="Vyhledávání" subheading="dle názvu smlouvy" %} - <div class="flex flex-row justify-center"> - <form method="post"> + <form method="get" class="flex justify-center mb-10"> + <div class="flex flex-row border border-black"> {% csrf_token %} <input + id="q" + name="q" class="bg-grey-150 w-56 h-10 px-4 text-lg xl:h-14 xl:px-5" type="text" - value="{% if query %}{{ query }}{% endif %}" + value="{% if query_is_set %}{{ query }}{% endif %}" placeholder="Hledaný název" aria-label="Vyhledávací box" > <button type="submit" class="btn text-lg"> - <div class="btn__body"> + <div class="btn__body h-10 w-12 min-h-0 min-w-0 xl:h-14 xl:w-14"> <i class="ico--search"></i> </div> </button> - </form> - </div> + </div> + </form> - {% if query %} + {% if query_is_set %} <h2 class="text-lg font-bold mb-10"> Výsledky vyhledávání </h2> diff --git a/contracts/urls.py b/contracts/urls.py index 0ba4191..91c6fac 100644 --- a/contracts/urls.py +++ b/contracts/urls.py @@ -5,6 +5,11 @@ from . import models, views app_name = "contracts" urlpatterns = [ path("", views.index, name="index"), + path( + "contracts/search", + views.search, + name="search", + ), path("contracts/<int:id>", views.view_contract, name="view_contract"), path( "contracts/filing-areas/<int:id>", diff --git a/contracts/views.py b/contracts/views.py index ce58d09..924951d 100644 --- a/contracts/views.py +++ b/contracts/views.py @@ -4,6 +4,7 @@ import requests from django.conf import settings from django.core.paginator import Paginator from django.db import models +from django.db.models.functions import Lower from django.http import HttpResponse from django.shortcuts import get_object_or_404, render from django_downloadview import ObjectDownloadView @@ -47,11 +48,11 @@ def get_pagination(request, objects) -> tuple: return page, paginator -def get_paginated_contracts(request, filter=None) -> tuple: +def get_paginated_contracts(request, filter=None, annotations=None) -> tuple: if filter is None: filter = models.Q() - filter = models.Q(is_approved=True) + filter = filter & models.Q(is_approved=True) if not request.user.has_perm("contracts.view_confidential"): additional_filter = models.Q(is_public=True) @@ -61,8 +62,13 @@ def get_paginated_contracts(request, filter=None) -> tuple: filter = filter & additional_filter + contracts = get_objects_for_user(request.user, "contracts.view_contract") + + if annotations is not None: + contracts = contracts.annotate(**annotations) + contracts = ( - get_objects_for_user(request.user, "contracts.view_contract") + contracts .filter(filter) .order_by("-valid_start_date") .all() @@ -124,16 +130,29 @@ def search(request): page = paginator = None title = "Vyhledávání" - if query is not None: - title = f"Vyhledávání - {query}" + # Query is defined and is more than spaces + query_is_set = query is not None and len(query.replace(" ", "")) != 0 + + if query_is_set: + title = f"Vyhledávání - „{query}“" + + lower_query = query.lower() # WARNING: PostgreSQL-dependent page, paginator = get_paginated_contracts( request, - models.Q(name__search=query) + ( + models.Q(lower_name__contains=lower_query) + | models.Q(lower_summary__contains=lower_query) + ), + { + "lower_name": Lower("name"), + "lower_summary": Lower("summary"), + } ) return render( + request, "contracts/search.html", { **get_base_context(request), @@ -142,6 +161,7 @@ def search(request): "page": page, "paginator": paginator, "query": query, + "query_is_set": query_is_set, } ) diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html index 81c1643..58c3b66 100644 --- a/shared/templates/shared/includes/base.html +++ b/shared/templates/shared/includes/base.html @@ -59,7 +59,7 @@ <div class="container container--default navbar__content" :class="{'navbar__content--initialized': true}"> <div class="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0"> <a href="/"> - <img src="https://styleguide.pirati.cz/2.11.x/images/logo-round-white.svg" class="w-8" /> + <img src="https://styleguide.pirati.cz/2.12.x/images/logo-round-white.svg" class="w-8" /> </a> <a href="/" class="pl-4 font-bold text-xl hover:no-underline lg:border-r lg:border-grey-300 lg:pr-8">Registr smluv</a> </div> @@ -85,8 +85,8 @@ {% endif %} <li class="navbar-menu__item"> <a - href="#TODO" - data-href="#TODO" + href="{% url "contracts:search" %}" + data-href="{% url "contracts:search" %}" class="navbar-menu__link flex items-center gap-2" > <i class="ico--search text-sm"></i>Hledat -- GitLab