Compare commits
10 Commits
main
...
13_export_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
de61752726 | ||
![]() |
ce5ff2df63 | ||
![]() |
018b7a052f | ||
![]() |
663c4cff71 | ||
![]() |
8bd4fafb17 | ||
![]() |
6795a221da | ||
![]() |
1db30afc1a | ||
![]() |
fc3b0f8320 | ||
![]() |
bd310c7b44 | ||
![]() |
7b3aca21f4 |
@ -175,6 +175,9 @@ class CalendarList:
|
|||||||
def calendar_days_list(self):
|
def calendar_days_list(self):
|
||||||
return list(self.calendar_days.values())
|
return list(self.calendar_days.values())
|
||||||
|
|
||||||
|
def get_events(self):
|
||||||
|
return [event for jour in self.calendar_days_list() for event in jour.events]
|
||||||
|
|
||||||
|
|
||||||
class CalendarMonth(CalendarList):
|
class CalendarMonth(CalendarList):
|
||||||
def __init__(self, year, month, filter):
|
def __init__(self, year, month, filter):
|
||||||
|
@ -12,6 +12,7 @@ import os
|
|||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.contrib.postgres.search import TrigramSimilarity
|
from django.contrib.postgres.search import TrigramSimilarity
|
||||||
|
from django.http import HttpResponse
|
||||||
from django.db.models import Q, Count
|
from django.db.models import Q, Count
|
||||||
import recurrence.fields
|
import recurrence.fields
|
||||||
import recurrence
|
import recurrence
|
||||||
@ -1092,7 +1093,7 @@ class Event(models.Model):
|
|||||||
|
|
||||||
return (dtstart <= e_dtstart <= dtend) or (e_dtstart <= dtstart <= e_dtend)
|
return (dtstart <= e_dtstart <= dtend) or (e_dtstart <= dtstart <= e_dtend)
|
||||||
|
|
||||||
def export_to_ics(events):
|
def export_to_ics(filename, events):
|
||||||
cal = icalCal()
|
cal = icalCal()
|
||||||
# Some properties are required to be compliant
|
# Some properties are required to be compliant
|
||||||
cal.add("prodid", "-//My calendar product//example.com//")
|
cal.add("prodid", "-//My calendar product//example.com//")
|
||||||
@ -1130,7 +1131,13 @@ class Event(models.Model):
|
|||||||
|
|
||||||
cal.add_component(eventIcal)
|
cal.add_component(eventIcal)
|
||||||
|
|
||||||
return cal
|
response = HttpResponse(content_type="text/calendar")
|
||||||
|
response.content = cal.to_ical().decode("utf-8").replace("\r\n", "\n")
|
||||||
|
response["Content-Disposition"] = "attachment; filename={0}{1}".format(
|
||||||
|
filename, ".ics"
|
||||||
|
)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
class ContactMessage(models.Model):
|
class ContactMessage(models.Model):
|
||||||
|
@ -94,7 +94,10 @@
|
|||||||
<header>
|
<header>
|
||||||
<h2>Voir aussi</h2>
|
<h2>Voir aussi</h2>
|
||||||
</header>
|
</header>
|
||||||
|
<div class="buttons">
|
||||||
|
<a role="button" href="{% url 'day_view_ical' day.year day.month day.day%}" >Exporter ical {% picto_from_name "calendar" %}</a>
|
||||||
<a role="button" href="{% url 'week_view' day.year day|week %}?{{ filter.get_url }}">Toute la semaine</a>
|
<a role="button" href="{% url 'week_view' day.year day|week %}?{{ filter.get_url }}">Toute la semaine</a>
|
||||||
|
</div>
|
||||||
</article>
|
</article>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
|
@ -58,10 +58,13 @@
|
|||||||
|
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
{% if calendar.today_in_calendar %}
|
<div class="buttons">
|
||||||
<a role="button" href="{% url 'aujourdhui' %}?{{ filter.get_url }}">Aujourd'hui</a>
|
<a role="button" href="{% url 'month_view_ical' calendar.firstdate.year calendar.firstdate.month %}" >Exporter ical {% picto_from_name "calendar" %}</a>
|
||||||
<a role="button" href="{% url 'cette_semaine' %}?{{ filter.get_url }}">Cette semaine</a>
|
{% if calendar.today_in_calendar %}
|
||||||
{% endif %}
|
<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 %}
|
||||||
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
{% load event_extra %}
|
{% load event_extra %}
|
||||||
{% load utils_extra %}
|
{% load utils_extra %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block entete_header %}
|
{% block entete_header %}
|
||||||
{% css_categories %}
|
{% css_categories %}
|
||||||
@ -20,11 +19,11 @@
|
|||||||
Semaine du {{ calendar.calendar_days_list.0.date|date|frdate }}
|
Semaine du {{ calendar.calendar_days_list.0.date|date|frdate }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% if home %}
|
{% if home %}
|
||||||
<article>{% include "agenda_culturel/static_content.html" with name="home" url_path="/" %}</article>
|
<article>{% include "agenda_culturel/static_content.html" with name="home" url_path="/" %}</article>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
{% include "agenda_culturel/filter-inc.html" with filter=filter %}
|
{% include "agenda_culturel/filter-inc.html" with filter=filter %}
|
||||||
@ -57,15 +56,15 @@ Semaine du {{ calendar.calendar_days_list.0.date|date|frdate }}
|
|||||||
|
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
|
<a role="button" href="{% url 'week_view_ical' year week %}" >Exporter ical {% picto_from_name "calendar" %}</a>
|
||||||
{% 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>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<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 %}
|
{% 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>
|
<a role="button" href="{% url 'month_view' calendar.lastdate.year calendar.lastdate.month %}?{{ filter.get_url }}">{{ calendar.lastdate | date:"F o" }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,12 +10,23 @@ from .views import *
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", home, name="home"),
|
path("", home, name="home"),
|
||||||
path("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
|
|
||||||
path("mois/<int:year>/<int:month>/", month_view, name="month_view"),
|
|
||||||
path("jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"),
|
|
||||||
path("aujourdhui/", day_view, name="aujourdhui"),
|
path("aujourdhui/", day_view, name="aujourdhui"),
|
||||||
|
path("jour/<int:year>/<int:month>/<int:day>/", day_view, name="day_view"),
|
||||||
|
path(
|
||||||
|
"jour/<int:year>/<int:month>/<int:day>?feed=ical",
|
||||||
|
day_view_ical,
|
||||||
|
name="day_view_ical",
|
||||||
|
),
|
||||||
path("cette-semaine/", week_view, name="cette_semaine"),
|
path("cette-semaine/", week_view, name="cette_semaine"),
|
||||||
|
path("semaine/<int:year>/<int:week>/", week_view, name="week_view"),
|
||||||
|
path(
|
||||||
|
"semaine/<int:year>/<int:week>?feed=ical", week_view_ical, name="week_view_ical"
|
||||||
|
),
|
||||||
path("ce-mois-ci", month_view, name="ce_mois_ci"),
|
path("ce-mois-ci", month_view, name="ce_mois_ci"),
|
||||||
|
path("mois/<int:year>/<int:month>/", month_view, name="month_view"),
|
||||||
|
path(
|
||||||
|
"mois/<int:year>/<int:month>?feed=ical", month_view_ical, name="month_view_ical"
|
||||||
|
),
|
||||||
path("tag/<t>/", view_tag, name="view_tag"),
|
path("tag/<t>/", view_tag, name="view_tag"),
|
||||||
path("tags/", tag_list, name="view_all_tags"),
|
path("tags/", tag_list, name="view_all_tags"),
|
||||||
path("moderation/", moderation, name="moderation"),
|
path("moderation/", moderation, name="moderation"),
|
||||||
|
@ -10,7 +10,7 @@ from django.http import QueryDict
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib.postgres.search import SearchQuery, SearchHeadline
|
from django.contrib.postgres.search import SearchQuery, SearchHeadline
|
||||||
|
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
from django.http import HttpResponseRedirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
@ -267,7 +267,11 @@ def home(request):
|
|||||||
return week_view(request, home=True)
|
return week_view(request, home=True)
|
||||||
|
|
||||||
|
|
||||||
def month_view(request, year=None, month=None):
|
def month_view_ical(request, year=None, month=None):
|
||||||
|
return month_view(request, year, month, True)
|
||||||
|
|
||||||
|
|
||||||
|
def month_view(request, year=None, month=None, ical=False):
|
||||||
now = date.today()
|
now = date.today()
|
||||||
if year is None:
|
if year is None:
|
||||||
year = now.year
|
year = now.year
|
||||||
@ -277,6 +281,12 @@ def month_view(request, year=None, month=None):
|
|||||||
filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request)
|
filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request)
|
||||||
cmonth = CalendarMonth(year, month, filter)
|
cmonth = CalendarMonth(year, month, filter)
|
||||||
|
|
||||||
|
if ical:
|
||||||
|
response = Event.export_to_ics(
|
||||||
|
f"Événements {cmonth.get_month_name()} {year}", cmonth.get_events()
|
||||||
|
)
|
||||||
|
return response
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"year": year,
|
"year": year,
|
||||||
"month": cmonth.get_month_name(),
|
"month": cmonth.get_month_name(),
|
||||||
@ -286,7 +296,11 @@ def month_view(request, year=None, month=None):
|
|||||||
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):
|
def week_view_ical(request, year=None, week=None, home=False):
|
||||||
|
return week_view(request, year, week, home, True)
|
||||||
|
|
||||||
|
|
||||||
|
def week_view(request, year=None, week=None, home=False, ical=False):
|
||||||
now = date.today()
|
now = date.today()
|
||||||
if year is None:
|
if year is None:
|
||||||
year = now.year
|
year = now.year
|
||||||
@ -296,13 +310,29 @@ def week_view(request, year=None, week=None, home=False):
|
|||||||
filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request)
|
filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request)
|
||||||
cweek = CalendarWeek(year, week, filter)
|
cweek = CalendarWeek(year, week, filter)
|
||||||
|
|
||||||
context = {"year": year, "week": week, "calendar": cweek, "filter": filter}
|
if ical:
|
||||||
|
response = Event.export_to_ics(
|
||||||
|
f"Événements semaine {week} {year}", cweek.get_events()
|
||||||
|
)
|
||||||
|
return response
|
||||||
|
|
||||||
|
context = {
|
||||||
|
"year": year,
|
||||||
|
"week": week,
|
||||||
|
"calendar": cweek,
|
||||||
|
"filter": filter,
|
||||||
|
"ical": True,
|
||||||
|
}
|
||||||
if home:
|
if home:
|
||||||
context["home"] = 1
|
context["home"] = 1
|
||||||
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_ical(request, year=None, month=None, day=None):
|
||||||
|
return day_view(request, year, month, day, ical=True)
|
||||||
|
|
||||||
|
|
||||||
|
def day_view(request, year=None, month=None, day=None, ical=False):
|
||||||
now = date.today()
|
now = date.today()
|
||||||
if year is None:
|
if year is None:
|
||||||
year = now.year
|
year = now.year
|
||||||
@ -325,6 +355,10 @@ def day_view(request, year=None, month=None, day=None):
|
|||||||
categories = [(k, v) for k, v in categories.items()]
|
categories = [(k, v) for k, v in categories.items()]
|
||||||
categories.sort(key=lambda k: -k[1])
|
categories.sort(key=lambda k: -k[1])
|
||||||
|
|
||||||
|
if ical:
|
||||||
|
response = Event.export_to_ics(str(day), cday.get_events())
|
||||||
|
return response
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"day": day,
|
"day": day,
|
||||||
"events": cday.get_events(),
|
"events": cday.get_events(),
|
||||||
@ -604,13 +638,7 @@ def export_event_ical(request, pk):
|
|||||||
events = list()
|
events = list()
|
||||||
events.append(event)
|
events.append(event)
|
||||||
|
|
||||||
cal = Event.export_to_ics(events)
|
response = Event.export_to_ics(event.title, events)
|
||||||
|
|
||||||
response = HttpResponse(content_type="text/calendar")
|
|
||||||
response.content = cal.to_ical().decode("utf-8").replace("\r\n", "\n")
|
|
||||||
response["Content-Disposition"] = "attachment; filename={0}{1}".format(
|
|
||||||
event.title, ".ics"
|
|
||||||
)
|
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user