diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index 66bd2c3..d5ea35d 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -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:/", 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/", diff --git a/src/agenda_culturel/views/__init__.py b/src/agenda_culturel/views/__init__.py index 48dd34b..25a6309 100644 --- a/src/agenda_culturel/views/__init__.py +++ b/src/agenda_culturel/views/__init__.py @@ -9,3 +9,4 @@ from .moderation_views import * from .organisations_views import * from .places_views import * from .tag_views import * +from .search_views import * diff --git a/src/agenda_culturel/views/oldviews.py b/src/agenda_culturel/views/oldviews.py index 312cc50..4b76559 100644 --- a/src/agenda_culturel/views/oldviews.py +++ b/src/agenda_culturel/views/oldviews.py @@ -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() diff --git a/src/agenda_culturel/views/search_views.py b/src/agenda_culturel/views/search_views.py new file mode 100644 index 0000000..8bd38d8 --- /dev/null +++ b/src/agenda_culturel/views/search_views.py @@ -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)