diff options
author | Alban Gruin | 2017-09-09 16:39:30 +0200 |
---|---|---|
committer | Alban Gruin | 2017-09-09 16:39:30 +0200 |
commit | 5c96538dfe708c4429d13397caedeb0b84a65b5a (patch) | |
tree | 855a9f31cb40a35805129d4f9edd3eac274cc11f /feeds.py | |
parent | ab9df7a174e2debbf9c644c8ec3e2127eeeaa3cf (diff) | |
parent | 60ea5a0e2a5f61f7f764bcf01aafb362781c16da (diff) |
Merge branch 'stable/0.9.z' into prod/pa1ch/0.y.z
Diffstat (limited to 'feeds.py')
-rw-r--r-- | feeds.py | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/feeds.py b/feeds.py new file mode 100644 index 0000000..2dd2479 --- /dev/null +++ b/feeds.py @@ -0,0 +1,127 @@ +# Copyright (C) 2017 Alban Gruin +# +# celcatsanitizer is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# celcatsanitizer is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with celcatsanitizer. If not, see <http://www.gnu.org/licenses/>. + +from django.core.exceptions import ObjectDoesNotExist +from django.conf import settings +from django.contrib.syndication.views import Feed +from django.db.models import Q +from django.template import loader +from django.urls import reverse +from django.utils.feedgenerator import Atom1Feed, SyndicationFeed + +from icalendar import Calendar, Event + +from .models import Course, Group, LastUpdate +from .templatetags.rooms import format_rooms +from .utils import get_current_or_next_week, get_week, group_courses + +ICAL_NAMES = ["summary", "description", "location", "start", "dtstart", "dtend"] + + +class IcalFeedGenerator(SyndicationFeed): + content_type = "text/calendar; charset=utf-8" + + def write(self, outfile, encoding): + calendar = Calendar() + calendar.add("version", "2.0") + + self.write_events(calendar) + outfile.write(calendar.to_ical()) + + def write_events(self, calendar): + for item in self.items: + event = Event() + for key in ICAL_NAMES: + if item.get(key) is not None: + event.add(key, item[key]) + calendar.add_component(event) + + +class IcalFeed(Feed): + feed_type = IcalFeedGenerator + link = "" + + 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, slug=group_slug) + except: + raise ObjectDoesNotExist + else: + return group + + def item_description(self, item): + return item.notes + + def item_link(self, item): + return "" + + def items(self, obj): + return Course.objects.get_courses_for_group(obj).order_by("begin") + + def item_extra_kwargs(self, item): + return {"dtstart": item.begin, + "dtend": item.end, + "summary": item.name, + "location": format_rooms(item.rooms.all())} + + +class RSSFeed(Feed): + def get_object(self, request, year_slug, timetable_slug, group_slug): + year, week = get_current_or_next_week() + try: + group = Group.objects.get(timetable__year__slug=year_slug, timetable__slug=timetable_slug, slug=group_slug) + updates = LastUpdate.objects.filter(Q(year=year, week__lte=week) | Q(year__lt=year), timetable__year__slug=year_slug, timetable__slug=timetable_slug).order_by("-year", "-week")[:5] + except: + raise ObjectDoesNotExist + else: + return group, 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}) + return link + + def title(self, obj): + return "Emploi du temps du groupe {0}".format(obj[0]) + + 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, "year": item.year, "week": item.week}) + + def item_description(self, item): + return item.description + + def item_updateddate(self, item): + return item.date + + def items(self, obj): + template = loader.get_template("timetable_common.html") + group = obj[0] + + for update in obj[1]: + 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), "last_update": update, "year": update.year, "week": update.week} + + update.group = group + update.description = template.render(context) + + return obj[1] + + +class AtomFeed(RSSFeed): + author_name = settings.ADMINS[0][0] + author_email = settings.ADMINS[0][1] + feed_type = Atom1Feed |