From 35610a430f50dae1d54ef1e2fed8e92a318b53e9 Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Sat, 25 Jan 2025 17:20:57 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20du=20r=C3=A9f=C3=A9rencemen?= =?UTF-8?q?t=20:=20-=20les=20cat=C3=A9gories=20sont=20dans=20l'url=20(pas?= =?UTF-8?q?=20dans=20les=20param=C3=A8tres)=20-=20le=20titre=20des=20pages?= =?UTF-8?q?=20contient=20l'info=20de=20cat=C3=A9gorie=20(et=20de=20lieu)?= =?UTF-8?q?=20-=20redirection=20des=20url=20pass=C3=A9es=20(limitation:=20?= =?UTF-8?q?on=20pass=20=C3=A0=20une=20seule=20cat=C3=A9gorie)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #281 --- src/agenda_culturel/filters.py | 38 +++++++++- src/agenda_culturel/models.py | 2 +- src/agenda_culturel/static/style.scss | 8 ++- .../templates/agenda_culturel/page-month.html | 55 ++++++++++---- .../agenda_culturel/page-upcoming.html | 68 ++++++++++++++---- .../templates/agenda_culturel/page-week.html | 55 +++++++++++--- .../templates/agenda_culturel/page.html | 8 ++- src/agenda_culturel/templatetags/cat_extra.py | 19 ++--- .../templatetags/utils_extra.py | 26 +++++-- src/agenda_culturel/urls.py | 29 ++++---- src/agenda_culturel/views.py | 72 +++++++++++++++---- 11 files changed, 297 insertions(+), 83 deletions(-) diff --git a/src/agenda_culturel/filters.py b/src/agenda_culturel/filters.py index a554975..93dd88d 100644 --- a/src/agenda_culturel/filters.py +++ b/src/agenda_culturel/filters.py @@ -4,7 +4,7 @@ from django import forms from django.contrib.postgres.search import SearchQuery, SearchHeadline from django.db.models import Count, Q from datetime import date, timedelta - +from urllib.parse import urlparse, parse_qs, urlencode from django.http import QueryDict from django.contrib.gis.measure import D @@ -116,6 +116,28 @@ class EventFilter(django_filters.FilterSet): self.form.fields["exclude_tags"].choices = Tag.get_tag_groups(exclude=True, nb_suggestions=0) self.form.fields["tags"].choices = Tag.get_tag_groups(include=True) + def has_category_parameters(self): + url = self.request.get_full_path() + return "category=" in url and not url.startswith("/cat:") + + def get_new_url(self): + url = self.request.get_full_path() + if url.startswith("/cat:"): + return url + else: + parsed_url = urlparse(url) + params = parse_qs(parsed_url.query) + if len(params['category']) == 0: + return url + else: + category = Category.objects.filter(pk=params['category'][0]).first() + del params["category"] + url = parsed_url._replace(query=urlencode(params, doseq=True)).geturl() + if category is None: + return url + else: + return "/cat:" + category.slug + url + def filter_recurrences(self, queryset, name, value): # construct the full lookup expression lookup = "__".join([name, "isnull"]) @@ -144,6 +166,20 @@ class EventFilter(django_filters.FilterSet): return parent.exclude(exact_location=False).filter(exact_location__location__distance_lt=(p, D(km=d))) + def has_location(self): + d = self.get_cleaned_data("radius") + p = self.get_cleaned_data("position") + if not isinstance(d, str) or not isinstance(p, ReferenceLocation): + return False + try: + d = float(d) + except ValueError: + return False + if d <= 0: + return False + + return True + def get_url(self): if isinstance(self.form.data, QueryDict): return self.form.data.urlencode() diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index ade56b7..2016802 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -178,7 +178,7 @@ class Category(models.Model): return "cat-" + str(self.id) def get_absolute_url(self): - return reverse('home') + '?catgory=' + str(self.pk) + return reverse('home_category', kwargs={"cat": self.slug}) def __str__(self): return self.name diff --git a/src/agenda_culturel/static/style.scss b/src/agenda_culturel/static/style.scss index f189cef..d867255 100644 --- a/src/agenda_culturel/static/style.scss +++ b/src/agenda_culturel/static/style.scss @@ -139,7 +139,7 @@ details[role="list"] summary + ul li.selected>a:hover { padding: 0.1em .2em; .titre { vertical-align: middle; - margin-right: .4em; + margin-right: .2em; } display: inline-block; margin: .1em 0; @@ -148,6 +148,12 @@ details[role="list"] summary + ul li.selected>a:hover { background: none; padding: 0.1em 0; } + .developpe { + svg { + margin-right: .5em; + vertical-align: middle; + } + } } .suggestions { diff --git a/src/agenda_culturel/templates/agenda_culturel/page-month.html b/src/agenda_culturel/templates/agenda_culturel/page-month.html index 1d52c97..891c464 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-month.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-month.html @@ -14,10 +14,13 @@ {% endblock %} {% block title %}{% block og_title %} +{% if category %}{{ category.name }} en{% endif %} {{ calendar.firstdate | date:"F o" }} {% endblock %}{% endblock %} -{% block ce_mois_ci_parameters %}{% block cette_semaine_parameters %}{% block a_venir_parameters %}?{{ filter.get_url }}{% endblock %}{% endblock %}{% endblock %} +{% block navigation-menu %} +{% navigation_links filter category %} +{% endblock %} {% block content %} @@ -26,16 +29,20 @@ {% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=0 %} {% with cache_timeout=user.is_authenticated|yesno:"30,600" %} - {% cache cache_timeout month user.is_authenticated calendar.firstdate filter.get_url %} + {% cache cache_timeout month user.is_authenticated calendar.firstdate category filter.get_url %}
-

{{ calendar.firstdate | date:"F o" }}

+

{% if category %}{{ category.name }} en {% endif %}{{ calendar.firstdate | date:"F o" }}{% if filter.has_location %} à {{ filter.get_position }}{% endif %}

{% if day.events %}
{% endfor %} - + {% endif %} @@ -134,19 +153,31 @@ {% if calendar.lastdate|shift_day:+1|not_after_last %} {% if calendar.lastdate|not_before_first %} + {% if category %} + + {% else %} {% endif %} {% endif %} + {% endif %} {% endcache %} diff --git a/src/agenda_culturel/templates/agenda_culturel/page-upcoming.html b/src/agenda_culturel/templates/agenda_culturel/page-upcoming.html index 3ae0bf8..2348b9e 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-upcoming.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-upcoming.html @@ -13,7 +13,9 @@ {% endblock %} -{% block ce_mois_ci_parameters %}{% block cette_semaine_parameters %}{% block a_venir_parameters %}?{{ filter.get_url }}{% endblock %}{% endblock %}{% endblock %} +{% block navigation-menu %} +{% navigation_links filter category %} +{% endblock %} {% block body-class %}a-venir{% endblock %} @@ -23,25 +25,30 @@

{% block title %}{% block og_title %} + {% if category %}{{ category.name }}{% else %}Événements{% endif %} {% if calendar.calendar_days_list.0.is_today %} - Événements à venir + à venir {% else %} - Événements du {{ calendar.calendar_days_list.0.date| date:"l j F Y" }} + du {{ calendar.calendar_days_list.0.date| date:"l j F Y" }} {% if calendar.calendar_days_list|length > 1 %} et suivants {% endif %} - {% endif %} + {% endif %}{% if filter.has_location %} à {{ filter.get_position }}{% endif %} {% endblock %}{% endblock %}

{% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=1 %} {% with cache_timeout=user.is_authenticated|yesno:"30,600" %} - {% cache cache_timeout upcoming user.is_authenticated calendar.firstdate filter.get_url calendar.calendar_days_list|length %} + {% cache cache_timeout upcoming user.is_authenticated calendar.firstdate filter.get_url category calendar.calendar_days_list|length %}