Amélioration du référencement :

- les catégories sont dans l'url (pas dans les paramètres)
- le titre des pages contient l'info de catégorie (et de lieu)
- redirection des url passées (limitation: on pass à une seule catégorie)

Fix #281
This commit is contained in:
Jean-Marie Favreau 2025-01-25 17:20:57 +01:00
parent 1774e409d0
commit 35610a430f
11 changed files with 297 additions and 83 deletions

View File

@ -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()

View File

@ -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

View File

@ -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 {

View File

@ -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 %}
<article>
<header>
<div class="title small"><h1>{{ calendar.firstdate | date:"F o" }}</h1></div>
<div class="title small"><h1>{% if category %}{{ category.name }} en {% endif %}{{ calendar.firstdate | date:"F o" }}{% if filter.has_location %} à {{ filter.get_position }}{% endif %}</h1></div>
<div class="navigation">
<div>
{% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %}
{% if category %}
<a role="button" href="{% url 'month_view_category' category.slug calendar.previous_month.year calendar.previous_month.month %}?{{ filter.get_url }}">
{% else %}
<a role="button" href="{% url 'month_view' calendar.previous_month.year calendar.previous_month.month %}?{{ filter.get_url }}">
{% endif %}
{% picto_from_name "chevron-left" %} précédent</a>
</div>
{% endif %}
@ -43,7 +50,11 @@
{% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %}
<div class="right">
{% if category %}
<a role="button" href="{% url 'month_view_category' category.slug calendar.next_month.year calendar.next_month.month %}?{{ filter.get_url }}">suivant
{% else %}
<a role="button" href="{% url 'month_view' calendar.next_month.year calendar.next_month.month %}?{{ filter.get_url }}">suivant
{% endif %}
{% picto_from_name "chevron-right" %}
</a>
</div>
@ -55,15 +66,23 @@
<div class="slider-button slider-button-inside button-left hidden">{% picto_from_name "arrow-left" %}</div>
{% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %}
{% if category %}
<div class="slider-button slider-button-page button-left hidden"><a href="{% url 'month_view_category' category.slug calendar.previous_month.year calendar.previous_month.month %}?{{ filter.get_url }}">{% picto_from_name "chevrons-left" %}</a></div>
{% else %}
<div class="slider-button slider-button-page button-left hidden"><a href="{% url 'month_view' calendar.previous_month.year calendar.previous_month.month %}?{{ filter.get_url }}">{% picto_from_name "chevrons-left" %}</a></div>
{% endif %}
{% endif %}
{% endif %}
<div class="grid week-in-month">
{% for day in calendar.calendar_days_list %}
{% if forloop.counter0|divisibleby:7 %}
{% if not forloop.first %}</div><div class="grid week-in-month">{% endif %}
<div id="week-{{ day.date.isocalendar.1 }}" class="entete-semaine"><h2><a href="{% url 'week_view' calendar.year day.week %}?{{ filter.get_url }}">Semaine {{ d.week }}</a></h2></div>
{% if category %}
<div id="week-{{ day.date.isocalendar.1 }}" class="entete-semaine"><h2><a href="{% url 'week_view_category' category.slug calendar.year day.week %}?{{ filter.get_url }}">Semaine {{ d.week }}</a></h2></div>
{% else %}
<div id="week-{{ day.date.isocalendar.1 }}" class="entete-semaine"><h2><a href="{% url 'week_view' calendar.year day.week %}?{{ filter.get_url }}">Semaine {{ d.week }}</a></h2></div>
{% endif %}
{% endif %}
@ -84,13 +103,13 @@
</script>
{% endif %}
<header{% if day.is_today %} id="today"{% endif %}>
<h3><a href="{{ day.date | url_day }}?{{ filter.get_url }}" class="visible-link">{{ day.date | date:"l j" }}</a></h3}>
<h3><a href="{{ day.date | url_day:category }}?{{ filter.get_url }}" class="visible-link">{{ day.date | date:"l j" }}</a></h3}>
</header>
{% if day.events %}
<ul>
{% for category, events in day.events_by_category_ordered %}
{% for category_group, events in day.events_by_category_ordered %}
<li>{{ events.0.category | circle_cat }}
<a href="{{ day.date | url_day }}?{{ filter.get_url|add_url_category:events.0.category }}" data-target="{{ daytag }}-category-{{ events.0.category.pk }}" onClick="toggleModal(event)">{{ events | length }} {{ category }}</a></li>
<a href="{{ day.date | url_day:category }}?{{ filter.get_url|add_url_category:events.0.category }}" data-target="{{ daytag }}-category-{{ events.0.category.pk }}" onClick="toggleModal(event)">{{ events | length }} {{ category_group }}</a></li>
<dialog id="{{ daytag }}-category-{{ events.0.category.pk }}">
<article>
<header>
@ -113,7 +132,7 @@
</ul>
<footer>
<div class="buttons">
<a href="{{ day.date | url_day }}?{{ filter.get_url }}" role="button">Voir la journée <svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<a href="{{ day.date | url_day:category }}?{{ filter.get_url }}" role="button">Voir la journée <svg width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<use href="{% static 'images/feather-sprite.svg' %}#chevron-right" />
</svg></a>
</div>
@ -121,7 +140,7 @@
</article>
</dialog>
{% endfor %}
<li class="detail-link"><a href="{{ day.date | url_day }}?{{ filter.get_url }}" class="visible-link">voir en détail {% picto_from_name "chevrons-right" %}</a></li>
<li class="detail-link"><a href="{{ day.date | url_day:category }}?{{ filter.get_url }}" class="visible-link">voir en détail {% picto_from_name "chevrons-right" %}</a></li>
</ul>
{% endif %}
</ul>
@ -134,19 +153,31 @@
</div>
{% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %}
{% if category %}
<div class="slider-button slider-button-page button-right hidden"><a href="{% url 'month_view_category' category.slug calendar.next_month.year calendar.next_month.month %}?{{ filter.get_url }}">{% picto_from_name "chevrons-right" %}</a></div>
{% else %}
<div class="slider-button slider-button-page button-right hidden"><a href="{% url 'month_view' calendar.next_month.year calendar.next_month.month %}?{{ filter.get_url }}">{% picto_from_name "chevrons-right" %}</a></div>
{% endif %}
{% endif %}
{% endif %}
<div class="slider-button slider-button-inside button-right hidden">{% picto_from_name "arrow-right" %}</div>
</div>
<footer>
{% if category %}
{% if calendar.today_in_calendar %}
<a role="button" href="{% url 'aujourdhui_category' category.slug %}?{{ filter.get_url }}">Aujourd'hui</a>
<a role="button" href="{% url 'cette_semaine_category' category.slug %}?{{ filter.get_url }}">Cette semaine</a>
{% endif %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical_category' category.slug %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% else %}
{% if calendar.today_in_calendar %}
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
<a role="button" href="{% url 'cette_semaine' %}?{{ filter.get_url }}">Cette semaine</a>
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
<a role="button" href="{% url 'cette_semaine' %}?{{ filter.get_url }}">Cette semaine</a>
{% endif %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% endif %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
</footer>
</article>
{% endcache %}

View File

@ -13,7 +13,9 @@
<script src="{% static 'js/modal.js' %}"></script>
{% 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 @@
<article id="filters">
<header><h1 id="index-avenir">{% 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 %}</h1></header>
{% 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 %}
<footer>
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour' date_pred.year date_pred.month date_pred.day %}{% endif %}" aria-label="dates précédentes" role="button">
{% picto_from_name "chevrons-left" %}
{% if category %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view_category' category.slug date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour_category' category.slug date_pred.year date_pred.month date_pred.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates précédentes" role="button">
{% else %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour' date_pred.year date_pred.month date_pred.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates précédentes" role="button">
{% endif %}
{% picto_from_name "chevrons-left" %}
{% if calendar.calendar_days_list|length == 1 %}
{{ date_pred }}
{% endif %}
@ -59,7 +66,11 @@
{% picto_from_name "chevrons-down" %}</a>
{% endfor %}
{% endif %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour' date_next.year date_next.month date_next.day %}{% endif %}" aria-label="dates suivantes" role="button">
{% if category %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view_category' category.slug date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour_category' category.slug date_next.year date_next.month date_next.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates suivantes" role="button">
{% else %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour' date_next.year date_next.month date_next.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates suivantes" role="button">
{% endif %}
{% if calendar.calendar_days_list|length == 1 %}
{{ date_next }}
{% endif %}
@ -138,25 +149,56 @@
{% endfor %}
<article>
<header><h2>Voir aussi</h2></header>
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour' date_pred.year date_pred.month date_pred.day %}{% endif %}" aria-label="dates précédentes" role="button">
{% if category %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view_category' category.slug date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour_category' category.slug date_pred.year date_pred.month date_pred.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates précédentes" role="button">
{% else %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_pred.year date_pred.month date_pred.day %}{% else %}{% url 'a_venir_jour' date_pred.year date_pred.month date_pred.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates précédentes" role="button">
{% endif %}
{% picto_from_name "chevrons-left" %}
{% if calendar.calendar_days_list|length == 1 %}
{{ date_pred }}
{% endif %}
</a>
{% if calendar.today_in_calendar %}
{% if category %}
<a role="button" href="{% url 'aujourdhui_category' category.slug %}?{{ filter.get_url }}">Aujourd'hui</a>
{% else %}
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
{% endif %}
{% endif %}
{% if calendar.calendar_days_list|length == 1 %}
{% if category %}
<a role="button" href="{% url 'a_venir_jour_category' category.slug day.year day.month day.day %}?{{ filter.get_url }}">Autour du {{ day }}</a>
{% else %}
<a role="button" href="{% url 'a_venir_jour' day.year day.month day.day %}?{{ filter.get_url }}">Autour du {{ day }}</a>
{% endif %}
<a role="button" href="{% url 'week_view' calendar.firstdate.year calendar.firstdate|week %}?{{ filter.get_url }}">Semaine du {{ calendar.firstdate }}</a>
<a role="button" href="{% url 'month_view' calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% endif %}
{% if category %}
<a role="button" href="{% url 'week_view_category' category.slug calendar.firstdate.year calendar.firstdate|week %}?{{ filter.get_url }}">Semaine du {{ calendar.firstdate }}</a>
<a role="button" href="{% url 'month_view_category' category.slug calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% else %}
<a role="button" href="{% url 'week_view' calendar.firstdate.year calendar.firstdate|week %}?{{ filter.get_url }}">Semaine du {{ calendar.firstdate }}</a>
<a role="button" href="{% url 'month_view' calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% endif %}
{% if calendar.firstdate.month != calendar.lastdate.month %}
{% if category %}
<a role="button" href="{% url 'month_view' calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% else %}
<a role="button" href="{% url 'month_view_category' category.slug calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% endif %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour' date_next.year date_next.month date_next.day %}{% endif %}" aria-label="dates suivantes" role="button">
{% endif %}
{% if category %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical_category' category.slug %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% else %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% endif %}
{% if category %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view_category' category.slug date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour_category' category.slug date_next.year date_next.month date_next.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates suivantes" role="button">
{% else %}
<a href="{% if calendar.calendar_days_list|length == 1 %}{% url 'day_view' date_next.year date_next.month date_next.day %}{% else %}{% url 'a_venir_jour' date_next.year date_next.month date_next.day %}{% endif %}?{{ filter.get_url }}" aria-label="dates suivantes" role="button">
{% endif %}
{% if calendar.calendar_days_list|length == 1 %}
{{ date_next }}
{% endif %}

View File

@ -14,9 +14,12 @@
<script src="{% static 'js/calendar-buttons.js' %}"></script>
{% endblock %}
{% block title %}{% block og_title %}{% if calendar.today_in_calendar %}Sorties culturelles cette semaine à Clermont-Ferrand et aux environs{% else %}Semaine du {{ calendar.firstdate|date|frdate }}{% endif %}{% endblock %}{% endblock %}
{% block title %}{% block og_title %}{% if calendar.today_in_calendar %}{% if category %}{{ category.name }}{% else %}Sorties culturelles{% endif %} cette semaine à Clermont-Ferrand et aux environs{% else %}{% if category %}{{ category.name }} la semaine{% else %}Semaine{% endif %} du {{ calendar.firstdate|date|frdate }}{% endif %}{% 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 %}
@ -29,23 +32,31 @@
<header>
<div class="title small"><h1>
{% if calendar.today_in_calendar %}
Cette semaine
{% if category %}{{ category.name }} cette semaine{% else %}Cette semaine{% endif %}
{% else %}
semaine du {{ calendar.firstdate |date:"j F"|frdate }}
{% endif %}</h1></div>
{% if category %}{{ category.name }} la {% endif %}semaine du {{ calendar.firstdate |date:"j F"|frdate }}
{% endif %}{% if filter.has_location %}à {{ filter.get_position }}{% endif %}</h1></div>
<div class="navigation">
<div>
{% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %}
{% if category %}
<a role="button" href="{% url 'week_view_category' category.slug calendar.previous_week|weekyear calendar.previous_week|week %}?{{ filter.get_url }}">
{% else %}
<a role="button" href="{% url 'week_view' calendar.previous_week|weekyear calendar.previous_week|week %}?{{ filter.get_url }}">
{% picto_from_name "chevron-left" %} précédente</a>
{% endif %}
{% picto_from_name "chevron-left" %} précédente</a>
{% endif %}
{% endif %}
</div>
{% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %}
<div class="right">
<a role="button" href="{% url 'week_view' calendar.next_week|weekyear calendar.next_week|week %}?{{ filter.get_url }}">suivante
{% if category %}
<a role="button" href="{% url 'week_view_category' category.slug calendar.next_week|weekyear calendar.next_week|week %}?{{ filter.get_url }}">suivante
{% else %}
<a role="button" href="{% url 'week_view' calendar.next_week|weekyear calendar.next_week|week %}?{{ filter.get_url }}">suivante
{% endif %}
{% picto_from_name "chevron-right" %}
</a>
</div>
@ -57,9 +68,13 @@
<div class="slider-button slider-button-inside button-left hidden">{% picto_from_name "arrow-left" %}</div>
{% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %}
{% if category %}
<div class="slider-button slider-button-page button-left hidden"><a href="{% url 'week_view_category' category.slug calendar.previous_week|weekyear calendar.previous_week|week %}?{{ filter.get_url }}">{% picto_from_name "chevrons-left" %}</a></div>
{% else %}
<div class="slider-button slider-button-page button-left hidden"><a href="{% url 'week_view' calendar.previous_week|weekyear calendar.previous_week|week %}?{{ filter.get_url }}">{% picto_from_name "chevrons-left" %}</a></div>
{% endif %}
{% endif %}
{% endif %}
<div class="grid">
{% for day in calendar.calendar_days_list %}
@ -173,22 +188,42 @@
<div class="slider-button slider-button-inside button-right hidden">{% picto_from_name "arrow-right" %}</div>
{% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %}
{% if category %}
<div class="slider-button slider-button-page button-right hidden"><a href="{% url 'week_view_category' category.slug calendar.next_week|weekyear calendar.next_week|week %}?{{ filter.get_url }}">{% picto_from_name "chevrons-right" %}</a></div>
{% else %}
<div class="slider-button slider-button-page button-right hidden"><a href="{% url 'week_view' calendar.next_week|weekyear calendar.next_week|week %}?{{ filter.get_url }}">{% picto_from_name "chevrons-right" %}</a></div>
{% endif %}
{% endif %}
{% endif %}
</div>
<footer>
{% if calendar.today_in_calendar %}
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
{% if category %}
<a role="button" href="{% url 'aujourdhui_category' category.slug %}?{{ filter.get_url }}">Aujourd'hui</a>
{% else %}
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
{% endif %}
{% endif %}
{% if category %}
<a role="button" href="{% url 'month_view_category' category.slug calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% else %}
<a role="button" href="{% url 'month_view' calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% endif %}
<a role="button" href="{% url 'month_view' calendar.firstdate.year calendar.firstdate.month %}?{{ filter.get_url }}">{{ calendar.firstdate | date:"F o" }}</a>
{% if calendar.firstdate.month != calendar.lastdate.month %}
{% if category %}
<a role="button" href="{% url 'month_view_category' category.slug calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% else %}
<a role="button" href="{% url 'month_view' calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% endif %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% endif %}
{% if category %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical_category' category.slug %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% else %}
<a role="button" data-tooltip="Copiez ce lien et importez-le dans votre agenda" href="{% url 'export_ical' %}?{{ filter.get_url }}">Export ical {% picto_from_name "calendar" %}</a>
{% endif %}
</footer>
</article>
{% endcache %}

View File

@ -52,9 +52,11 @@
<ul class="menu">
{% block ajouter-menu %}<li id="menu-ajouter" class="ajouter-bouton"><a href="{% url 'add_event' %}">Ajouter un événement {% picto_from_name "plus-circle" %}</a></li>{% endblock %}
{% block rechercher-menu %}<li id="menu-rechercher" class="rechercher-bouton"><a href="{% url 'event_search' %}">Rechercher {% picto_from_name "search" %}</a></li>{% endblock %}
<li><a href="{% url 'a_venir' %}{% block a_venir_parameters %}{% endblock %}">Maintenant</a></li>
<li><a href="{% url 'cette_semaine' %}{% block cette_semaine_parameters %}{% endblock %}">Cette semaine</a></li>
<li><a href="{% url 'ce_mois_ci' %}{% block ce_mois_ci_parameters %}{% endblock %}">Ce mois-ci</a></li>
{% block navigation-menu %}
<li><a href="{% url 'a_venir' %}">Maintenant</a></li>
<li><a href="{% url 'cette_semaine' %}">Cette semaine</a></li>
<li><a href="{% url 'ce_mois_ci' %}">Ce mois-ci</a></li>
{% endblock%}
</ul>
</div>
<nav class="container-fluid">

View File

@ -217,21 +217,14 @@ def legend_cat(category, url, selected=True, first=False, with_title=False):
c = category.css_class()
n = category.name
class_reduced = '' if selected else 'reduced'
if first:
prefix = ""
else:
if selected:
prefix = "retirer "
else:
prefix = "ajouter "
if category.pictogram:
result = '<span class="cat ' + class_reduced + ' ' + c + ' circ-cat circ-large" data-tooltip="' + prefix + n + '">' + '<img src="' + category.pictogram.url + '" alt="' + category.name + '" /></span>'
result = '<span class="cat ' + class_reduced + ' ' + c + ' circ-cat circ-large" data-tooltip="' + n + '">' + '<img src="' + category.pictogram.url + '" alt="' + category.name + '" /></span>'
else:
result = '<span class="cat ' + class_reduced + ' ' + c + ' circ-cat circ-large" data-tooltip="' + prefix + n + '"></span>'
result = '<span class="cat ' + class_reduced + ' ' + c + ' circ-cat circ-large" data-tooltip="' + n + '"></span>'
if with_title and selected:
result = '<div class="developpe">' + result + ' <span class="titre">' + n + '</span></div>'
result = '<div class="developpe">' + result + ' <span class="titre">' + n + '</span> ' + picto_from_name('x-circle') + '</div></div>'
else:
result = '<div class="non-developpe">' + result + '</div>'
@ -251,7 +244,7 @@ def show_legend(filter, category):
[
legend_cat(
c,
"/" + c.slug + url_nocat
"/cat:" + c.slug + url_nocat
if category != c
else url_nocat,
selected=category == c,
@ -259,11 +252,11 @@ def show_legend(filter, category):
)
for c in cats
]
) + ' <a class="contrast simple-button" href="' + url_nocat + '">' + picto_from_name('x-circle') + '</a></div>'
)
)
else:
return mark_safe("<div>" +
" ".join(
[legend_cat(c, "/" + c.slug + filter.request.get_full_path()) for c in cats]
[legend_cat(c, "/cat:" + c.slug + filter.request.get_full_path()) for c in cats]
) + "</div>"
)

View File

@ -88,10 +88,15 @@ def calendar_classes(d, fixed_style):
@register.filter
def url_day(d):
return reverse_lazy(
"day_view", kwargs={"year": d.year, "month": d.month, "day": d.day}
)
def url_day(d, category=None):
if category:
return reverse_lazy(
"day_view_category", kwargs={"year": d.year, "month": d.month, "day": d.day, "cat": category.slug}
)
else:
return reverse_lazy(
"day_view", kwargs={"year": d.year, "month": d.month, "day": d.day}
)
@register.simple_tag
@ -162,3 +167,16 @@ def html_vide(val):
@register.filter
def no_emoji(text):
return emoji.replace_emoji(text, replace='')
@register.simple_tag
def navigation_links(filter, category):
extra = '?' + filter.get_url()
if category is None:
result = '<li><a href="' + reverse_lazy('a_venir') + extra + '">Maintenant</a></li>'
result += '<li><a href="' + reverse_lazy('cette_semaine') + extra + '">Cette semaine</a></li>'
result += '<li><a href="' + reverse_lazy('ce_mois_ci') + extra + '">Ce mois-ci</a></li>'
else:
result = '<li><a href="' + reverse_lazy('a_venir_category', kwargs={'cat': category.slug }) + extra + '">Maintenant</a></li>'
result += '<li><a href="' + reverse_lazy('cette_semaine_category', kwargs={'cat': category.slug }) + extra + '">Cette semaine</a></li>'
result += '<li><a href="' + reverse_lazy('ce_mois_ci_category', kwargs={'cat': category.slug }) + extra + '">Ce mois-ci</a></li>'
return mark_safe(result)

View File

@ -21,27 +21,33 @@ place_dict = {
organisation_dict = {
"queryset": Organisation.objects.all(),
}
category_dict = {
"queryset": Category.objects.all(),
}
sitemaps = {
"static": StaticViewSitemap,
"events": GenericSitemap(event_dict, priority=0.7),
"events": GenericSitemap(event_dict, priority=1.0),
"places": GenericSitemap(place_dict, priority=0.6),
"categories": GenericSitemap(category_dict, priority=0.8),
"organisations": GenericSitemap(organisation_dict, priority=0.2),
}
urlpatterns = [
path("", home, name="home"),
path("<cat>/", home, name="home"),
path("<cat>/semaine/<int:year>/<int:week>/", week_view, name="week_view"),
#path("<cat>/mois/<int:year>/<int:month>/", month_view, name="month_vie"),
#path("<cat>/jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"),
#path("<cat>/aujourdhui/", day_view, name="aujourdhui"),
#path("<cat>/a-venir/", upcoming_events, name="a_venir"),
#path("<cat>/a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
#path("<cat>/cette-semaine/", week_view, name="cette_semaine"),
#path("<cat>/ical", export_ical, name="export_ical"),
path("cat:<cat>/", home, name="home_category"),
path("cat:<cat>/semaine/<int:year>/<int:week>/", week_view, name="week_view_category"),
path("cat:<cat>/cette-semaine/", week_view, name="cette_semaine_category"),
path("cat:<cat>/mois/<int:year>/<int:month>/", month_view, name="month_view_category"),
path("cat:<cat>/jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view_category"),
path("cat:<cat>/a-venir/", upcoming_events, name="a_venir_category"),
path("cat:<cat>/aujourdhui/", day_view, name="aujourdhui_category"),
path("cat:<cat>/a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour_category"),
path("cat:<cat>/cette-semaine/", week_view, name="cette_semaine_category"),
path("cat:<cat>/ical", export_ical, name="export_ical_category"),
path("cat:<cat>/ce-mois-ci", month_view, name="ce_mois_ci_category"),
path("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
path("mois/<int:year>/<int:month>/", month_view, name="month_view"),
@ -50,9 +56,8 @@ urlpatterns = [
path("a-venir/", upcoming_events, name="a_venir"),
path("a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
path("cette-semaine/", week_view, name="cette_semaine"),
path("ce-mois-ci", month_view, name="ce_mois_ci"),
path("tag/<t>/", view_tag, name="view_tag"),
path("tag/<t>/past", view_tag_past, name="view_tag_past"),
path("tags/", tag_list, name="view_all_tags"),

View File

@ -21,7 +21,7 @@ from django.core.mail import mail_admins
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D
from django.http import HttpResponseRedirect, HttpResponse
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseRedirect
from django.urls import reverse
from collections import Counter
import emoji
@ -206,7 +206,7 @@ def home(request, cat=None):
return week_view(request, home=True, cat=cat)
def month_view(request, year=None, month=None):
def month_view(request, year=None, month=None, cat=None):
now = date.today()
if year is None:
year = now.year
@ -214,7 +214,18 @@ def month_view(request, year=None, month=None):
month = now.month
request = EventFilter.set_default_values(request)
filter = EventFilter(request.GET, get_event_qs(request), request=request)
qs = get_event_qs(request)
if cat is not None:
category = Category.objects.filter(slug=cat).first()
qs = qs.filter(category=category)
else:
category = None
filter = EventFilter(request.GET, qs, request=request)
if filter.has_category_parameters():
return HttpResponseRedirect(filter.get_new_url())
cmonth = CalendarMonth(year, month, filter)
context = {
@ -222,18 +233,18 @@ def month_view(request, year=None, month=None):
"month": cmonth.get_month_name(),
"calendar": cmonth,
"filter": filter,
"category": category
}
return render(request, "agenda_culturel/page-month.html", context)
def week_view(request, year=None, week=None, home=False, cat=False):
def week_view(request, year=None, week=None, home=False, cat=None):
now = date.today()
if year is None:
year = now.isocalendar()[0]
if week is None:
week = now.isocalendar()[1]
request = EventFilter.set_default_values(request)
qs = get_event_qs(request)
if cat is not None:
@ -242,6 +253,10 @@ def week_view(request, year=None, week=None, home=False, cat=False):
else:
category = None
filter = EventFilter(request.GET, qs, request=request)
if filter.has_category_parameters():
return HttpResponseRedirect(filter.get_new_url())
cweek = CalendarWeek(year, week, filter)
context = {"year": year, "week": week, "calendar": cweek, "filter": filter, "category": category}
@ -250,11 +265,11 @@ def week_view(request, year=None, week=None, home=False, cat=False):
return render(request, "agenda_culturel/page-week.html", context)
def day_view(request, year=None, month=None, day=None):
return upcoming_events(request, year, month, day, 0)
def day_view(request, year=None, month=None, day=None, cat=None):
return upcoming_events(request, year, month, day, 0, cat)
def upcoming_events(request, year=None, month=None, day=None, neighsize=1):
def upcoming_events(request, year=None, month=None, day=None, neighsize=1, cat=None):
now = date.today()
if year is None:
year = now.year
@ -267,7 +282,18 @@ def upcoming_events(request, year=None, month=None, day=None, neighsize=1):
day = day + timedelta(days=neighsize)
request = EventFilter.set_default_values(request)
filter = EventFilter(request.GET, get_event_qs(request), request=request)
qs = get_event_qs(request)
if cat is not None:
category = Category.objects.filter(slug=cat).first()
qs = qs.filter(category=category)
else:
category = None
filter = EventFilter(request.GET, qs, request=request)
if filter.has_category_parameters():
return HttpResponseRedirect(filter.get_new_url())
cal = CalendarList(day + timedelta(days=-neighsize), day + timedelta(days=neighsize), filter, True)
context = {
@ -276,7 +302,8 @@ def upcoming_events(request, year=None, month=None, day=None, neighsize=1):
"day": day,
"filter": filter,
"date_pred": day + timedelta(days=-neighsize - 1),
"date_next": day + timedelta(days=neighsize + 1)
"date_next": day + timedelta(days=neighsize + 1),
"category": category
}
@ -833,11 +860,22 @@ def export_event_ical(request, year, month, day, pk):
return response
def export_ical(request):
def export_ical(request, cat=None):
now = date.today()
qs = get_event_qs(request)
if cat is not None:
category = Category.objects.filter(slug=cat).first()
qs = qs.filter(category=category)
else:
category = None
request = EventFilter.set_default_values(request)
filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request)
filter = EventFilter(request.GET, queryset=qs, request=request)
if filter.has_category_parameters():
return HttpResponseRedirect(filter.get_new_url())
id_cache = hashlib.md5(filter.get_url().encode("utf8")).hexdigest()
ical = cache.get(id_cache)
if not ical:
@ -847,8 +885,16 @@ def export_ical(request):
response = HttpResponse(content_type="text/calendar")
response.content = ical.to_ical().decode("utf-8").replace("\r\n", "\n")
extra = filter.to_str(' ')
if extra is None:
extra = ''
if not category is None:
if extra != '':
extra = ' ' + category.name + ' ' + extra
else:
extra = ' ' + category.name
response["Content-Disposition"] = "attachment; filename={0}{1}{2}".format(
'Pommes de lune', filter.to_str(' '), ".ics"
'Pommes de lune', extra, ".ics"
)
return response