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,