コード例 #1
0
def admin_rlms_rlms_list_external(rlmstype, rlmsversion, id):
    rlms = db_session.query(RLMS).filter_by(id = id).first()
    if rlms is None or rlms.rlms_version.version != rlmsversion or rlms.rlms_version.rlms_type.name != rlmstype:
        return render_template("labmanager_admin/rlms_errors.html")

    existing_laboratory_ids = [ laboratory.laboratory_id for laboratory in rlms.laboratories ]

    ManagerClass          = get_manager_class(rlmstype, rlmsversion)
    manager_class         = ManagerClass(rlms.configuration)
    try:
        available_laboratories = manager_class.get_laboratories()
    except:
        traceback.print_exc()
        flash("There was an error retrieving laboratories. Check the trace")
        return render_template("labmanager_admin/rlms_errors.html")

    available_laboratory_ids = [ lab.laboratory_id for lab in available_laboratories ]

    if request.method == 'POST':
        if request.form.get('action','') == 'add':
            for laboratory_id in request.form:
                if laboratory_id != 'action' and laboratory_id in available_laboratory_ids and laboratory_id not in existing_laboratory_ids:
                    new_lab = Laboratory(laboratory_id, laboratory_id, rlms)
                    db_session.add(new_lab)
            db_session.commit()
            return redirect(url_for('admin_rlms_rlms_list', rlmstype = rlmstype, rlmsversion = rlmsversion, id = id))

    return render_template("labmanager_admin/rlms_rlms_list_external.html", available_laboratories = available_laboratories, type_name = rlmstype, version = rlmsversion, rlms_name = rlms.name, existing_laboratory_ids = existing_laboratory_ids)
コード例 #2
0
def admin_rlms_rlms_lab_edit_permissions(rlmstype, rlmsversion, id, lab_id):
    template_variables = {}

    lab, rlms = get_lab_and_lms(rlmstype, rlmsversion, id, lab_id)
    if lab is None or rlms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    if request.method == 'POST':
        if request.form.get('action','').startswith('revoke-'):
            lms_login = request.form['action'][len('revoke-'):]
            lms = db_session.query(LMS).filter_by(lms_login = lms_login).first()
            if lms is None:
                return render_template("labmanager_admin/rlms_errors.html")
           
            permission = db_session.query(PermissionOnLaboratory).filter_by(laboratory_id = lab_id, lms_id = lms.id).first()
            if permission is not None:
                db_session.delete(permission)
                db_session.commit()

    granted_lms_ids = [ perm.lms_id for perm in lab.permissions ]

    lmss = db_session.query(LMS).all()

    template_variables['granted_lms_ids'] = granted_lms_ids
    template_variables['type_name']       = rlmstype
    template_variables['version']         = rlmsversion
    template_variables['rlms_name']       = rlms.name
    template_variables['rlms_id']         = id
    template_variables['lab_name']        = lab.name
    template_variables['lab_id']          = lab_id
    template_variables['lmss']            = lmss

    return render_template("labmanager_admin/rlms_rlms_lab_edit_permissions.html", **template_variables)
コード例 #3
0
def admin_rlms_versions(rlmstype):
    rlms_type = db_session.query(RLMSType).filter_by(name=rlmstype).first()
    if rlms_type is not None:
        versions = rlms_type.versions

        retrieved_versions = set(
            (retrieved_version.version for retrieved_version in versions))

        if request.method == 'POST' and request.form.get(
                'action', '').lower().startswith('add'):
            for supported_version in get_supported_versions(rlmstype):
                if supported_version not in retrieved_versions:
                    new_version = RLMSTypeVersion(rlms_type, supported_version)
                    db_session.add(new_version)
            db_session.commit()

            versions = rlms_type.versions
            retrieved_versions = set(
                (retrieved_version.version for retrieved_version in versions))

        any_supported_missing = any([
            supported_version not in retrieved_versions
            for supported_version in get_supported_versions(rlmstype)
        ])

        return render_template("labmanager_admin/rlms_versions.html",
                               versions=versions,
                               name=rlms_type.name,
                               supported=get_supported_versions(rlmstype),
                               any_supported_missing=any_supported_missing)

    return render_template("labmanager_admin/rlms_errors.html")
コード例 #4
0
ファイル: lms_admin.py プロジェクト: gateway4labs/lms4labs
def lms_admin_courses_permissions(course_id):
    db_lms = db_session.query(LMS).filter_by(lms_login = session['lms']).first()
    course = db_session.query(Course).filter_by(id = course_id, lms = db_lms).first()

    if course is None:
        return render_template("lms_admin/course_errors.html")

    granted_permission_ids = [ permission.permission_on_lab_id for permission in course.permissions ]

    if request.method == 'POST':
        if request.form.get('action','').startswith('revoke-'):
            try:
                permission_on_lab_id = int(request.form['action'][len('revoke-'):])
            except:
                flash("Error parsing permission on lab identifier")
                return render_template("lms_admin/course_errors.html")

            permission_on_course = db_session.query(PermissionOnCourse).filter_by(course = course, permission_on_lab_id = permission_on_lab_id).first()
            if permission_on_course is not None:
                db_session.delete(permission_on_course)
                db_session.commit()
                
            return redirect(url_for('lms_admin_courses_permissions', course_id = course_id))

    return render_template("lms_admin/courses_permissions.html", permissions = db_lms.permissions, course = course, granted_permission_ids = granted_permission_ids)
コード例 #5
0
ファイル: __init__.py プロジェクト: porduna/lms4labs
        def decorated(*args, **kwargs):
            if request.method == "POST" and request.form.get("action", "") == "delete":
                for current_id in request.form:
                    element = db_session.query(table).filter_by(id=current_id).first()
                    if element is not None:
                        db_session.delete(element)
                db_session.commit()

            return f(*args, **kwargs)
コード例 #6
0
ファイル: lms_admin.py プロジェクト: gateway4labs/lms4labs
def lms_admin_external_courses():
    q     = request.args.get('q','')
    try:
        start = int(request.args.get('start','0'))
    except:
        start = 0
    db_lms = db_session.query(LMS).filter_by(lms_login = session['lms']).first()
    user     = db_lms.labmanager_login
    password = db_lms.labmanager_password
    url = "%s?q=%s&start=%s" % (db_lms.url, q, start)

    VISIBLE_PAGES = 10
    results = retrieve_courses(url, user, password)
    if isinstance(results, basestring):
        return "Invalid JSON provided or could not connect to the LMS. Look at the logs for more information"

    try:
        courses_data = results['courses']
        courses = [ (course['id'], course['name']) for course in courses_data ]
        course_dict = dict(courses)
        number   = int(results['number'])
        per_page = int(results['per-page'])
        number_of_pages = ((number - 1) / per_page ) + 1
        current_page    = ((start - 1)  / per_page ) + 1

        THEORICAL_BEFORE_PAGES = VISIBLE_PAGES / 2
        if current_page < THEORICAL_BEFORE_PAGES:
            BEFORE_PAGES = current_page
            AFTER_PAGES  = VISIBLE_PAGES - current_page
        else:
            BEFORE_PAGES = THEORICAL_BEFORE_PAGES
            AFTER_PAGES  = BEFORE_PAGES

        min_page = (start/VISIBLE_PAGES - BEFORE_PAGES)
        max_page = (start/VISIBLE_PAGES + AFTER_PAGES)
        if max_page >= number_of_pages:
            max_page = number_of_pages
        if min_page <= -1:
            min_page = 0
        current_pages   = range(min_page, max_page)
    except:
        traceback.print_exc()
        return "Malformed data retrieved. Look at the logs for more information"

    existing_courses = db_session.query(Course).filter(Course.course_id.in_(course_dict.keys()), Course.lms == db_lms).all()
    existing_course_ids = [ existing_course.course_id for existing_course in existing_courses ]

    if request.method == 'POST':
        for course_id in request.form:
            if course_id != 'action' and course_id in course_dict and course_id not in existing_course_ids:
                db_course = Course(db_lms, course_id, course_dict[course_id])
                db_session.add(db_course)
        db_session.commit()
        return redirect(url_for('lms_admin_courses'))

    return render_template("lms_admin/courses_external.html", courses = courses, existing_course_ids = existing_course_ids, q = q, current_page = current_page, number = number, current_pages = current_pages, per_page = per_page, start = start)
コード例 #7
0
ファイル: __init__.py プロジェクト: sergiobuj/lms4labs
        def decorated(*args, **kwargs):
            if request.method == 'POST' and request.form.get('action',
                                                             '') == 'delete':
                for current_id in request.form:
                    element = db_session.query(table).filter_by(
                        id=current_id).first()
                    if element is not None:
                        db_session.delete(element)
                db_session.commit()

            return f(*args, **kwargs)
コード例 #8
0
def lms_admin_courses_permissions_edit(course_id, permission_on_lab_id):
    db_lms = db_session.query(LMS).filter_by(lms_login=session['lms']).first()
    course = db_session.query(Course).filter_by(id=course_id,
                                                lms=db_lms).first()
    permission_on_lab = db_session.query(PermissionOnLaboratory).filter_by(
        id=permission_on_lab_id, lms=db_lms).first()

    if course is None or permission_on_lab is None:
        return render_template("lms_admin/course_errors.html")

    lab = permission_on_lab.laboratory
    db_rlms = lab.rlms
    db_rlms_version = db_rlms.rlms_version
    db_rlms_type = db_rlms_version.rlms_type
    rlmstype = db_rlms_type.name
    rlmsversion = db_rlms_version.version

    permission = db_session.query(PermissionOnCourse).filter_by(
        permission_on_lab=permission_on_lab, course=course).first()

    PermissionsForm = get_permissions_form_class(rlmstype, rlmsversion)
    form = PermissionsForm()
    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            data = getattr(form, field).data
            if data != '':
                configuration_dict[field] = data

        configuration = json.dumps(configuration_dict)

        if permission is None:  # Not yet granted: add it
            permission = PermissionOnCourse(
                permission_on_lab=permission_on_lab,
                course=course,
                configuration=configuration)
            db_session.add(permission)
        else:  # Already granted: edit it
            permission.configuration = configuration
        db_session.commit()
        return redirect(
            url_for('lms_admin_courses_permissions', course_id=course_id))

    if permission is not None:
        configuration_dict = json.loads(permission.configuration or '{}')
        for field in configuration_dict:
            if hasattr(form, field):
                getattr(form, field).data = configuration_dict.get(field, '')

    return render_template("lms_admin/courses_permissions_add.html",
                           course=course,
                           form=form,
                           lab=lab)
コード例 #9
0
def _add_or_edit_lms(id):
    form = AddLmsForm(id is None)

    if form.validate_on_submit():
        if id is None:
            new_lms = LMS(name=form.name.data,
                          url=form.url.data,
                          lms_login=form.lms_login.data,
                          lms_password=hash_password(form.lms_password.data),
                          labmanager_login=form.labmanager_login.data,
                          labmanager_password=form.labmanager_password.data)
            db_session.add(new_lms)
        else:
            lms = db_session.query(LMS).filter_by(id=id).first()
            if lms is None:
                return render_template("labmanager_admin/lms_errors.html")

            lms.url = form.url.data
            lms.name = form.name.data
            lms.lms_login = form.lms_login.data
            lms.labmanager_login = form.labmanager_login.data
            if form.lms_password.data:
                lms.lms_password = hash_password(form.lms_password.data)
            if form.labmanager_password.data:
                lms.labmanager_password = form.labmanager_password.data

        db_session.commit()
        return redirect(
            url_for('admin_lms_edit', lms_login=form.lms_login.data))

    if id is not None:
        lms = db_session.query(LMS).filter_by(id=id).first()
        if lms is None:
            return render_template("labmanager_admin/lms_errors.html")

        name = lms.name

        form.url.data = lms.url
        form.name.data = lms.name
        form.lms_login.data = lms.lms_login
        form.labmanager_login.data = lms.labmanager_login

        courses = retrieve_courses(lms.url, lms.labmanager_login,
                                   lms.labmanager_password)
        if isinstance(courses, basestring):
            # There was an error, show it
            flash(courses)
    else:
        name = None

    return render_template("labmanager_admin/lms_add.html",
                           form=form,
                           name=name)
コード例 #10
0
def _add_or_edit_rlms(rlmstype, rlmsversion, id):
    if not is_supported(rlmstype, rlmsversion):
        return "Not supported"

    rlms_version = _get_rlms_version(rlmstype, rlmsversion)
    if rlms_version is None:
        return render_template("labmanager_admin/rlms_errors.html")

    if id is not None:
        rlms = db_session.query(RLMS).filter_by(id = id).first()
        if rlms is None or rlms.rlms_version != rlms_version:
            return render_template("labmanager_admin/rlms_errors.html")


    AddForm = get_form_class(rlmstype, rlmsversion)
    form = AddForm(id is None)

    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            if field not in ('location', 'name'):
                configuration_dict[field] = getattr(form, field).data

        configuration = json.dumps(configuration_dict)
        
        if id is None:
            new_rlms = RLMS(name = form.name.data, location = form.location.data, rlms_version = rlms_version, configuration = configuration)
            db_session.add(new_rlms)
        else:
            rlms = db_session.query(RLMS).filter_by(id = id).first()
            if rlms is None:
                return render_template("labmanager_admin/rlms_errors.html")
            rlms.name          = form.name.data
            rlms.location      = form.location.data
            rlms.configuration = AddForm.process_configuration(rlms.configuration, configuration)

        db_session.commit()
        return redirect(url_for('admin_rlms_rlms', rlmstype = rlmstype, rlmsversion = rlmsversion))

    if id is not None:
        rlms = db_session.query(RLMS).filter_by(id = id).first()
        if rlms is None:
            return render_template("labmanager_admin/rlms_errors.html")

        form.name.data     = rlms.name
        form.location.data = rlms.location
        if rlms.configuration is not None and rlms.configuration != '':
            configuration = json.loads(rlms.configuration)
            for key in configuration:
                getattr(form, key).data = configuration[key]

    return render_template("labmanager_admin/rlms_rlms_add.html", rlmss = rlms_version.rlms, name = rlms_version.rlms_type.name, version = rlms_version.version, form = form)
コード例 #11
0
def _add_or_edit_lms(id):
    form = AddLmsForm(id is None)

    if form.validate_on_submit():
        if id is None:
            new_lms = LMS(name = form.name.data, url = form.url.data, 
                            lms_login           = form.lms_login.data, 
                            lms_password        = hash_password(form.lms_password.data), 
                            labmanager_login    = form.labmanager_login.data, 
                            labmanager_password = form.labmanager_password.data)
            db_session.add(new_lms)
        else:
            lms = db_session.query(LMS).filter_by(id = id).first()
            if lms is None:
                return render_template("labmanager_admin/lms_errors.html")


            lms.url               = form.url.data
            lms.name              = form.name.data
            lms.lms_login         = form.lms_login.data
            lms.labmanager_login  = form.labmanager_login.data
            if form.lms_password.data:
                lms.lms_password        = hash_password(form.lms_password.data)
            if form.labmanager_password.data:
                lms.labmanager_password = form.labmanager_password.data

        db_session.commit()
        return redirect(url_for('admin_lms_edit', lms_login = form.lms_login.data))
    
    if id is not None:
        lms = db_session.query(LMS).filter_by(id = id).first()
        if lms is None:
            return render_template("labmanager_admin/lms_errors.html")

        name = lms.name

        form.url.data              = lms.url
        form.name.data             = lms.name
        form.lms_login.data        = lms.lms_login
        form.labmanager_login.data = lms.labmanager_login

        courses = retrieve_courses(lms.url, lms.labmanager_login, lms.labmanager_password)
        if isinstance(courses, basestring):
            # There was an error, show it
            flash(courses)
    else:
        name = None

    return render_template("labmanager_admin/lms_add.html", form = form, name = name)
コード例 #12
0
def admin_rlms():
    types = db_session.query(RLMSType).all()
    retrieved_types = set( (retrieved_type.name for retrieved_type in types) )

    if request.method == 'POST' and request.form.get('action','').lower().startswith('add'):
        for supported_type in get_supported_types():
            if supported_type not in retrieved_types:
                new_type = RLMSType(supported_type)
                db_session.add(new_type)
        db_session.commit()    
        types = db_session.query(RLMSType).all()
        retrieved_types = set( (retrieved_type.name for retrieved_type in types) )

    any_supported_missing = any([ supported_type not in retrieved_types for supported_type in get_supported_types()])

    return render_template("labmanager_admin/rlms_types.html", types = types, supported = get_supported_types(), any_supported_missing = any_supported_missing)
コード例 #13
0
ファイル: lms_admin.py プロジェクト: gateway4labs/lms4labs
def lms_admin_courses_permissions_edit(course_id, permission_on_lab_id):
    db_lms = db_session.query(LMS).filter_by(lms_login = session['lms']).first()
    course = db_session.query(Course).filter_by(id = course_id, lms = db_lms).first()
    permission_on_lab = db_session.query(PermissionOnLaboratory).filter_by(id = permission_on_lab_id, lms = db_lms).first()

    if course is None or permission_on_lab is None:
        return render_template("lms_admin/course_errors.html")

    lab             = permission_on_lab.laboratory
    db_rlms         = lab.rlms
    db_rlms_version = db_rlms.rlms_version
    db_rlms_type    = db_rlms_version.rlms_type
    rlmstype        = db_rlms_type.name
    rlmsversion     = db_rlms_version.version

    permission = db_session.query(PermissionOnCourse).filter_by(permission_on_lab = permission_on_lab, course = course).first()

    PermissionsForm = get_permissions_form_class(rlmstype, rlmsversion)
    form = PermissionsForm()
    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            data = getattr(form, field).data
            if data != '':
                configuration_dict[field] = data

        configuration = json.dumps(configuration_dict)

        if permission is None: # Not yet granted: add it            
            permission = PermissionOnCourse(permission_on_lab = permission_on_lab, course = course, configuration = configuration)
            db_session.add(permission)
        else: # Already granted: edit it
            permission.configuration    = configuration
        db_session.commit()
        return redirect(url_for('lms_admin_courses_permissions', course_id = course_id))

    if permission is not None:
        configuration_dict = json.loads(permission.configuration or '{}')
        for field in configuration_dict:
            if hasattr(form, field):
                getattr(form, field).data = configuration_dict.get(field,'')

    return render_template("lms_admin/courses_permissions_add.html", course = course, form = form, lab = lab)
コード例 #14
0
def _add_or_edit_user(id):
    form = AddUserForm(id is None)

    if form.validate_on_submit():
        if id is None:
            new_user = LabManagerUser(login=form.login.data,
                                      name=form.name.data,
                                      password=hash_password(
                                          form.password.data))
            db_session.add(new_user)
        else:
            user = db_session.query(LabManagerUser).filter_by(id=id).first()
            if user is None:
                return render_template("labmanager_admin/user_errors.html")

            if user.login == session.get('login'):
                session['login'] = form.login.data
                session['user_name'] = form.name.data

            user.name = form.name.data
            user.login = form.login.data
            if form.password.data:
                user.password = hash_password(form.password.data)

        db_session.commit()
        return redirect(url_for('admin_users'))

    if id is not None:
        user = db_session.query(LabManagerUser).filter_by(id=id).first()
        if user is None:
            return render_template("labmanager_admin/user_errors.html")

        name = user.name

        form.name.data = user.name
        form.login.data = user.login
    else:
        name = None

    return render_template("labmanager_admin/user_add.html",
                           form=form,
                           name=name)
コード例 #15
0
def admin_rlms_rlms_list_external(rlmstype, rlmsversion, id):
    rlms = db_session.query(RLMS).filter_by(id=id).first()
    if rlms is None or rlms.rlms_version.version != rlmsversion or rlms.rlms_version.rlms_type.name != rlmstype:
        return render_template("labmanager_admin/rlms_errors.html")

    existing_laboratory_ids = [
        laboratory.laboratory_id for laboratory in rlms.laboratories
    ]

    ManagerClass = get_manager_class(rlmstype, rlmsversion)
    manager_class = ManagerClass(rlms.configuration)
    try:
        available_laboratories = manager_class.get_laboratories()
    except:
        traceback.print_exc()
        flash("There was an error retrieving laboratories. Check the trace")
        return render_template("labmanager_admin/rlms_errors.html")

    available_laboratory_ids = [
        lab.laboratory_id for lab in available_laboratories
    ]

    if request.method == 'POST':
        if request.form.get('action', '') == 'add':
            for laboratory_id in request.form:
                if laboratory_id != 'action' and laboratory_id in available_laboratory_ids and laboratory_id not in existing_laboratory_ids:
                    new_lab = Laboratory(laboratory_id, laboratory_id, rlms)
                    db_session.add(new_lab)
            db_session.commit()
            return redirect(
                url_for('admin_rlms_rlms_list',
                        rlmstype=rlmstype,
                        rlmsversion=rlmsversion,
                        id=id))

    return render_template("labmanager_admin/rlms_rlms_list_external.html",
                           available_laboratories=available_laboratories,
                           type_name=rlmstype,
                           version=rlmsversion,
                           rlms_name=rlms.name,
                           existing_laboratory_ids=existing_laboratory_ids)
コード例 #16
0
def admin_rlms_versions(rlmstype):
    rlms_type = db_session.query(RLMSType).filter_by(name = rlmstype).first()
    if rlms_type is not None:
        versions = rlms_type.versions

        retrieved_versions = set( (retrieved_version.version for retrieved_version in versions) )

        if request.method == 'POST' and request.form.get('action','').lower().startswith('add'):
            for supported_version in get_supported_versions(rlmstype):
                if supported_version not in retrieved_versions:
                    new_version = RLMSTypeVersion(rlms_type, supported_version)
                    db_session.add(new_version)
            db_session.commit()

            versions = rlms_type.versions
            retrieved_versions = set( (retrieved_version.version for retrieved_version in versions) )

        any_supported_missing = any([ supported_version not in retrieved_versions for supported_version in get_supported_versions(rlmstype)])

        return render_template("labmanager_admin/rlms_versions.html", versions = versions, name = rlms_type.name, supported = get_supported_versions(rlmstype), any_supported_missing = any_supported_missing )

    return render_template("labmanager_admin/rlms_errors.html")
コード例 #17
0
def _add_or_edit_user(id):
    form = AddUserForm(id is None)

    if form.validate_on_submit():
        if id is None:
            new_user = LabManagerUser(login = form.login.data, name = form.name.data, 
                                    password = hash_password(form.password.data))
            db_session.add(new_user)
        else:
            user = db_session.query(LabManagerUser).filter_by(id = id).first()
            if user is None:
                return render_template("labmanager_admin/user_errors.html")

            if user.login == session.get('login'):
                session['login']     = form.login.data
                session['user_name'] = form.name.data

            user.name  = form.name.data
            user.login = form.login.data
            if form.password.data:
                user.password = hash_password(form.password.data)

        db_session.commit()
        return redirect(url_for('admin_users'))
    
    if id is not None:
        user = db_session.query(LabManagerUser).filter_by(id = id).first()
        if user is None:
            return render_template("labmanager_admin/user_errors.html")

        name = user.name

        form.name.data  = user.name
        form.login.data = user.login
    else:
        name = None

    return render_template("labmanager_admin/user_add.html", form = form, name = name)
コード例 #18
0
def admin_rlms_rlms_lab_edit_permissions(rlmstype, rlmsversion, id, lab_id):
    template_variables = {}

    lab, rlms = get_lab_and_lms(rlmstype, rlmsversion, id, lab_id)
    if lab is None or rlms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    if request.method == 'POST':
        if request.form.get('action', '').startswith('revoke-'):
            lms_login = request.form['action'][len('revoke-'):]
            lms = db_session.query(LMS).filter_by(lms_login=lms_login).first()
            if lms is None:
                return render_template("labmanager_admin/rlms_errors.html")

            permission = db_session.query(PermissionOnLaboratory).filter_by(
                laboratory_id=lab_id, lms_id=lms.id).first()
            if permission is not None:
                db_session.delete(permission)
                db_session.commit()

    granted_lms_ids = [perm.lms_id for perm in lab.permissions]

    lmss = db_session.query(LMS).all()

    template_variables['granted_lms_ids'] = granted_lms_ids
    template_variables['type_name'] = rlmstype
    template_variables['version'] = rlmsversion
    template_variables['rlms_name'] = rlms.name
    template_variables['rlms_id'] = id
    template_variables['lab_name'] = lab.name
    template_variables['lab_id'] = lab_id
    template_variables['lmss'] = lmss

    return render_template(
        "labmanager_admin/rlms_rlms_lab_edit_permissions.html",
        **template_variables)
コード例 #19
0
def admin_rlms():
    types = db_session.query(RLMSType).all()
    retrieved_types = set((retrieved_type.name for retrieved_type in types))

    if request.method == 'POST' and request.form.get(
            'action', '').lower().startswith('add'):
        for supported_type in get_supported_types():
            if supported_type not in retrieved_types:
                new_type = RLMSType(supported_type)
                db_session.add(new_type)
        db_session.commit()
        types = db_session.query(RLMSType).all()
        retrieved_types = set(
            (retrieved_type.name for retrieved_type in types))

    any_supported_missing = any([
        supported_type not in retrieved_types
        for supported_type in get_supported_types()
    ])

    return render_template("labmanager_admin/rlms_types.html",
                           types=types,
                           supported=get_supported_types(),
                           any_supported_missing=any_supported_missing)
コード例 #20
0
def lms_admin_courses_permissions(course_id):
    db_lms = db_session.query(LMS).filter_by(lms_login=session['lms']).first()
    course = db_session.query(Course).filter_by(id=course_id,
                                                lms=db_lms).first()

    if course is None:
        return render_template("lms_admin/course_errors.html")

    granted_permission_ids = [
        permission.permission_on_lab_id for permission in course.permissions
    ]

    if request.method == 'POST':
        if request.form.get('action', '').startswith('revoke-'):
            try:
                permission_on_lab_id = int(
                    request.form['action'][len('revoke-'):])
            except:
                flash("Error parsing permission on lab identifier")
                return render_template("lms_admin/course_errors.html")

            permission_on_course = db_session.query(
                PermissionOnCourse).filter_by(
                    course=course,
                    permission_on_lab_id=permission_on_lab_id).first()
            if permission_on_course is not None:
                db_session.delete(permission_on_course)
                db_session.commit()

            return redirect(
                url_for('lms_admin_courses_permissions', course_id=course_id))

    return render_template("lms_admin/courses_permissions.html",
                           permissions=db_lms.permissions,
                           course=course,
                           granted_permission_ids=granted_permission_ids)
コード例 #21
0
def admin_rlms_rlms_lab_edit_permissions_lms(rlmstype, rlmsversion, id, lab_id,
                                             lms_login):
    template_variables = {}

    lab, rlms = get_lab_and_lms(rlmstype, rlmsversion, id, lab_id)
    if lab is None or rlms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    lms = db_session.query(LMS).filter_by(lms_login=lms_login).first()
    if lms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    permission = db_session.query(PermissionOnLaboratory).filter_by(
        laboratory_id=lab_id, lms_id=lms.id).first()

    LmsPermissionsForm = get_lms_permissions_form_class(rlmstype, rlmsversion)
    form = LmsPermissionsForm()
    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            if field != 'identifier':
                data = getattr(form, field).data
                if data != '':
                    configuration_dict[field] = data
        identifier = form.identifier.data

        configuration = json.dumps(configuration_dict)

        permission_with_same_identifier = db_session.query(
            PermissionOnLaboratory).filter_by(
                lms_id=lms.id, local_identifier=identifier).first()
        if permission_with_same_identifier is not None and permission_with_same_identifier != permission:
            flash(
                "Could not grant permission. The identifier %s was already used in the LMS %s for the laboratory %s. Choose other identifier."
                % (identifier, lms.name,
                   permission_with_same_identifier.laboratory.name))
            return render_template("labmanager_admin/rlms_errors.html")

        if permission is None:  # Not yet granted: add it
            permission = PermissionOnLaboratory(lms=lms,
                                                laboratory=lab,
                                                configuration=configuration,
                                                local_identifier=identifier)
            db_session.add(permission)
        else:  # Already granted: edit it
            permission.local_identifier = identifier
            permission.configuration = configuration

        db_session.commit()
        return redirect(
            url_for('admin_rlms_rlms_lab_edit_permissions',
                    rlmstype=rlmstype,
                    rlmsversion=rlmsversion,
                    id=id,
                    lab_id=lab_id))

    if permission is not None:
        configuration_dict = json.loads(permission.configuration or '{}')
        for field in configuration_dict:
            if hasattr(form, field):
                getattr(form, field).data = configuration_dict.get(field, '')
        form.identifier.data = permission.local_identifier

    template_variables['type_name'] = rlmstype
    template_variables['version'] = rlmsversion
    template_variables['rlms_name'] = rlms.name
    template_variables['rlms_id'] = id
    template_variables['lab_name'] = lab.name
    template_variables['lab_id'] = lab_id
    template_variables['lms_name'] = lms.name
    template_variables['add_or_edit'] = permission is None
    template_variables['form'] = form

    return render_template(
        "labmanager_admin/rlms_rlms_lab_edit_permissions_add.html",
        **template_variables)
コード例 #22
0
def admin_rlms_rlms_lab_edit_permissions_lms(rlmstype, rlmsversion, id, lab_id, lms_login):
    template_variables = {}

    lab, rlms = get_lab_and_lms(rlmstype, rlmsversion, id, lab_id)
    if lab is None or rlms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    lms = db_session.query(LMS).filter_by(lms_login = lms_login).first()
    if lms is None:
        return render_template("labmanager_admin/rlms_errors.html")

    permission = db_session.query(PermissionOnLaboratory).filter_by(laboratory_id = lab_id, lms_id = lms.id).first()

    LmsPermissionsForm = get_lms_permissions_form_class(rlmstype, rlmsversion)
    form = LmsPermissionsForm()
    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            if field != 'identifier':
                data = getattr(form, field).data
                if data != '':
                    configuration_dict[field] = data
        identifier = form.identifier.data

        configuration = json.dumps(configuration_dict)

        permission_with_same_identifier = db_session.query(PermissionOnLaboratory).filter_by(lms_id = lms.id, local_identifier = identifier).first()
        if permission_with_same_identifier is not None and permission_with_same_identifier != permission:
            flash("Could not grant permission. The identifier %s was already used in the LMS %s for the laboratory %s. Choose other identifier." % (identifier, lms.name, permission_with_same_identifier.laboratory.name))
            return render_template("labmanager_admin/rlms_errors.html")

        

        if permission is None: # Not yet granted: add it
            permission = PermissionOnLaboratory(lms = lms, laboratory = lab, configuration = configuration, local_identifier = identifier)
            db_session.add(permission)
        else: # Already granted: edit it
            permission.local_identifier = identifier
            permission.configuration    = configuration

        db_session.commit()
        return redirect(url_for('admin_rlms_rlms_lab_edit_permissions', rlmstype = rlmstype, rlmsversion = rlmsversion, id = id, lab_id = lab_id))

    if permission is not None:
        configuration_dict = json.loads(permission.configuration or '{}')
        for field in configuration_dict:
            if hasattr(form, field):
                getattr(form, field).data = configuration_dict.get(field,'')
        form.identifier.data = permission.local_identifier

    template_variables['type_name']       = rlmstype
    template_variables['version']         = rlmsversion
    template_variables['rlms_name']       = rlms.name
    template_variables['rlms_id']         = id
    template_variables['lab_name']        = lab.name
    template_variables['lab_id']          = lab_id
    template_variables['lms_name']        = lms.name
    template_variables['add_or_edit']     = permission is None
    template_variables['form']            = form

    return render_template("labmanager_admin/rlms_rlms_lab_edit_permissions_add.html", **template_variables)
コード例 #23
0
def _add_or_edit_rlms(rlmstype, rlmsversion, id):
    if not is_supported(rlmstype, rlmsversion):
        return "Not supported"

    rlms_version = _get_rlms_version(rlmstype, rlmsversion)
    if rlms_version is None:
        return render_template("labmanager_admin/rlms_errors.html")

    if id is not None:
        rlms = db_session.query(RLMS).filter_by(id=id).first()
        if rlms is None or rlms.rlms_version != rlms_version:
            return render_template("labmanager_admin/rlms_errors.html")

    AddForm = get_form_class(rlmstype, rlmsversion)
    form = AddForm(id is None)

    if form.validate_on_submit():
        configuration_dict = {}
        for field in form.get_field_names():
            if field not in ('location', 'name'):
                configuration_dict[field] = getattr(form, field).data

        configuration = json.dumps(configuration_dict)

        if id is None:
            new_rlms = RLMS(name=form.name.data,
                            location=form.location.data,
                            rlms_version=rlms_version,
                            configuration=configuration)
            db_session.add(new_rlms)
        else:
            rlms = db_session.query(RLMS).filter_by(id=id).first()
            if rlms is None:
                return render_template("labmanager_admin/rlms_errors.html")
            rlms.name = form.name.data
            rlms.location = form.location.data
            rlms.configuration = AddForm.process_configuration(
                rlms.configuration, configuration)

        db_session.commit()
        return redirect(
            url_for('admin_rlms_rlms',
                    rlmstype=rlmstype,
                    rlmsversion=rlmsversion))

    if id is not None:
        rlms = db_session.query(RLMS).filter_by(id=id).first()
        if rlms is None:
            return render_template("labmanager_admin/rlms_errors.html")

        form.name.data = rlms.name
        form.location.data = rlms.location
        if rlms.configuration is not None and rlms.configuration != '':
            configuration = json.loads(rlms.configuration)
            for key in configuration:
                getattr(form, key).data = configuration[key]

    return render_template("labmanager_admin/rlms_rlms_add.html",
                           rlmss=rlms_version.rlms,
                           name=rlms_version.rlms_type.name,
                           version=rlms_version.version,
                           form=form)
コード例 #24
0
def lms_admin_external_courses():
    q = request.args.get('q', '')
    try:
        start = int(request.args.get('start', '0'))
    except:
        start = 0
    db_lms = db_session.query(LMS).filter_by(lms_login=session['lms']).first()
    user = db_lms.labmanager_login
    password = db_lms.labmanager_password
    url = "%s?q=%s&start=%s" % (db_lms.url, q, start)

    VISIBLE_PAGES = 10
    results = retrieve_courses(url, user, password)
    if isinstance(results, basestring):
        return "Invalid JSON provided or could not connect to the LMS. Look at the logs for more information"

    try:
        courses_data = results['courses']
        courses = [(course['id'], course['name']) for course in courses_data]
        course_dict = dict(courses)
        number = int(results['number'])
        per_page = int(results['per-page'])
        number_of_pages = ((number - 1) / per_page) + 1
        current_page = ((start - 1) / per_page) + 1

        THEORICAL_BEFORE_PAGES = VISIBLE_PAGES / 2
        if current_page < THEORICAL_BEFORE_PAGES:
            BEFORE_PAGES = current_page
            AFTER_PAGES = VISIBLE_PAGES - current_page
        else:
            BEFORE_PAGES = THEORICAL_BEFORE_PAGES
            AFTER_PAGES = BEFORE_PAGES

        min_page = (start / VISIBLE_PAGES - BEFORE_PAGES)
        max_page = (start / VISIBLE_PAGES + AFTER_PAGES)
        if max_page >= number_of_pages:
            max_page = number_of_pages
        if min_page <= -1:
            min_page = 0
        current_pages = range(min_page, max_page)
    except:
        traceback.print_exc()
        return "Malformed data retrieved. Look at the logs for more information"

    existing_courses = db_session.query(Course).filter(
        Course.course_id.in_(course_dict.keys()), Course.lms == db_lms).all()
    existing_course_ids = [
        existing_course.course_id for existing_course in existing_courses
    ]

    if request.method == 'POST':
        for course_id in request.form:
            if course_id != 'action' and course_id in course_dict and course_id not in existing_course_ids:
                db_course = Course(db_lms, course_id, course_dict[course_id])
                db_session.add(db_course)
        db_session.commit()
        return redirect(url_for('lms_admin_courses'))

    return render_template("lms_admin/courses_external.html",
                           courses=courses,
                           existing_course_ids=existing_course_ids,
                           q=q,
                           current_page=current_page,
                           number=number,
                           current_pages=current_pages,
                           per_page=per_page,
                           start=start)