from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.list import ListView
-from emissions.models import Emission, Episode, Format, NewsItem, SoundFile
+from emissions.models import Emission, Episode, Format, NewsCategory, NewsItem, SoundFile
from haystack.backends import EmptyResults
from haystack.constants import DJANGO_CT, DJANGO_ID, ID
from haystack.query import RelatedSearchQuerySet, SearchQuerySet
global_search = GlobalSearchView.as_view()
+
+
+class NewsItemSearchView(ListView):
+ template_name = 'news/search.html'
+ paginate_by = 20
+
+ def get_queryset(self):
+ qs = NewsItem.objects.all()
+ if self.request.GET.get('category'):
+ qs = qs.filter(category__slug=self.request.GET.get('category'))
+ if self.request.GET.get('q'):
+ vector = (
+ SearchVector('title', config=settings.FTS_DICTIONARY_CONFIG, weight='A')
+ + SearchVector('text', config=settings.FTS_DICTIONARY_CONFIG, weight='B')
+ + SearchVector('emission__title', config=settings.FTS_DICTIONARY_CONFIG, weight='C')
+ )
+ query = SearchQuery(self.request.GET.get('q', ''), config=settings.FTS_DICTIONARY_CONFIG)
+ qs = qs.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.1).order_by('-rank')
+ qs = qs.select_related()
+ qs = qs.order_by('-date')
+ return qs
+
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['categories'] = NewsCategory.objects.all()
+ context['selected_category'] = self.request.GET.get('category')
+ context['query'] = self.request.GET.get('q')
+ return context
+
+
+newsitems_search = NewsItemSearchView.as_view()
}
#search-form {
+ .newsitems-categories,
.soundfiles-formats {
margin: 2em 0;
display: flex;
--- /dev/null
+{% extends "news.html" %}
+{% load gadjo paniktags i18n %}
+{% block title %}{% trans 'News' %} - Archives{% endblock %}
+{% block nav %}{% endblock %}
+
+{% block main %}
+ <form method="get" action="." class="padded center" id="search-form">
+ <div class="big">
+ <input type="text" name="q" id="id_q" value="{{ request.GET.q|default:"" }}">
+ <button class="icon-search"><span class="sr-only">{% trans "Search" %}</span></button>
+ </div>
+
+ <div class="newsitems-categories">
+ {% for category in categories %}
+ <label><input type="radio" name="category" value="{{category.slug}}" {% if request.GET.category == category.slug %}checked{% endif %}><span>{{ category.title }}</span></label>
+ {% endfor %}
+ </div>
+ </form>
+ <script>
+document.querySelectorAll('.newsitems-categories input').forEach(function(input) {
+ input.was_checked = input.checked;
+ input.addEventListener('click', function(e) {
+ if (input.was_checked) {
+ input.checked = false;
+ input.was_checked = false;
+ } else {
+ document.querySelectorAll('.newsitems-categories input').forEach(function(input) { input.was_checked = false; });
+ input.was_checked = true;
+ }
+ $(document.getElementById('search-form')).trigger('submit');
+ });
+});
+ </script>
+
+<div class="wrapper">
+
+{% if not object_list %}
+ <div class="big error padded center">Manque de pot, pas de résultats à cette recherche !</div>
+{% else %}
+
+{% if page_obj.has_previous %}
+<div class="previous-page cf">
+<a class="button big left" href="{% querystring "page"=page_obj.previous_page_number %}">« Résultats précédénts</a>
+</div>
+{% endif %}
+
+ <div id="Emission-container" class="emission">
+ {% if page_obj.object_list %}
+ {% regroup page_obj.object_list by date|date:"F Y"|capfirst as month_list %}
+ <div>
+ {% for month in month_list %}
+ <div class="monthGroup {% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}">
+ <div class="legend button" onclick="$('#{{ month.grouper|slugify }}').toggle();"
+ >> {{ month.grouper }}</div>
+ <ul class="custom main-flex list" id="{{ month.grouper|slugify }}">
+ {% for result in month.list %}
+ <li>{% with result as content %}{% news_inline %}{% endwith %}</li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% endfor %}
+ </div>
+ {% endif %}
+ </div>
+
+
+
+{% if page_obj.has_next %}
+<div class="next-page cf">
+<a class="button big right" href="{% querystring "page"=page_obj.next_page_number %}">Résultats suivants »</a>
+</div>
+{% endif %}
+
+{% endif %}
+
+</div>
+
+{% endblock %}
re_path(
r'^%sagenda$' % settings.NEWSITEMS_PREFIX, RedirectView.as_view(pattern_name='agenda', permanent=True)
),
- re_path(r'^%sarchives/$' % settings.NEWSITEMS_PREFIX, search.newsArchives, name='newsArchives'),
+ re_path(
+ r'^%sarchives/$' % settings.NEWSITEMS_PREFIX,
+ search.newsArchives if settings.USE_HAYSTACK else search.newsitems_search,
+ name='newsArchives',
+ ),
re_path(r'^%s(?P<slug>[\w,-]+)$' % settings.NEWSITEMS_PREFIX, views.newsitemview, name='newsitem-view'),
path('party', views.party, name='party'),
path('recherche/', search.view if settings.USE_HAYSTACK else search.global_search, name='search'),