Select Git revision
icalexport.py
Forked from
Video AG Infrastruktur / website
187 commits behind the upstream repository.
-
Julian Rother authoredJulian Rother authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
icalexport.py 3.69 KiB
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)