On fait des suggestions en cas d'événement inconnu

Fix #379
This commit is contained in:
Jean-Marie Favreau 2025-03-30 15:51:19 +02:00
parent 98a13aee35
commit 5353b0d68e
4 changed files with 106 additions and 1 deletions

View File

@ -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): def proposed_events(self):
threshold_distance = 30000 threshold_distance = 30000
min_tags = 1 min_tags = 1

View File

@ -1319,7 +1319,9 @@ table .buttons {
margin: 0 1em; margin: 0 1em;
img { img {
width: 100%; 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; margin-bottom: 1em;
} }
.first-large .slim-description:first-child {
@extend article;
font-size: 110%;
}

View File

@ -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 %}
<article>
<header>
<h1>On a pommé l'événement</h1>
</header>
<div class="image-flottante">
<img src="{% static 'images/pommes.svg' %}"
alt="quelques pommes et leur pépins" />
</div>
<p>
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.
</p>
<div class="first-large">
{% for pe in alternative_events %}
{% include "agenda_culturel/single-event/event-slim-inc.html" with event=pe %}
{% endfor %}
</div>
</article>
<article class="search" id="search">
<header>
<h2>Rien trouvé&nbsp;?</h2>
<p>Si tu n'as pas trouvé ton bonheur dans toutes ces pages, tu peux aussi fouiller le site&nbsp;:</p>
</header>
<form method="get" class="form django-form">
{{ filter.form.as_div }}
<button type="submit">Rechercher</button>
<a href="{% url 'event_search' %}">Recherche simplifiée {% picto_from_name "chevron-right" %}</a>
</form>
</div>
</div>
</article>
{% endblock %}

View File

@ -767,6 +767,34 @@ class EventDetailView(UserPassesTestMixin, DetailView, ModelFormMixin):
else: else:
return o 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): def get_success_url(self):
return self.get_object().get_absolute_url() + "#chronology" return self.get_object().get_absolute_url() + "#chronology"