def prejoin_class(class_id, link): Class = DATABASE.get_class(class_id) if not Class or Class['link'] != link: return 'No such class', 404 user = {} if request.cookies.get(cookie_name): token = DATABASE.get_token(request.cookies.get(cookie_name)) if token: if token['username'] in Class.get('students', []): return render_template( 'class-already-joined.html', lang=requested_lang(), auth=TRANSLATIONS.get_translations( requested_lang(), 'Auth'), menu=render_main_menu('my-profile'), username=current_user(request)['username'], current_page='my-profile', class_info={'name': Class['name']}) user = DATABASE.user_by_username(token['username']) return render_template( 'class-prejoin.html', lang=requested_lang(), auth=TRANSLATIONS.get_translations(requested_lang(), 'Auth'), menu=render_main_menu('my-profile'), username=current_user(request)['username'], is_teacher=is_teacher(request), current_page='my-profile', class_info={ 'link': os.getenv('BASE_URL') + '/class/' + Class['id'] + '/join/' + Class['link'] + '?lang=' + requested_lang(), 'name': Class['name'] })
def get_class(user, class_id): if not is_teacher(request): return 'Only teachers can retrieve classes', 403 Class = DATABASE.get_class(class_id) if not Class or Class['teacher'] != user['username']: return 'No such class', 404 students = [] for student_username in Class.get('students', []): student = DATABASE.user_by_username(student_username) programs = DATABASE.programs_for_user(student_username) highest_level = max( program['level'] for program in programs) if len(programs) else 0 sorted_public_programs = list( sorted( [program for program in programs if program.get('public')], key=lambda p: p['date'])) if sorted_public_programs: latest_shared = sorted_public_programs[-1] latest_shared['link'] = os.getenv( 'BASE_URL') + f"/hedy/{latest_shared['id']}/view" else: latest_shared = None students.append({ 'username': student_username, 'last_login': utils.mstoisostring(student['last_login']), 'programs': len(programs), 'highest_level': highest_level, 'latest_shared': latest_shared }) if utils.is_testing_request(request): return jsonify({ 'students': students, 'link': Class['link'], 'name': Class['name'], 'id': Class['id'] }) return render_template( 'class-overview.html', lang=requested_lang(), auth=TRANSLATIONS.get_translations(requested_lang(), 'Auth'), menu=render_main_menu('my-profile'), username=current_user(request)['username'], is_teacher=is_teacher(request), current_page='my-profile', class_info={ 'students': students, 'link': os.getenv('BASE_URL') + '/hedy/l/' + Class['link'], 'name': Class['name'], 'id': Class['id'] })
def resolve_class_link(link_id): Class = DATABASE.resolve_class_link(link_id) if not Class: return utils.page_404( TRANSLATIONS, render_main_menu('my-profile'), current_user(request)['username'], requested_lang(), TRANSLATIONS.get_translations(requested_lang(), 'ui').get('invalid_class_link')) return redirect(request.url.replace( '/hedy/l/' + link_id, '/class/' + Class['id'] + '/prejoin/' + link_id), code=302)
def join_class(user, class_id, link): Class = DATABASE.get_class(class_id) if not Class or Class['link'] != link: return utils.page_404( TRANSLATIONS, render_main_menu('my-profile'), current_user(request)['username'], requested_lang(), TRANSLATIONS.get_translations(requested_lang(), 'ui').get('invalid_class_link')) DATABASE.add_student_to_class(Class['id'], user['username']) return redirect(request.url.replace( '/class/' + class_id + '/join/' + link, '/my-profile'), code=302)