from server import * import icalendar from werkzeug.datastructures import Headers from datetime import timedelta, datetime def export_lectures(lectures, responsible, name): cal = icalendar.Calendar() cal.add('prodid', '-//Video AG//rwth.video//') cal.add('version', '1.0') for l in lectures: resp = [] for r in responsible: if r['course_id'] == l['course_id']: resp.append(r['realname']) 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: '+', '.join(resp) if resp 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 def get_responsible(): return query('''SELECT users.*, responsible.course_id FROM responsible JOIN users ON users.id = responsible.user_id''') @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 ?''', request.values.get('limit', 1000)), get_responsible(), 'videoag_all.ics') @app.route('/internal/ical/user/<int:user>') @calperm def ical_user(user): username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name'] return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.* FROM lectures JOIN courses ON courses.id = lectures.course_id JOIN responsible ON responsible.course_id = courses.id WHERE NOT norecording AND NOT external AND responsible.user_id = ? ORDER BY time DESC LIMIT ?''', user, request.values.get('limit', 1000)), get_responsible(), 'videoag_%s.ics'%username) @app.route('/internal/ical/notuser/<int:user>') @calperm def ical_notuser(user): username = query('SELECT name FROM users WHERE users.id = ?', user)[0]['name'] return export_lectures(query('''SELECT lectures.*, "course" AS sep, courses.* FROM lectures JOIN courses ON courses.id = lectures.course_id LEFT JOIN responsible ON (responsible.course_id = courses.id AND responsible.user_id = ?) WHERE NOT norecording AND NOT external AND responsible.user_id IS NULL ORDER BY time DESC LIMIT ?''', user, request.values.get('limit', 1000)), get_responsible(), 'videoag_not_%s.ics'%username) @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), get_responsible(), 'videoag_%s.ics'%course)