diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index b461a25..8605ceb 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -1053,6 +1053,28 @@ class Event(models.Model): ), ] + def alternative_events_if_not_found(day, slug): + title = slug.replace("-", " ") + logger.warning(title) + qs = ( + Event.objects.filter( + Q(other_versions__isnull=True) + | Q(other_versions__representative=F("pk")) + | Q(other_versions__representative__isnull=True) + ) + .filter(status=Event.STATUS.PUBLISHED) + .annotate(similarity_title=TrigramSimilarity("title", title)) + .annotate( + nbday_distance=Func((ExtractDay(F("start_day") - day)), function="ABS") + ) + .annotate( + score=F("similarity_title") * 200 + 30 / (F("nbday_distance") + 1) + ) + .order_by("-score")[:10] + ) + + return qs.only("title", "start_day", "start_time", "exact_location", "location") + def proposed_events(self): threshold_distance = 30000 min_tags = 1 diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index 03d70ac..5884382 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -1319,7 +1319,9 @@ table .buttons { margin: 0 1em; img { width: 100%; - margin: -4em 0 0 0; + @media only screen and (min-width: 512px) { + margin: -4em 0 0 0; + } } } @@ -2186,3 +2188,8 @@ dialog { } margin-bottom: 1em; } + +.first-large .slim-description:first-child { + @extend article; + font-size: 110%; +} diff --git a/src/agenda_culturel/templates/page-event-not-found.html b/src/agenda_culturel/templates/page-event-not-found.html new file mode 100644 index 0000000..d69cb9f --- /dev/null +++ b/src/agenda_culturel/templates/page-event-not-found.html @@ -0,0 +1,48 @@ +{% extends "agenda_culturel/page.html" %} +{% load i18n %} +{% load static %} +{% load utils_extra %} +{% load static_content_extra %} +{% block fluid %}{% endblock %} +{% block title %} + {% block og_title %}On a pommé l'événement{% endblock %} +{% endblock %} +{% block description %} + {% block og_description %}On a rencontré un pépin en cherchant l'événement que tu as demandé !{% endblock %} +{% endblock %} +{% block og_image %} + {% static 'images/pommes.svg' %} +{% endblock %} +{% block content %} +
+
+

On a pommé l'événement

+
+
+ quelques pommes et leur pépins +
+

+ On a rencontré un pépin en cherchant l'événement que tu as demandé. Mais pas de panique, on a regardé un peu + dans nos paniers, et on te propose quelques événements qui pourraient correspondre à ta recherche. +

+
+ {% for pe in alternative_events %} + {% include "agenda_culturel/single-event/event-slim-inc.html" with event=pe %} + {% endfor %} +
+
+ +{% endblock %} diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index cabf0ae..195ee1e 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -767,6 +767,34 @@ class EventDetailView(UserPassesTestMixin, DetailView, ModelFormMixin): else: return o + def get(self, request, *args, **kwargs): + try: + self.object = self.get_object() + except Http404 as e: + if "year" in self.kwargs: + y = self.kwargs["year"] + m = self.kwargs["month"] + d = self.kwargs["day"] + day = date(y, m, d) + s = self.kwargs["extra"] + qs = get_event_qs(request) + filter = SimpleSearchEventFilter( + request.GET, + queryset=qs, + request=request, + ) + context = { + "alternative_events": Event.alternative_events_if_not_found(day, s), + "filter": filter, + } + return render( + request, "page-event-not-found.html", status=404, context=context + ) + else: + raise e + context = self.get_context_data(object=self.object) + return self.render_to_response(context) + def get_success_url(self): return self.get_object().get_absolute_url() + "#chronology"