From 5d095af29113622807fbfa4e93e7a0446a5a6d4c Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Sun, 7 Jul 2024 18:19:08 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20de=20la=20pr=C3=A9sentation?= =?UTF-8?q?=20de=20la=20recherche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agenda_culturel/paginator_filter.html | 20 +++++++++ .../templates/agenda_culturel/search.html | 43 ++++++++++++++++++- src/agenda_culturel/templatetags/cat_extra.py | 7 +++ src/agenda_culturel/templatetags/tag_extra.py | 15 +++++-- src/agenda_culturel/views.py | 18 +++++++- 5 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 src/agenda_culturel/templates/agenda_culturel/paginator_filter.html diff --git a/src/agenda_culturel/templates/agenda_culturel/paginator_filter.html b/src/agenda_culturel/templates/agenda_culturel/paginator_filter.html new file mode 100644 index 0000000..b560fed --- /dev/null +++ b/src/agenda_culturel/templates/agenda_culturel/paginator_filter.html @@ -0,0 +1,20 @@ + {% if paginator_filter.paginator.num_pages != 1 %} + + {% if paginator_filter.has_previous %} + « premier + précédent + {% endif %} + + + Page {{ paginator_filter.number }} sur {{ paginator_filter.paginator.num_pages }} + + + {% if paginator_filter.has_next %} + suivant + dernier » + {% endif %} + + {% else %} + Page 1 sur 1 + {% endif %} + diff --git a/src/agenda_culturel/templates/agenda_culturel/search.html b/src/agenda_culturel/templates/agenda_culturel/search.html index b468b31..ff3d0e3 100644 --- a/src/agenda_culturel/templates/agenda_culturel/search.html +++ b/src/agenda_culturel/templates/agenda_culturel/search.html @@ -3,6 +3,7 @@ {% block title %}Rechercher un événement{% endblock %} {% load utils_extra %} +{% load tag_extra %} {% load cat_extra %} {% block entete_header %} @@ -27,8 +28,48 @@ {% endif %} - {% if has_results %} + + {% if has_results or categories %}
+ {% if categories %} +
+ {% if categories.count > 1 %} + Retrouvez les événements correspondant aux catégories + {% else %} + Retrouvez les événements correspondant à la catégorie + {% endif %} + {% for c in categories %} + {{ c | small_cat_no_contrast }} + {% endfor %} +
+ {% endif %} + + {% if tags %} +
+ {% if tags.count > 1 %} + Retrouvez les événements correspondant aux étiquettes + {% else %} + Retrouvez les événements correspondant à l'étiquette + {% endif %} + {% for t in tags %} + {{ t | tag_button_link }} + {% endfor %} +
+ {% endif %} + + {% if places %} +
+ {% if places.count > 1 %} + Retrouvez les événements se déroulant dans les lieux + {% else %} + Retrouvez les événements se déroulant dans le lieu + {% endif %} + {% for p in places %} + {{ p.name }}{% if not forloop.last %},{% endif %} + {% endfor %} +
+ {% endif %} +

{{ paginator_filter.paginator.count }} événement{{paginator_filter.object_list.count | pluralize }} correspond{{paginator_filter.object_list.count | pluralize:"ent" }} à la recherche.

{% for obj in paginator_filter %} diff --git a/src/agenda_culturel/templatetags/cat_extra.py b/src/agenda_culturel/templatetags/cat_extra.py index eeadf91..484afea 100644 --- a/src/agenda_culturel/templatetags/cat_extra.py +++ b/src/agenda_culturel/templatetags/cat_extra.py @@ -175,6 +175,13 @@ def small_cat(category, url=None, contrast=True, selected=True, recurrence=False def small_cat_no_selected(category, url=None): return small_cat(category, url=url, selected=False) +@register.filter +def small_cat_no_contrast(category, url=None): + if url is None: + url = "/?category=" + str(category.pk) + return small_cat(category, url=url, contrast=False) + + @register.filter def small_cat_recurrent(category, recurrence=False): diff --git a/src/agenda_culturel/templatetags/tag_extra.py b/src/agenda_culturel/templatetags/tag_extra.py index d5bca26..8de75fe 100644 --- a/src/agenda_culturel/templatetags/tag_extra.py +++ b/src/agenda_culturel/templatetags/tag_extra.py @@ -5,13 +5,12 @@ from django.urls import reverse_lazy register = template.Library() -@register.filter -def tag_button(tag, link=False, strike=False): +def t_button(tag, url, strike): strike_class = " strike" if strike else "" - if link: + if not url is None: return mark_safe( '' @@ -27,7 +26,15 @@ def tag_button(tag, link=False, strike=False): + "" ) +@register.filter +def tag_button(tag, link=False, strike=False): + return t_button(tag, reverse_lazy("view_tag", {"tag": tag}) if link else None, strike) + @register.filter def tag_button_strike(tag, link=False): return tag_button(tag, link, strike=True) + +@register.filter +def tag_button_link(tag): + return t_button(tag, '/?tags=' + tag, False) \ No newline at end of file diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 021dd3f..34495bc 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -794,10 +794,12 @@ class SimpleSearchEventFilter(django_filters.FilterSet): search_query = SearchQuery(value, config="french") qs = queryset.filter( Q(title__icontains=value) - | Q(location__icontains=value) + | Q(category__name__icontains=value) + | Q(tags__icontains=[value]) + | Q(exact_location__name__icontains=value) | Q(description__icontains=value) ) - for f in ["title", "location", "description"]: + for f in ["title", "category__name", "exact_location__name", "description"]: params = { f + "_hl": SearchHeadline( @@ -875,6 +877,10 @@ class SearchEventFilter(django_filters.FilterSet): def event_search(request, full=False): + categories = None + tags = None + places = None + if full: filter = SearchEventFilter( request.GET, @@ -887,10 +893,15 @@ def event_search(request, full=False): queryset=get_event_qs(request).order_by("-start_day"), request=request, ) + if 'q' in request.GET: + categories = Category.objects.filter(name__icontains=request.GET['q']) + tags = [item for row in Event.objects.extra(where=['%s ILIKE ANY (tags)'], params=[request.GET['q']]).values_list('tags', flat=True).distinct() for item in row] + places = Place.objects.filter(Q(name__icontains=request.GET['q'])) paginator = PaginatorFilter(filter, 10, request) page = request.GET.get("page") + try: response = paginator.page(page) except PageNotAnInteger: @@ -903,6 +914,9 @@ def event_search(request, full=False): "agenda_culturel/search.html", { "filter": filter, + "categories": categories, + "tags": tags, + "places": places, "has_results": len(request.GET) != 0 or (len(request.GET) > 1 and "page" in request.GET), "paginator_filter": response,