Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • postgres_integration
  • s3compatible
  • intros
  • bootstrap4
  • modules
6 results

icalexport.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    icalexport.py 2.24 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/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')