예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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='')
예제 #4
0
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='')