Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • intros
  • live_sources
  • bootstrap4
  • modules
5 results

icalexport.py

Blame
  • Forked from Video AG Infrastruktur / website
    196 commits behind the upstream repository.
    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)