# 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 . from django.core.exceptions import ObjectDoesNotExist from django.contrib.syndication.views import Feed from django.utils.feedgenerator import SyndicationFeed from icalendar import Calendar, Event from .models import Course, Group, Timetable, Year from .templatetags.rooms import format_rooms 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: year = Year.objects.get(slug=year_slug) timetable = Timetable.objects.get(year=year, slug=timetable_slug) group = Group.objects.get(timetable=timetable, 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())}