From 7abb816f2dc79bc9dca35f8de8a40efdc27641ba Mon Sep 17 00:00:00 2001
From: Andreas <andreasv@fsmpi.rwth-aachen.de>
Date: Sat, 20 May 2017 17:29:56 +0200
Subject: [PATCH] added ical export (no gui integration), closes #42

---
 config.py.example |  1 +
 icalexport.py     | 60 +++++++++++++++++++++++++++++++++++++++++++++++
 server.py         |  1 +
 3 files changed, 62 insertions(+)
 create mode 100644 icalexport.py

diff --git a/config.py.example b/config.py.example
index 8e2c4b7..8c6ba8d 100644
--- a/config.py.example
+++ b/config.py.example
@@ -28,3 +28,4 @@ LDAP_PORT = 636
 #ICAL_URL = 'https://user:password@mail.fsmpi.rwth-aachen.de/SOGo/....ics'
 ERROR_PAGE = 'static/500.html'
 RWTH_IP_RANGES = ['134.130.0.0/16', '137.226.0.0/16', '134.61.0.0/16', '192.35.229.0/24', '2a00:8a60::/32']
+FSMPI_IP_RANGES = []
diff --git a/icalexport.py b/icalexport.py
new file mode 100644
index 0000000..f669d0f
--- /dev/null
+++ b/icalexport.py
@@ -0,0 +1,60 @@
+from server import *
+import icalendar
+from werkzeug.datastructures import Headers
+from datetime import timedelta
+
+def export_lectures(lectures, name):
+	cal = icalendar.Calendar()
+	cal.add('prodid', '-//Video AG//rwth.video//')
+	cal.add('version', '1.0')
+
+	courses = {};
+	for l in lectures:
+		event = icalendar.Event()
+		if not l['course_id'] in courses:
+			courses[l['course_id']] = query('SELECT * from courses WHERE id = ?',l['course_id'])[0]
+		c = courses[l['course_id']]
+
+		event.add('summary', c['short']+' : '+l['title'])
+		event.add('description', l['internal'])
+		event.add('comment', l['comment'])
+		event.add('categories', c['short'])
+		event.add('dtstart', l['time'])
+		event.add('location', l['place'])
+		event.add('dtend', l['time'] + timedelta(minutes=l['duration']))
+		cal.add_component(event)
+
+	H = Headers()
+	H.add_header("Content-Disposition", "inline", filename=name)
+	return Response(cal.to_ical(), mimetype="text/calendar", headers=H)
+
+def calperm(func):
+	@wraps(func)
+	def decorator(*args, **kwargs):
+		permission = ismod()
+		if 'X-Real-IP' in request.headers:
+			ip = ip_address(request.headers['X-Real-IP'])
+			for net in config['FSMPI_IP_RANGES']:
+				if ip in ip_network(net):
+					permission = True
+		if permission:
+			return func(*args, **kwargs)
+		else:
+			flash('Diese Funktion ist nur aus dem FSMPI-Netz(für SOGO-Import) oder eingeloggt verfügbar!')
+			return redirect(url_for('index'))
+	return decorator
+
+@app.route('/internal/ical/semester/<semester>')
+@calperm
+def ical_semester(semester):
+	return export_lectures(query('SELECT lectures.* FROM lectures JOIN courses ON courses.id = lectures.course_id WHERE courses.semester = ? AND lectures.visible = 1', semester),'videoag_semester_'+semester+'.ics')
+
+@app.route('/internal/ical/all')
+@calperm
+def ical_all():
+	return export_lectures(query('SELECT lectures.* FROM lectures lectures.visible = 1', semester),'videoag_all.ics')
+
+@app.route('/internal/ical/handle/<course>')
+@calperm
+def ical_course(course):
+	return export_lectures(query('SELECT lectures.* FROM lectures JOIN handles ON courses.id = lectures.course_id WHERE courses.handle = ? AND lectures.visible = 1', course),'videoag_course_'+course+'.ics')
diff --git a/server.py b/server.py
index bf47cdd..7f78f61 100644
--- a/server.py
+++ b/server.py
@@ -681,3 +681,4 @@ if 'JOBS_API_KEY' in config:
 	import jobs
 import timetable
 import chapters
+import icalexport
-- 
GitLab