Ajout d'une fonction de recherche (perfectible)
This commit is contained in:
parent
6e80291df8
commit
5dd1125a68
@ -208,4 +208,7 @@ msgid "next month"
|
|||||||
msgstr "le mois prochain"
|
msgstr "le mois prochain"
|
||||||
|
|
||||||
msgid "Add another"
|
msgid "Add another"
|
||||||
msgstr "Ajouter une autre"
|
msgstr "Ajouter une autre"
|
||||||
|
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Rechercher"
|
@ -23,6 +23,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
{% load event_extra %}
|
{% load event_extra %}
|
||||||
|
{% load utils_extra %}
|
||||||
<body>
|
<body>
|
||||||
<nav class="container-fluid">
|
<nav class="container-fluid">
|
||||||
<ul>
|
<ul>
|
||||||
@ -37,6 +38,9 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'event_search' %}">Rechercher {% picto_from_name "search" %}</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<details role="list" dir="rtl">
|
<details role="list" dir="rtl">
|
||||||
<summary aria-haspopup="listbox" role="link">Maintenant</summary>
|
<summary aria-haspopup="listbox" role="link">Maintenant</summary>
|
||||||
|
57
src/agenda_culturel/templates/agenda_culturel/search.html
Normal file
57
src/agenda_culturel/templates/agenda_culturel/search.html
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{% extends "agenda_culturel/page.html" %}
|
||||||
|
|
||||||
|
{% block title %}Rechercher un évnement{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<h1>Rechercher un événement</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
<form method="get" class="form django-form">
|
||||||
|
{% for field in filter.form %}
|
||||||
|
<div>
|
||||||
|
{{ field.errors }}
|
||||||
|
{{ field.label_tag }} {{ field }}
|
||||||
|
</div>
|
||||||
|
{% if forloop.first %}
|
||||||
|
<details>
|
||||||
|
<summary>Rechercher avancée</summary>
|
||||||
|
{% endif %}
|
||||||
|
{% if forloop.last %}
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<button type="submit">Rechercher</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
{% for obj in paginator_filter %}
|
||||||
|
<li><a href="{{ obj.get_absolute_url }}">{{ obj }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<footer>
|
||||||
|
<span>
|
||||||
|
{% if paginator_filter.has_previous %}
|
||||||
|
<a href="?page=1" role="button">« premier</a>
|
||||||
|
<a href="?page={{ paginator_filter.previous_page_number }}" role="button">précédent</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<span>
|
||||||
|
Page {{ paginator_filter.number }} sur {{ paginator_filter.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
{% if paginator_filter.has_next %}
|
||||||
|
<a href="?page={{ paginator_filter.next_page_number }}" role="button">suivant</a>
|
||||||
|
<a href="?page={{ paginator_filter.paginator.num_pages }}" role="button">dernier »</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -1,10 +1,11 @@
|
|||||||
from django import template
|
from django import template
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
from django.templatetags.static import static
|
|
||||||
from agenda_culturel.models import Event
|
from agenda_culturel.models import Event
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
|
from .utils_extra import picto_from_name
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
@register.filter
|
@register.filter
|
||||||
@ -25,12 +26,6 @@ def need_complete_display(event, display):
|
|||||||
return event.end_day and event.end_day != event.start_day and (event.start_time or event.end_time or display == "in list by day")
|
return event.end_day and event.end_day != event.start_day and (event.start_time or event.end_time or display == "in list by day")
|
||||||
|
|
||||||
|
|
||||||
def picto_from_name(name, datatooltip=""):
|
|
||||||
return mark_safe('<span data-tooltip="' + datatooltip + '"><svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' + \
|
|
||||||
'<use href="' + static("images/feather-sprite.svg") + '#' + name + '" />' + \
|
|
||||||
'</svg></span>')
|
|
||||||
|
|
||||||
|
|
||||||
@register.filter
|
@register.filter
|
||||||
def picto_status(event):
|
def picto_status(event):
|
||||||
if event.is_draft():
|
if event.is_draft():
|
||||||
|
@ -4,6 +4,7 @@ from django.utils.safestring import mark_safe
|
|||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from datetime import timedelta, date
|
from datetime import timedelta, date
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
from django.templatetags.static import static
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
@ -54,4 +55,10 @@ def calendar_classes(d, fixed_style):
|
|||||||
|
|
||||||
@register.filter
|
@register.filter
|
||||||
def url_day(d):
|
def url_day(d):
|
||||||
return reverse_lazy("day_view", kwargs={"year": d.year, "month": d.month, "day": d.day})
|
return reverse_lazy("day_view", kwargs={"year": d.year, "month": d.month, "day": d.day})
|
||||||
|
|
||||||
|
@register.simple_tag
|
||||||
|
def picto_from_name(name, datatooltip=""):
|
||||||
|
return mark_safe('<span data-tooltip="' + datatooltip + '"><svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' + \
|
||||||
|
'<use href="' + static("images/feather-sprite.svg") + '#' + name + '" />' + \
|
||||||
|
'</svg></span>')
|
||||||
|
@ -27,7 +27,8 @@ urlpatterns = [
|
|||||||
path('accounts/', include('django.contrib.auth.urls')),
|
path('accounts/', include('django.contrib.auth.urls')),
|
||||||
path("test_app/", include("test_app.urls")),
|
path("test_app/", include("test_app.urls")),
|
||||||
path("static-content/create", StaticContentCreateView.as_view(), name="create_static_content"),
|
path("static-content/create", StaticContentCreateView.as_view(), name="create_static_content"),
|
||||||
path("static-content/<int:pk>/edit", StaticContentUpdateView.as_view(), name="edit_static_content")
|
path("static-content/<int:pk>/edit", StaticContentUpdateView.as_view(), name="edit_static_content"),
|
||||||
|
path('rechercher/', event_search, name='event_search')
|
||||||
]
|
]
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
|
@ -401,3 +401,47 @@ def event_list(request):
|
|||||||
response = paginator.page(paginator.num_pages)
|
response = paginator.page(paginator.num_pages)
|
||||||
|
|
||||||
return render(request, 'agenda_culturel/list.html', {'filter': filter, 'paginator_filter': response})
|
return render(request, 'agenda_culturel/list.html', {'filter': filter, 'paginator_filter': response})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SearchEventFilter(django_filters.FilterSet):
|
||||||
|
tags = django_filters.CharFilter(lookup_expr='icontains')
|
||||||
|
title = django_filters.CharFilter(lookup_expr='contains')
|
||||||
|
location = django_filters.CharFilter(lookup_expr='contains')
|
||||||
|
description = django_filters.CharFilter(lookup_expr='contains')
|
||||||
|
start_day = django_filters.DateFromToRangeFilter(widget=django_filters.widgets.RangeWidget(attrs={'type': 'date'}))
|
||||||
|
|
||||||
|
q = django_filters.CharFilter(method='custom_filter', label=_("Search"))
|
||||||
|
|
||||||
|
o = django_filters.OrderingFilter(
|
||||||
|
# tuple-mapping retains order
|
||||||
|
fields=(
|
||||||
|
('title', 'title'),
|
||||||
|
('description', 'description'),
|
||||||
|
('start_day', 'start_day'),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
def custom_filter(self, queryset, name, value):
|
||||||
|
return queryset.filter(
|
||||||
|
Q(title__contains=value) | Q(location__contains=value) | Q(description__contains=value))
|
||||||
|
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Event
|
||||||
|
fields = ['q', 'title', 'location', 'description', 'category', 'tags', 'start_day']
|
||||||
|
|
||||||
|
|
||||||
|
def event_search(request):
|
||||||
|
filter = SearchEventFilter(request.GET, queryset=get_event_qs(request).order_by("-start_day"))
|
||||||
|
paginator = Paginator(filter.qs, 10)
|
||||||
|
page = request.GET.get('page')
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = paginator.page(page)
|
||||||
|
except PageNotAnInteger:
|
||||||
|
response = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
response = paginator.page(paginator.num_pages)
|
||||||
|
|
||||||
|
return render(request, 'agenda_culturel/search.html', {'filter': filter, 'paginator_filter': response})
|
||||||
|
Loading…
Reference in New Issue
Block a user