# 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.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