Séparation des vues recherche
This commit is contained in:
parent
650678b1f3
commit
001a1652bd
@ -90,6 +90,9 @@ from .views import (
|
||||
UnknownPlaceAddView,
|
||||
UnknownPlacesListView,
|
||||
fix_unknown_places,
|
||||
# Search
|
||||
event_search,
|
||||
event_search_full,
|
||||
# TODO pas encore trié
|
||||
week_view,
|
||||
month_view,
|
||||
@ -107,8 +110,6 @@ from .views import (
|
||||
StaticContentUpdateView,
|
||||
MessageCreateView,
|
||||
EventCreateView,
|
||||
event_search,
|
||||
event_search_full,
|
||||
update_from_source,
|
||||
change_status_event,
|
||||
EventDeleteView,
|
||||
@ -354,6 +355,9 @@ urlpatterns = [
|
||||
fix_unknown_places,
|
||||
name="fix_unknown_places",
|
||||
),
|
||||
# Search
|
||||
path("rechercher", event_search, name="event_search"),
|
||||
path("rechercher/complet/", event_search_full, name="event_search_full"),
|
||||
# TODO pas encore trié
|
||||
path("cat:<cat>/", home, name="home_category"),
|
||||
path(
|
||||
@ -464,8 +468,6 @@ urlpatterns = [
|
||||
StaticContentUpdateView.as_view(),
|
||||
name="edit_static_content",
|
||||
),
|
||||
path("rechercher", event_search, name="event_search"),
|
||||
path("rechercher/complet/", event_search_full, name="event_search_full"),
|
||||
path("contact", MessageCreateView.as_view(), name="contact"),
|
||||
path(
|
||||
"message/<int:pk>",
|
||||
|
@ -9,3 +9,4 @@ from .moderation_views import *
|
||||
from .organisations_views import *
|
||||
from .places_views import *
|
||||
from .tag_views import *
|
||||
from .search_views import *
|
||||
|
@ -14,7 +14,7 @@ from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.core.cache import cache
|
||||
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
|
||||
from django.db.models import Aggregate, FloatField
|
||||
from django.db.models import F, Func, OuterRef, Q, Subquery
|
||||
from django.db.models import F, OuterRef, Q, Subquery
|
||||
from django.http import (
|
||||
HttpResponse,
|
||||
HttpResponseForbidden,
|
||||
@ -45,8 +45,6 @@ from ..celery import (
|
||||
from ..filters import (
|
||||
EventFilter,
|
||||
EventFilterAdmin,
|
||||
SearchEventFilter,
|
||||
SimpleSearchEventFilter,
|
||||
)
|
||||
from ..forms import (
|
||||
EventForm,
|
||||
@ -69,7 +67,6 @@ from ..models import (
|
||||
Place,
|
||||
RecurrentImport,
|
||||
StaticContent,
|
||||
remove_accents,
|
||||
UserProfile,
|
||||
)
|
||||
|
||||
@ -1109,101 +1106,6 @@ def recent(request):
|
||||
)
|
||||
|
||||
|
||||
def event_search(request, full=False):
|
||||
categories = None
|
||||
tags = None
|
||||
places = None
|
||||
organisations = None
|
||||
rimports = None
|
||||
|
||||
qs = get_event_qs(request).order_by("-start_day")
|
||||
if not request.user.is_authenticated:
|
||||
qs = qs.filter(
|
||||
(
|
||||
Q(other_versions__isnull=True)
|
||||
| Q(other_versions__representative=F("pk"))
|
||||
| Q(other_versions__representative__isnull=True)
|
||||
)
|
||||
)
|
||||
if full:
|
||||
filter = SearchEventFilter(
|
||||
request.GET,
|
||||
queryset=qs,
|
||||
request=request,
|
||||
)
|
||||
else:
|
||||
filter = SimpleSearchEventFilter(
|
||||
request.GET,
|
||||
queryset=qs,
|
||||
request=request,
|
||||
)
|
||||
if "q" in request.GET:
|
||||
categories = Category.objects.filter(name__icontains=request.GET["q"])
|
||||
s_q = remove_accents(request.GET["q"].lower())
|
||||
tags = (
|
||||
Event.objects.extra(
|
||||
where=["%s ILIKE ANY (tags)"], params=[request.GET["q"]]
|
||||
)
|
||||
.annotate(arr_tags=Func(F("tags"), function="unnest"))
|
||||
.values_list("arr_tags", flat=True)
|
||||
.distinct()
|
||||
)
|
||||
tags = [
|
||||
(
|
||||
t,
|
||||
emoji.demojize(remove_accents(t).lower(), delimiters=("000", "")),
|
||||
)
|
||||
for t in tags
|
||||
]
|
||||
tags = [t for t in tags if s_q == t[1]]
|
||||
tags.sort(key=lambda x: x[1])
|
||||
tags = [t[0] for t in tags]
|
||||
places = Place.objects.filter(
|
||||
Q(name__icontains=request.GET["q"])
|
||||
| Q(description__icontains=request.GET["q"])
|
||||
| Q(city__icontains=request.GET["q"])
|
||||
)
|
||||
organisations = Organisation.objects.filter(
|
||||
Q(name__icontains=request.GET["q"])
|
||||
| Q(description__icontains=request.GET["q"])
|
||||
)
|
||||
if request.user.is_authenticated:
|
||||
rimports = RecurrentImport.objects.filter(
|
||||
name__icontains=request.GET["q"]
|
||||
)
|
||||
|
||||
paginator = PaginatorFilter(filter, 10, request)
|
||||
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,
|
||||
"categories": categories,
|
||||
"tags": tags,
|
||||
"places": places,
|
||||
"organisations": organisations,
|
||||
"rimports": rimports,
|
||||
"has_results": len(request.GET) != 0
|
||||
or (len(request.GET) > 1 and "page" in request.GET),
|
||||
"paginator_filter": response,
|
||||
"full": full,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def event_search_full(request):
|
||||
return event_search(request, True)
|
||||
|
||||
|
||||
def clear_cache(request):
|
||||
if request.method == "POST":
|
||||
cache.clear()
|
||||
|
111
src/agenda_culturel/views/search_views.py
Normal file
111
src/agenda_culturel/views/search_views.py
Normal file
@ -0,0 +1,111 @@
|
||||
import emoji
|
||||
from django.core.paginator import PageNotAnInteger, EmptyPage
|
||||
from django.shortcuts import render
|
||||
|
||||
from . import PaginatorFilter
|
||||
from ..filters import SearchEventFilter, SimpleSearchEventFilter
|
||||
from ..models import (
|
||||
Category,
|
||||
remove_accents,
|
||||
Event,
|
||||
Place,
|
||||
Organisation,
|
||||
RecurrentImport,
|
||||
)
|
||||
from ..views import get_event_qs
|
||||
from django.db.models import Q, F, Func
|
||||
|
||||
|
||||
def event_search(request, full=False):
|
||||
categories = None
|
||||
tags = None
|
||||
places = None
|
||||
organisations = None
|
||||
rimports = None
|
||||
|
||||
qs = get_event_qs(request).order_by("-start_day")
|
||||
if not request.user.is_authenticated:
|
||||
qs = qs.filter(
|
||||
(
|
||||
Q(other_versions__isnull=True)
|
||||
| Q(other_versions__representative=F("pk"))
|
||||
| Q(other_versions__representative__isnull=True)
|
||||
)
|
||||
)
|
||||
if full:
|
||||
filter = SearchEventFilter(
|
||||
request.GET,
|
||||
queryset=qs,
|
||||
request=request,
|
||||
)
|
||||
else:
|
||||
filter = SimpleSearchEventFilter(
|
||||
request.GET,
|
||||
queryset=qs,
|
||||
request=request,
|
||||
)
|
||||
if "q" in request.GET:
|
||||
categories = Category.objects.filter(name__icontains=request.GET["q"])
|
||||
s_q = remove_accents(request.GET["q"].lower())
|
||||
tags = (
|
||||
Event.objects.extra(
|
||||
where=["%s ILIKE ANY (tags)"], params=[request.GET["q"]]
|
||||
)
|
||||
.annotate(arr_tags=Func(F("tags"), function="unnest"))
|
||||
.values_list("arr_tags", flat=True)
|
||||
.distinct()
|
||||
)
|
||||
tags = [
|
||||
(
|
||||
t,
|
||||
emoji.demojize(remove_accents(t).lower(), delimiters=("000", "")),
|
||||
)
|
||||
for t in tags
|
||||
]
|
||||
tags = [t for t in tags if s_q == t[1]]
|
||||
tags.sort(key=lambda x: x[1])
|
||||
tags = [t[0] for t in tags]
|
||||
places = Place.objects.filter(
|
||||
Q(name__icontains=request.GET["q"])
|
||||
| Q(description__icontains=request.GET["q"])
|
||||
| Q(city__icontains=request.GET["q"])
|
||||
)
|
||||
organisations = Organisation.objects.filter(
|
||||
Q(name__icontains=request.GET["q"])
|
||||
| Q(description__icontains=request.GET["q"])
|
||||
)
|
||||
if request.user.is_authenticated:
|
||||
rimports = RecurrentImport.objects.filter(
|
||||
name__icontains=request.GET["q"]
|
||||
)
|
||||
|
||||
paginator = PaginatorFilter(filter, 10, request)
|
||||
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,
|
||||
"categories": categories,
|
||||
"tags": tags,
|
||||
"places": places,
|
||||
"organisations": organisations,
|
||||
"rimports": rimports,
|
||||
"has_results": len(request.GET) != 0
|
||||
or (len(request.GET) > 1 and "page" in request.GET),
|
||||
"paginator_filter": response,
|
||||
"full": full,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def event_search_full(request):
|
||||
return event_search(request, True)
|
Loading…
x
Reference in New Issue
Block a user