From e1c4eea3c706bb45cd73416e2e8626bd50a97cfb Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 27 Nov 2017 16:04:27 +0100 Subject: Correction des interfaces utilisateur --- feeds.py | 53 ++++++++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 29 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index aced5e6..95ecaf8 100644 --- a/feeds.py +++ b/feeds.py @@ -24,7 +24,7 @@ from django.utils.feedgenerator import Atom1Feed, SyndicationFeed from icalendar import Calendar, Event -from .models import Course, Group +from .models import Course, Group, Timetable from .templatetags.rooms import format_rooms from .utils import get_current_or_next_week, get_week, group_courses @@ -58,8 +58,9 @@ class IcalFeed(Feed): def get_object(self, request, year_slug, timetable_slug, group_slug): try: - group = Group.objects.get(timetable__year__slug=year_slug, - timetable__slug=timetable_slug, + timetable = Timetable.objects.get(year__slug=year_slug, + slug=timetable_slug) + group = Group.objects.get(timetable=timetable.source, slug=group_slug) except: raise ObjectDoesNotExist @@ -81,7 +82,7 @@ class IcalFeed(Feed): return item.name def items(self, obj): - return Course.objects.get_courses_for_group(obj) + return Course.objects.get_courses(obj) def item_extra_kwargs(self, item): return {"uid": "{0}@celcatsanitizer".format(item.id), @@ -103,39 +104,37 @@ class RSSFeed(Feed): _, end = get_week(year, week) try: - group = Group.objects.get(timetable__year__slug=year_slug, - timetable__slug=timetable_slug, - slug=group_slug) + self.timetable = Timetable.objects.get(year__slug=year_slug, + slug=timetable_slug) + self.group = Group.objects.get(timetable=self.timetable.source, + slug=group_slug) except: raise ObjectDoesNotExist else: - updates = Course.objects.get_courses_for_group(group, - begin__lt=end) \ + updates = Course.objects.get_courses(self.group, begin__lt=end) \ .annotate(year=ExtractYear("begin"), week=ExtractWeek("begin")) \ .values("year", "week") \ .annotate(Count("year", distinct=True), Max("last_update")) \ .order_by("-year", "-week")[:5] - return group, updates + return updates def link(self, obj): - group = obj[0] link = reverse("timetable", - kwargs={"year_slug": group.timetable.year.slug, - "timetable_slug": group.timetable.slug, - "group_slug": group.slug}) + kwargs={"year_slug": self.timetable.year.slug, + "timetable_slug": self.timetable.slug, + "group_slug": self.group.slug}) return link def title(self, obj): - return "Emploi du temps du groupe {0}".format(obj[0]) + return "Emploi du temps du groupe {0}".format(self.group) def item_link(self, item): - group = item["group"] return reverse("timetable", - kwargs={"year_slug": group.timetable.year.slug, - "timetable_slug": group.timetable.slug, - "group_slug": group.slug, + kwargs={"year_slug": self.timetable.year.slug, + "timetable_slug": self.timetable.slug, + "group_slug": self.group.slug, "year": item["year"], "week": item["week"]}) @@ -143,7 +142,7 @@ class RSSFeed(Feed): return item["description"] def item_title(self, item): - return "{0}, semaine {1} de {2}".format(item["group"], + return "{0}, semaine {1} de {2}".format(self.group, item["week"], item["year"]) @@ -152,23 +151,19 @@ class RSSFeed(Feed): def items(self, obj): template = loader.get_template("timetable_common.html") - group = obj[0] - for update in obj[1]: + for update in obj: start, end = get_week(update["year"], update["week"]) - courses = Course.objects.get_courses_for_group(group, - begin__gte=start, - begin__lt=end) - context = {"group": group, - "courses": group_courses(courses), + courses = Course.objects.get_courses(self.group, begin__gte=start, + begin__lt=end) + context = {"courses": group_courses(courses), "last_update": update["last_update__max"], "year": update["year"], "week": update["week"]} - update["group"] = group update["description"] = template.render(context) - return obj[1] + return obj class AtomFeed(RSSFeed): -- cgit v1.2.1 From 3efa5da22447fee662d81ebafb21b5e9b9f796fc Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 27 Nov 2017 16:06:31 +0100 Subject: Affichage des salles à la place des groupes dans les flux RSS et Atom --- feeds.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 95ecaf8..8341f06 100644 --- a/feeds.py +++ b/feeds.py @@ -159,7 +159,8 @@ class RSSFeed(Feed): context = {"courses": group_courses(courses), "last_update": update["last_update__max"], "year": update["year"], - "week": update["week"]} + "week": update["week"], + "group_mode": True} update["description"] = template.render(context) -- cgit v1.2.1 From 5d4d7530e1aba199c2604b311b17bef253f0a008 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Mon, 27 Nov 2017 16:27:50 +0100 Subject: Remplacement des références aux champs timetable vers source --- feeds.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index 8341f06..dde051b 100644 --- a/feeds.py +++ b/feeds.py @@ -60,7 +60,7 @@ class IcalFeed(Feed): try: timetable = Timetable.objects.get(year__slug=year_slug, slug=timetable_slug) - group = Group.objects.get(timetable=timetable.source, + group = Group.objects.get(source=timetable.source, slug=group_slug) except: raise ObjectDoesNotExist @@ -106,7 +106,7 @@ class RSSFeed(Feed): try: self.timetable = Timetable.objects.get(year__slug=year_slug, slug=timetable_slug) - self.group = Group.objects.get(timetable=self.timetable.source, + self.group = Group.objects.get(source=self.timetable.source, slug=group_slug) except: raise ObjectDoesNotExist -- cgit v1.2.1 From e2bc777f7f988cba945c027aaa27d98aa3913a71 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Tue, 23 Jan 2018 20:45:16 +0100 Subject: Bon fuseau horaire dans les ICS. Les bases de données stockent et renvoient seulement des dates en UTC. Django inscrit cette information dans les objets datetime, par conséquent les dates inscrites sur les templates étaient automatiquement converties à l’heure indiquée dans la configuration. Or, les ICS sont générées avec une librairie tierce (icalendar), et ne tient donc pas compte de la configuration de Django. Le module inscrit donc des dates UTC dans les ICS. C’est sans conséquences, car l’heure est correcte, juste décalée avec une information de fuseau horaire. Un bon client iCalendar est censé convertir les heures de lui-même en fonction des préférences du systèmes. Seulement certains d’entre eux affichent aussi le fuseau horaire d’origine. --- feeds.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index dde051b..bcbf7f9 100644 --- a/feeds.py +++ b/feeds.py @@ -21,6 +21,7 @@ from django.db.models.functions import ExtractWeek, ExtractYear from django.template import loader from django.urls import reverse from django.utils.feedgenerator import Atom1Feed, SyndicationFeed +from django.utils.timezone import localtime from icalendar import Calendar, Event @@ -86,9 +87,9 @@ class IcalFeed(Feed): def item_extra_kwargs(self, item): return {"uid": "{0}@celcatsanitizer".format(item.id), - "dtstart": item.begin, - "dtend": item.end, - "dtstamp": item.last_update, + "dtstart": localtime(item.begin), + "dtend": localtime(item.end), + "dtstamp": localtime(item.last_update), "summary": self.item_summary(item), "location": format_rooms(item.rooms.all())} -- cgit v1.2.1 From 465c1c13f2e5a77f296de92d4b5b14cf319c68c5 Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Wed, 24 Jan 2018 20:08:18 +0100 Subject: Annulation de la conversion des heures au bon fuseau dans l’ICS. Pour cela, on avait besoin d’insérer un objet vTimezone dans l’en-tête du fichier, ce qui est assez fastidieux. À la place, on met une valeur x-wr-timezone dans les en-têtes. Ajout de valeurs calscale, method, x-wr-calname et x-wr-caldesc aux ICS. Revert "Bon fuseau horaire dans les ICS." This reverts commit e2bc777f7f988cba945c027aaa27d98aa3913a71. --- feeds.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'feeds.py') diff --git a/feeds.py b/feeds.py index bcbf7f9..2f6c586 100644 --- a/feeds.py +++ b/feeds.py @@ -21,7 +21,7 @@ from django.db.models.functions import ExtractWeek, ExtractYear from django.template import loader from django.urls import reverse from django.utils.feedgenerator import Atom1Feed, SyndicationFeed -from django.utils.timezone import localtime +from django.utils.timezone import get_current_timezone_name from icalendar import Calendar, Event @@ -40,6 +40,11 @@ class IcalFeedGenerator(SyndicationFeed): calendar = Calendar() calendar.add("prodid", "-//celcatsanitizer//NONSGML v1.0//EN") calendar.add("version", "2.0") + calendar.add("calscale", "GREGORIAN") + calendar.add("method", "PUBLISH") + calendar.add("x-wr-timezone", get_current_timezone_name()) + calendar.add("x-wr-calname", self.feed["title"]) + calendar.add("x-wr-caldesc", self.feed["title"]) self.write_events(calendar) outfile.write(calendar.to_ical()) @@ -87,12 +92,15 @@ class IcalFeed(Feed): def item_extra_kwargs(self, item): return {"uid": "{0}@celcatsanitizer".format(item.id), - "dtstart": localtime(item.begin), - "dtend": localtime(item.end), - "dtstamp": localtime(item.last_update), + "dtstart": item.begin, + "dtend": item.end, + "dtstamp": item.last_update, "summary": self.item_summary(item), "location": format_rooms(item.rooms.all())} + def title(self, obj): + return "Emploi du temps du groupe {0}".format(obj) + class IcalOnlyOneFeed(IcalFeed): def items(self, obj): -- cgit v1.2.1