Skip to content
Snippets Groups Projects
Select Git revision
  • ffad2ba1e937b10d813bafac7ea472d05c061f2c
  • master default protected
2 results

icalexport.py

Blame
  • Forked from Video AG Infrastruktur / website
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    icalexport.py 3.28 KiB
    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/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 1000''', user),'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 1000''', user),'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),'videoag_course_'+course+'.ics')