# Copyright (C) 2017 Alban Gruin # # celcatsanitizer is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 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 General Public License for more details. # # You should have received a copy of the GNU General Public License along # with celcatsanitizer; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 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 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, timetable_slug, group_slug): try: timetable = Timetable.objects.get(slug=timetable_slug) group = Group.objects.get(timetable=timetable, slug=group_slug, active=True) 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())}