from server import * import icalendar from werkzeug.datastructures import Headers from datetime import timedelta, datetime def export_lectures(lectures, name): cal = icalendar.Calendar() cal.add('prodid', '-//Video AG//rwth.video//') cal.add('version', '1.0') for l in lectures: event = icalendar.Event() event.add('summary', l['course']['short']+': '+l['title']) event.add('description', '\n\n'.join([s for s in [ l['comment'], l['internal'], 'Zuständig: '+l['course']['responsible'] if l['course']['responsible'] else '' ] if s])) event.add('uid', '%i@rwth.video'%l['id']) event.add('dtstamp', datetime.utcnow()) event.add('categories', l['course']['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 request.authorization: userinfo, groups = ldapauth(request.authorization.username, request.authorization.password) if check_mod(userinfo.get('uid'), groups): permission = True if permission: return func(*args, **kwargs) else: return Response("Login required", 401, {'WWW-Authenticate': 'Basic realm="FS-Login required"'}) return decorator @app.route('/internal/ical/all') @calperm def ical_all(): return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.* FROM lectures JOIN courses ON courses.id = lectures.course_id WHERE NOT norecording AND NOT external ORDER BY time DESC LIMIT 1000'''),'videoag_all.ics') @app.route('/internal/ical/course/<course>') @calperm def ical_course(course): return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.* FROM lectures JOIN courses ON courses.id = lectures.course_id WHERE courses.handle = ? AND NOT norecording AND NOT external ORDER BY time DESC''', course),'videoag_course_'+course+'.ics')