|
3 | 3 | import calendar |
4 | 4 |
|
5 | 5 | from flask import Flask, render_template, url_for, send_from_directory |
6 | | -from flask import abort, redirect |
| 6 | +from flask import abort, redirect, Response |
7 | 7 | from jinja2 import StrictUndefined |
8 | 8 | from jinja2.exceptions import TemplateNotFound |
9 | 9 | from werkzeug.local import LocalProxy |
10 | 10 | from pathlib import Path |
| 11 | +import ics |
11 | 12 |
|
12 | 13 | from naucse import models |
13 | 14 | from naucse.urlconverters import register_url_converters |
@@ -325,3 +326,23 @@ def course_calendar(course): |
325 | 326 | months=list_months(course.start_date, |
326 | 327 | course.end_date), |
327 | 328 | calendar=calendar.Calendar()) |
| 329 | + |
| 330 | + |
| 331 | +@app.route('/<course:course>/calendar.ics') |
| 332 | +def course_calendar_ics(course): |
| 333 | + if not course.start_date: |
| 334 | + abort(404) |
| 335 | + calendar = ics.Calendar() |
| 336 | + for session in course.sessions.values(): |
| 337 | + combined = datetime.datetime.combine(session.date, datetime.time()) |
| 338 | + cal_event = ics.Event( |
| 339 | + name = session.title, |
| 340 | + begin = combined, |
| 341 | + uid = url_for("session_coverpage", |
| 342 | + course=course, |
| 343 | + session=session.slug, |
| 344 | + _external=True), |
| 345 | + ) |
| 346 | + cal_event.make_all_day() |
| 347 | + calendar.events.append(cal_event) |
| 348 | + return Response(str(calendar), mimetype="text/calendar") |
0 commit comments