def adventure_page(adventure_name, level): user = current_user(request) level = int(level) adventures = load_adventure_for_language(requested_lang()) # If requested adventure does not exist, return 404 if not adventure_name in adventures['adventures']: return 'No such Hedy adventure!', 404 adventure = adventures['adventures'][adventure_name] # If no level is specified (this will happen if the last element of the path (minus the query parameter) is the same as the adventure_name) if re.sub(r'\?.+', '', request.url.split('/')[len(request.url.split('/')) - 1]) == adventure_name: # If user is logged in, check if they have a program for this adventure # If there are many, note the highest level for which there is a saved program desired_level = 0 if user['username']: existing_programs = DATABASE.programs_for_user(user['username']) for program in existing_programs: if 'adventure_name' in program and program[ 'adventure_name'] == adventure_name and program[ 'level'] > desired_level: desired_level = program['level'] # If the user has a saved program for this adventure, redirect them to the level with the highest adventure if desired_level != 0: return redirect(request.url.replace( '/' + adventure_name, '/' + adventure_name + '/' + str(desired_level)), code=302) # If user is not logged in, or has no saved programs for this adventure, default to the lowest level available for the adventure if desired_level == 0: for key in adventure['levels'].keys(): if isinstance(key, int) and (desired_level == 0 or desired_level > key): desired_level = key level = desired_level # If requested level is not in adventure, return 404 if not level in adventure['levels']: abort(404) adventures = load_adventures_per_level(requested_lang(), level) g.prefix = '/hedy' return hedyweb.render_code_editor_with_tabs( request=request, course=HEDY_COURSE[requested_lang()], level_number=level, menu=render_main_menu('hedy'), translations=TRANSLATIONS, version=version(), adventures=adventures, # The relevant loaded program will be available to client-side js and it will be loaded by js. loaded_program='', adventure_name=adventure_name)
def index(level, step): # Sublevel requested if re.match('\d+-\d+', level): pass # If level has a dash, we keep it as a string # Normal level requested elif re.match('\d', level): try: g.level = level = int(level) except: return 'No such Hedy level!', 404 else: return 'No such Hedy level!', 404 g.lang = requested_lang() g.prefix = '/hedy' loaded_program = '' adventure_name = '' # If step is a string that has more than two characters, it must be an id of a program if step and isinstance(step, str) and len(step) > 2: result = DATABASE.program_by_id(step) if not result: return 'No such program', 404 # If the program is not public, allow only the owner of the program, the admin user and the teacher users to access the program user = current_user(request) public_program = 'public' in result and result['public'] if not public_program and user['username'] != result[ 'username'] and not is_admin(request) and not is_teacher( request): return 'No such program!', 404 loaded_program = { 'code': result['code'], 'name': result['name'], 'adventure_name': result.get('adventure_name') } if 'adventure_name' in result: adventure_name = result['adventure_name'] adventures = load_adventures_per_level(g.lang, level) return hedyweb.render_code_editor_with_tabs(request=request, course=HEDY_COURSE[g.lang], level_number=level, menu=render_main_menu('hedy'), translations=TRANSLATIONS, version=version(), adventures=adventures, loaded_program=loaded_program, adventure_name=adventure_name)
def space_eu(level, step): g.level = level = int(level) g.lang = requested_lang() g.prefix = '/space_eu' adventures = load_adventures_per_level(g.lang, level) return hedyweb.render_code_editor_with_tabs(request=request, course=HEDY_COURSE[g.lang], level_number=level, translations=TRANSLATIONS, version=version(), menu=None, adventures=adventures, loaded_program='', adventure_name='')
def onlinemasters(level, step): g.level = level = int(level) g.lang = lang = requested_lang() g.prefix = '/onlinemasters' adventures = load_adventures_per_level(g.lang, level) return hedyweb.render_code_editor_with_tabs(request=request, course=ONLINE_MASTERS_COURSE, level_number=level, translations=TRANSLATIONS, version=version(), menu=None, adventures=adventures, loaded_program='', adventure_name='')