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.contrib.postgres.search import SearchQuery, SearchHeadline
from django.db.models import Count, Q from django.db.models import Count, Q
from datetime import date, timedelta from datetime import date, timedelta
from urllib.parse import urlparse, parse_qs, urlencode
from django.http import QueryDict from django.http import QueryDict
from django.contrib.gis.measure import D 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["exclude_tags"].choices = Tag.get_tag_groups(exclude=True, nb_suggestions=0)
self.form.fields["tags"].choices = Tag.get_tag_groups(include=True) 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): def filter_recurrences(self, queryset, name, value):
# construct the full lookup expression # construct the full lookup expression
lookup = "__".join([name, "isnull"]) 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))) 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): def get_url(self):
if isinstance(self.form.data, QueryDict): if isinstance(self.form.data, QueryDict):
return self.form.data.urlencode() return self.form.data.urlencode()

View File

@ -178,7 +178,7 @@ class Category(models.Model):
return "cat-" + str(self.id) return "cat-" + str(self.id)
def get_absolute_url(self): def get_absolute_url(self):
return reverse('home') + '?catgory=' + str(self.pk) return reverse('home_category', kwargs={"cat": self.slug})
def __str__(self): def __str__(self):
return self.name return self.name

View File

@ -139,7 +139,7 @@ details[role="list"] summary + ul li.selected>a:hover {
padding: 0.1em .2em; padding: 0.1em .2em;
.titre { .titre {
vertical-align: middle; vertical-align: middle;
margin-right: .4em; margin-right: .2em;
} }
display: inline-block; display: inline-block;
margin: .1em 0; margin: .1em 0;
@ -148,6 +148,12 @@ details[role="list"] summary + ul li.selected>a:hover {
background: none; background: none;
padding: 0.1em 0; padding: 0.1em 0;
} }
.developpe {
svg {
margin-right: .5em;
vertical-align: middle;
}
}
} }
.suggestions { .suggestions {

View File

@ -14,10 +14,13 @@
{% endblock %} {% endblock %}
{% block title %}{% block og_title %} {% block title %}{% block og_title %}
{% if category %}{{ category.name }} en{% endif %}
{{ calendar.firstdate | date:"F o" }} {{ calendar.firstdate | date:"F o" }}
{% endblock %}{% endblock %} {% 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 %} {% block content %}
@ -26,16 +29,20 @@
{% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=0 %} {% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=0 %}
{% with cache_timeout=user.is_authenticated|yesno:"30,600" %} {% 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> <article>
<header> <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 class="navigation">
<div> <div>
{% if calendar.firstdate|shift_day:-1|not_before_first %} {% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %} {% 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 }}"> <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> {% picto_from_name "chevron-left" %} précédent</a>
</div> </div>
{% endif %} {% endif %}
@ -43,7 +50,11 @@
{% if calendar.lastdate|shift_day:+1|not_after_last %} {% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %} {% if calendar.lastdate|not_before_first %}
<div class="right"> <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 <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" %} {% picto_from_name "chevron-right" %}
</a> </a>
</div> </div>
@ -55,16 +66,24 @@
<div class="slider-button slider-button-inside button-left hidden">{% picto_from_name "arrow-left" %}</div> <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.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %} {% 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> <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 %} {% endif %}
{% endif %}
<div class="grid week-in-month"> <div class="grid week-in-month">
{% for day in calendar.calendar_days_list %} {% for day in calendar.calendar_days_list %}
{% if forloop.counter0|divisibleby:7 %} {% if forloop.counter0|divisibleby:7 %}
{% if not forloop.first %}</div><div class="grid week-in-month">{% endif %} {% if not forloop.first %}</div><div class="grid week-in-month">{% endif %}
{% 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> <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 %}
{% endif %}
@ -84,13 +103,13 @@
</script> </script>
{% endif %} {% endif %}
<header{% if day.is_today %} id="today"{% 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> </header>
{% if day.events %} {% if day.events %}
<ul> <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 }} <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 }}"> <dialog id="{{ daytag }}-category-{{ events.0.category.pk }}">
<article> <article>
<header> <header>
@ -113,7 +132,7 @@
</ul> </ul>
<footer> <footer>
<div class="buttons"> <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" /> <use href="{% static 'images/feather-sprite.svg' %}#chevron-right" />
</svg></a> </svg></a>
</div> </div>
@ -121,7 +140,7 @@
</article> </article>
</dialog> </dialog>
{% endfor %} {% 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> </ul>
{% endif %} {% endif %}
</ul> </ul>
@ -134,19 +153,31 @@
</div> </div>
{% if calendar.lastdate|shift_day:+1|not_after_last %} {% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %} {% 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> <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 %} {% endif %}
{% endif %}
<div class="slider-button slider-button-inside button-right hidden">{% picto_from_name "arrow-right" %}</div> <div class="slider-button slider-button-inside button-right hidden">{% picto_from_name "arrow-right" %}</div>
</div> </div>
<footer> <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 %} {% if calendar.today_in_calendar %}
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</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> <a role="button" href="{% url 'cette_semaine' %}?{{ filter.get_url }}">Cette semaine</a>
{% endif %} {% 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 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> </footer>
</article> </article>
{% endcache %} {% endcache %}

View File

@ -13,7 +13,9 @@
<script src="{% static 'js/modal.js' %}"></script> <script src="{% static 'js/modal.js' %}"></script>
{% 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 body-class %}a-venir{% endblock %} {% block body-class %}a-venir{% endblock %}
@ -23,24 +25,29 @@
<article id="filters"> <article id="filters">
<header><h1 id="index-avenir">{% block title %}{% block og_title %} <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 %} {% if calendar.calendar_days_list.0.is_today %}
Événements à venir à venir
{% else %} {% 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 %} {% if calendar.calendar_days_list|length > 1 %}
et suivants et suivants
{% endif %} {% endif %}
{% endif %} {% endif %}{% if filter.has_location %} à {{ filter.get_position }}{% endif %}
{% endblock %}{% endblock %}</h1></header> {% endblock %}{% endblock %}</h1></header>
{% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=1 %} {% include "agenda_culturel/filter-inc.html" with filter=filter noarticle=1 %}
{% with cache_timeout=user.is_authenticated|yesno:"30,600" %} {% 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> <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"> {% 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" %} {% picto_from_name "chevrons-left" %}
{% if calendar.calendar_days_list|length == 1 %} {% if calendar.calendar_days_list|length == 1 %}
{{ date_pred }} {{ date_pred }}
@ -59,7 +66,11 @@
{% picto_from_name "chevrons-down" %}</a> {% picto_from_name "chevrons-down" %}</a>
{% endfor %} {% endfor %}
{% endif %} {% 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 %} {% if calendar.calendar_days_list|length == 1 %}
{{ date_next }} {{ date_next }}
{% endif %} {% endif %}
@ -138,25 +149,56 @@
{% endfor %} {% endfor %}
<article> <article>
<header><h2>Voir aussi</h2></header> <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" %} {% picto_from_name "chevrons-left" %}
{% if calendar.calendar_days_list|length == 1 %} {% if calendar.calendar_days_list|length == 1 %}
{{ date_pred }} {{ date_pred }}
{% endif %} {% endif %}
</a> </a>
{% if calendar.today_in_calendar %} {% 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> <a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
{% endif %} {% endif %}
{% endif %}
{% if calendar.calendar_days_list|length == 1 %} {% 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> <a role="button" href="{% url 'a_venir_jour' day.year day.month day.day %}?{{ filter.get_url }}">Autour du {{ day }}</a>
{% endif %} {% endif %}
{% 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 '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> <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 %}
<a role="button" href="{% url 'month_view' calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% endif %} {% 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 %}
{% 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> <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 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 %} {% if calendar.calendar_days_list|length == 1 %}
{{ date_next }} {{ date_next }}
{% endif %} {% endif %}

View File

@ -14,9 +14,12 @@
<script src="{% static 'js/calendar-buttons.js' %}"></script> <script src="{% static 'js/calendar-buttons.js' %}"></script>
{% endblock %} {% 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 %} {% block content %}
@ -29,15 +32,19 @@
<header> <header>
<div class="title small"><h1> <div class="title small"><h1>
{% if calendar.today_in_calendar %} {% if calendar.today_in_calendar %}
Cette semaine {% if category %}{{ category.name }} cette semaine{% else %}Cette semaine{% endif %}
{% else %} {% else %}
semaine du {{ calendar.firstdate |date:"j F"|frdate }} {% if category %}{{ category.name }} la {% endif %}semaine du {{ calendar.firstdate |date:"j F"|frdate }}
{% endif %}</h1></div> {% endif %}{% if filter.has_location %}à {{ filter.get_position }}{% endif %}</h1></div>
<div class="navigation"> <div class="navigation">
<div> <div>
{% if calendar.firstdate|shift_day:-1|not_before_first %} {% if calendar.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %} {% 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 }}"> <a role="button" href="{% url 'week_view' calendar.previous_week|weekyear calendar.previous_week|week %}?{{ filter.get_url }}">
{% endif %}
{% picto_from_name "chevron-left" %} précédente</a> {% picto_from_name "chevron-left" %} précédente</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
@ -45,7 +52,11 @@
{% if calendar.lastdate|shift_day:+1|not_after_last %} {% if calendar.lastdate|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %} {% if calendar.lastdate|not_before_first %}
<div class="right"> <div class="right">
{% 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 <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" %} {% picto_from_name "chevron-right" %}
</a> </a>
</div> </div>
@ -57,9 +68,13 @@
<div class="slider-button slider-button-inside button-left hidden">{% picto_from_name "arrow-left" %}</div> <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.firstdate|shift_day:-1|not_before_first %}
{% if calendar.lastdate|not_after_last %} {% 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> <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 %} {% endif %}
{% endif %}
<div class="grid"> <div class="grid">
{% for day in calendar.calendar_days_list %} {% 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> <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|shift_day:+1|not_after_last %}
{% if calendar.lastdate|not_before_first %} {% 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> <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 %} {% endif %}
{% endif %}
</div> </div>
<footer> <footer>
{% if calendar.today_in_calendar %} {% 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> <a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
{% endif %} {% 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> <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 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> <a role="button" href="{% url 'month_view' calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
{% endif %} {% endif %}
{% 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> <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> </footer>
</article> </article>
{% endcache %} {% endcache %}

View File

@ -52,9 +52,11 @@
<ul class="menu"> <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 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 %} {% 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> {% block navigation-menu %}
<li><a href="{% url 'cette_semaine' %}{% block cette_semaine_parameters %}{% endblock %}">Cette semaine</a></li> <li><a href="{% url 'a_venir' %}">Maintenant</a></li>
<li><a href="{% url 'ce_mois_ci' %}{% block ce_mois_ci_parameters %}{% endblock %}">Ce mois-ci</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> </ul>
</div> </div>
<nav class="container-fluid"> <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() c = category.css_class()
n = category.name n = category.name
class_reduced = '' if selected else 'reduced' class_reduced = '' if selected else 'reduced'
if first:
prefix = ""
else:
if selected:
prefix = "retirer "
else:
prefix = "ajouter "
if category.pictogram: 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: 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: 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: else:
result = '<div class="non-developpe">' + result + '</div>' result = '<div class="non-developpe">' + result + '</div>'
@ -251,7 +244,7 @@ def show_legend(filter, category):
[ [
legend_cat( legend_cat(
c, c,
"/" + c.slug + url_nocat "/cat:" + c.slug + url_nocat
if category != c if category != c
else url_nocat, else url_nocat,
selected=category == c, selected=category == c,
@ -259,11 +252,11 @@ def show_legend(filter, category):
) )
for c in cats for c in cats
] ]
) + ' <a class="contrast simple-button" href="' + url_nocat + '">' + picto_from_name('x-circle') + '</a></div>' )
) )
else: else:
return mark_safe("<div>" + return mark_safe("<div>" +
" ".join( " ".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>" ) + "</div>"
) )

View File

@ -88,7 +88,12 @@ def calendar_classes(d, fixed_style):
@register.filter @register.filter
def url_day(d): 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( return reverse_lazy(
"day_view", kwargs={"year": d.year, "month": d.month, "day": d.day} "day_view", kwargs={"year": d.year, "month": d.month, "day": d.day}
) )
@ -162,3 +167,16 @@ def html_vide(val):
@register.filter @register.filter
def no_emoji(text): def no_emoji(text):
return emoji.replace_emoji(text, replace='') 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 = { organisation_dict = {
"queryset": Organisation.objects.all(), "queryset": Organisation.objects.all(),
} }
category_dict = {
"queryset": Category.objects.all(),
}
sitemaps = { sitemaps = {
"static": StaticViewSitemap, "static": StaticViewSitemap,
"events": GenericSitemap(event_dict, priority=0.7), "events": GenericSitemap(event_dict, priority=1.0),
"places": GenericSitemap(place_dict, priority=0.6), "places": GenericSitemap(place_dict, priority=0.6),
"categories": GenericSitemap(category_dict, priority=0.8),
"organisations": GenericSitemap(organisation_dict, priority=0.2), "organisations": GenericSitemap(organisation_dict, priority=0.2),
} }
urlpatterns = [ urlpatterns = [
path("", home, name="home"), path("", home, name="home"),
path("<cat>/", home, name="home"), path("cat:<cat>/", home, name="home_category"),
path("<cat>/semaine/<int:year>/<int:week>/", week_view, name="week_view"), path("cat:<cat>/semaine/<int:year>/<int:week>/", week_view, name="week_view_category"),
#path("<cat>/mois/<int:year>/<int:month>/", month_view, name="month_vie"), path("cat:<cat>/cette-semaine/", week_view, name="cette_semaine_category"),
#path("<cat>/jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"), path("cat:<cat>/mois/<int:year>/<int:month>/", month_view, name="month_view_category"),
#path("<cat>/aujourdhui/", day_view, name="aujourdhui"), path("cat:<cat>/jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view_category"),
#path("<cat>/a-venir/", upcoming_events, name="a_venir"), path("cat:<cat>/a-venir/", upcoming_events, name="a_venir_category"),
#path("<cat>/a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"), path("cat:<cat>/aujourdhui/", day_view, name="aujourdhui_category"),
#path("<cat>/cette-semaine/", week_view, name="cette_semaine"), path("cat:<cat>/a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour_category"),
#path("<cat>/ical", export_ical, name="export_ical"), 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("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
path("mois/<int:year>/<int:month>/", month_view, name="month_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/", upcoming_events, name="a_venir"),
path("a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"), path("a-venir/<int:year>/<int:month>/<int:day>/", upcoming_events, name="a_venir_jour"),
path("cette-semaine/", week_view, name="cette_semaine"), path("cette-semaine/", week_view, name="cette_semaine"),
path("ce-mois-ci", month_view, name="ce_mois_ci"), path("ce-mois-ci", month_view, name="ce_mois_ci"),
path("tag/<t>/", view_tag, name="view_tag"), path("tag/<t>/", view_tag, name="view_tag"),
path("tag/<t>/past", view_tag_past, name="view_tag_past"), path("tag/<t>/past", view_tag_past, name="view_tag_past"),
path("tags/", tag_list, name="view_all_tags"), 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.geos import Point
from django.contrib.gis.measure import D 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 django.urls import reverse
from collections import Counter from collections import Counter
import emoji import emoji
@ -206,7 +206,7 @@ def home(request, cat=None):
return week_view(request, home=True, cat=cat) 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() now = date.today()
if year is None: if year is None:
year = now.year year = now.year
@ -214,7 +214,18 @@ def month_view(request, year=None, month=None):
month = now.month month = now.month
request = EventFilter.set_default_values(request) 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) cmonth = CalendarMonth(year, month, filter)
context = { context = {
@ -222,18 +233,18 @@ def month_view(request, year=None, month=None):
"month": cmonth.get_month_name(), "month": cmonth.get_month_name(),
"calendar": cmonth, "calendar": cmonth,
"filter": filter, "filter": filter,
"category": category
} }
return render(request, "agenda_culturel/page-month.html", context) 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() now = date.today()
if year is None: if year is None:
year = now.isocalendar()[0] year = now.isocalendar()[0]
if week is None: if week is None:
week = now.isocalendar()[1] week = now.isocalendar()[1]
request = EventFilter.set_default_values(request) request = EventFilter.set_default_values(request)
qs = get_event_qs(request) qs = get_event_qs(request)
if cat is not None: if cat is not None:
@ -242,6 +253,10 @@ def week_view(request, year=None, week=None, home=False, cat=False):
else: else:
category = None category = None
filter = EventFilter(request.GET, qs, request=request) filter = EventFilter(request.GET, qs, request=request)
if filter.has_category_parameters():
return HttpResponseRedirect(filter.get_new_url())
cweek = CalendarWeek(year, week, filter) cweek = CalendarWeek(year, week, filter)
context = {"year": year, "week": week, "calendar": cweek, "filter": filter, "category": category} 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) return render(request, "agenda_culturel/page-week.html", context)
def day_view(request, year=None, month=None, day=None): def day_view(request, year=None, month=None, day=None, cat=None):
return upcoming_events(request, year, month, day, 0) 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() now = date.today()
if year is None: if year is None:
year = now.year year = now.year
@ -267,7 +282,18 @@ def upcoming_events(request, year=None, month=None, day=None, neighsize=1):
day = day + timedelta(days=neighsize) day = day + timedelta(days=neighsize)
request = EventFilter.set_default_values(request) 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) cal = CalendarList(day + timedelta(days=-neighsize), day + timedelta(days=neighsize), filter, True)
context = { context = {
@ -276,7 +302,8 @@ def upcoming_events(request, year=None, month=None, day=None, neighsize=1):
"day": day, "day": day,
"filter": filter, "filter": filter,
"date_pred": day + timedelta(days=-neighsize - 1), "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 return response
def export_ical(request): def export_ical(request, cat=None):
now = date.today() 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) 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() id_cache = hashlib.md5(filter.get_url().encode("utf8")).hexdigest()
ical = cache.get(id_cache) ical = cache.get(id_cache)
if not ical: if not ical:
@ -847,8 +885,16 @@ def export_ical(request):
response = HttpResponse(content_type="text/calendar") response = HttpResponse(content_type="text/calendar")
response.content = ical.to_ical().decode("utf-8").replace("\r\n", "\n") 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( response["Content-Disposition"] = "attachment; filename={0}{1}{2}".format(
'Pommes de lune', filter.to_str(' '), ".ics" 'Pommes de lune', extra, ".ics"
) )
return response return response