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

nginx.conf.example

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.84 KiB
    from datetime import timedelta, datetime
    from ipaddress import ip_address, ip_network
    import icalendar
    from werkzeug.datastructures import Headers
    
    from server import *
    
    def export_lectures(lectures, responsible, name):
    	cal = icalendar.Calendar()
    	cal.add('prodid', '-//Video AG//rwth.video//')
    	cal.add('version', '1.0')
    	for lecture in lectures:
    		resp = []
    		for r in responsible: #pylint: disable=invalid-name
    			if r['course_id'] == lecture['course_id']:
    				resp.append(r['realname'])
    		event = icalendar.Event()
    		event.add('summary', lecture['course']['short']+': '+lecture['title'])
    		event.add('description', '\n\n'.join([s for s in [
    					lecture['comment'],
    					lecture['internal'],
    					'Zuständig: '+', '.join(resp) if resp else ''
    			] if s]))
    		event.add('uid', '%i@rwth.video'%lecture['id'])
    		event.add('dtstamp', datetime.utcnow())
    		event.add('categories', lecture['course']['short'])
    		event.add('dtstart', lecture['time'])
    		event.add('location', lecture['place'])
    		event.add('dtend', lecture['time'] + timedelta(minutes=lecture['duration']))
    		cal.add_component(event)
    	headers = Headers()
    	headers.add_header("Content-Disposition", "inline", filename=name)
    	return Response(cal.to_ical(), mimetype="text/calendar", headers=headers)
    
    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)
    		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)