Skip to content
Snippets Groups Projects
Commit 581e8788 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

add searching

parent dfd9aa6d
No related branches found
No related tags found
No related merge requests found
Pipeline #12344 passed
......@@ -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>
......
......@@ -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>",
......
......@@ -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,
}
)
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment