示例#1
0
def _create_config_large(course_id, period_id):
    """ Create any needed groups/configs for a large course
    """

    # large
    #    Create a staff group set to (unconfigured) feed
    #           COURSE_name_STAFF_feed_period
    #    Create an adhoc staff group
    #           COURSE_name_STAFF_period
    #    Create a student group set to ad-hoc
    #           COURSE_name_ADHOC_period
    #    Create a student group set to (unconfigured) feed
    #           COURSE_name_feed_period

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'],)
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'],)
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#2
0
def cadmin_exam_results(course_id, exam_id):
    """ View the results of an assessment """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    exam = Exams.get_exam_struct(exam_id, course_id)
    if not exam:
        abort(404)

    if not int(exam['cid']) == int(course_id):
        flash("Assessment %s does not belong to this course." % int(exam_id))
        return redirect(url_for('cadmin_top', course_id=course_id))

    exam['start_date'] = int(date_from_py2js(exam['start']))
    exam['end_date'] = int(date_from_py2js(exam['end']))
    exam['start_hour'] = int(exam['start'].hour)
    exam['end_hour'] = int(exam['end'].hour)
    exam['start_minute'] = int(exam['start'].minute)
    exam['end_minute'] = int(exam['end'].minute)

    groups = [
        Groups.Group(g_id=g_id) for g_id in Groups.active_by_course(course_id)
    ]
    results = {}
    uids = set([])
    totals = {}
    for group in groups:
        results[group.id] = Exams.get_marks(group, exam_id)
        for user_id in results[group.id]:
            uids.add(user_id)
            if user_id not in totals:
                totals[user_id] = 0.0
            for qt, val in results[group.id][user_id].iteritems():
                totals[user_id] += val['score']

    questions = Exams.get_qts_list(exam_id)
    users = {}
    for uid in uids:
        users[uid] = Users2.get_user(uid)
    return render_template("cadmin_examresults.html",
                           course=course,
                           exam=exam,
                           results=results,
                           groups=groups,
                           users=users,
                           questions=questions,
                           when=datetime.now().strftime("%H:%m, %a %d %b %Y"),
                           totals=totals)
示例#3
0
def cadmin_editgroup_member(course_id, group_id):
    """ Perform operation on group member. Remove/Edit/Etc
    """
    cur_user = session['user_id']
    group = None
    try:
        group = Groups.Group(g_id=group_id)
    except KeyError:
        abort(404)

    if not group:
        abort(404)

    done = False
    cmds = request.form.keys()
    #  "remove_UID", only know how to remove for now.
    for cmd in cmds:
        if '_' in cmd:
            op, uid = cmd.split("_", 1)
            if op == "remove":
                uid = int(uid)
                user = Users2.get_user(uid)
                L.info("courseadmin: user %s removed from group %s by %s" %
                       (uid, group_id, cur_user))
                group.remove_member(uid)
                flash("%s removed from group" % user['uname'])
                done = True

    if not done:
        flash("No actions?")
    return redirect(
        url_for('cadmin_editgroup', course_id=course_id, group_id=group_id))
示例#4
0
def cadmin_editgroup_addperson(course_id, group_id):
    """ Add a person to the group.
    """
    group = None
    try:
        group = Groups.Group(g_id=group_id)
    except KeyError:
        abort(404)

    if not group:
        abort(404)

    if "uname" not in request.form:
        abort(400)

    new_uname = sanitize_username(request.form['uname'])
    try:
        new_uid = Users2.uid_by_uname(new_uname)
    except KeyError:
        flash("User '%s' Not Found" % new_uname)
    else:
        if not new_uid:
            flash("User '%s' Not Found" % new_uname)
        elif new_uid in group.members():
            flash("%s is already in the group." % new_uname)
        else:
            group.add_member(new_uid)
            flash("Added %s to group." % (new_uname, ))

    return redirect(
        url_for('cadmin_editgroup', course_id=course_id, group_id=group_id))
示例#5
0
def cadmin_export_csv(course_id, exam_id, group_id):
    """ Send the group results as a CSV file """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    exam = Exams.get_exam_struct(exam_id, course_id)
    if not exam:
        abort(404)

    if not int(exam['cid']) == int(course_id):
        flash("Assessment %s does not belong to this course." % int(exam_id))
        return redirect(url_for('cadmin_top', course_id=course_id))

    group = Groups.Group(g_id=group_id)
    output = Spreadsheets.exam_results_as_spreadsheet(course_id, group,
                                                      exam_id)

    response = make_response(output)
    response.headers.add(
        'Content-Type',
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8"
    )
    response.headers.add(
        'Content-Disposition',
        'attachment; filename="OASIS_%s_%s_Results.xlsx"' %
        (course.title, exam.title))

    return response
示例#6
0
def cadmin_top(course_id):
    """ Present top level course admin page """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    user_id = session['user_id']
    is_sysadmin = check_perm(user_id, -1, 'sysadmin')

    topics = Courses2.get_topics_list(course_id)
    exams = [
        Exams.get_exam_struct(exam_id, course_id)
        for exam_id in Courses.get_exams(course_id, prev_years=False)
    ]

    exams.sort(key=lambda y: y['start_epoch'], reverse=True)
    groups = Courses.get_groups(course_id)
    choosegroups = [
        group for group in Groups.all_groups() if group.id not in groups
    ]
    return render_template("courseadmin_top.html",
                           course=course,
                           topics=topics,
                           exams=exams,
                           choosegroups=choosegroups,
                           groups=groups,
                           is_sysadmin=is_sysadmin)
示例#7
0
def cadmin_top(course_id):
    """ Present top level course admin page """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    user_id = session['user_id']
    is_sysadmin = check_perm(user_id, -1, 'sysadmin')

    topics = Courses2.get_topics_list(course_id)
    exams = [Exams.get_exam_struct(exam_id, course_id)
             for exam_id in Courses.get_exams(course_id, prev_years=False)]

    exams.sort(key=lambda y: y['start_epoch'], reverse=True)
    groups = Courses.get_groups(course_id)
    choosegroups = [group
                    for group in Groups.all_groups()
                    if group.id not in groups]
    return render_template(
        "courseadmin_top.html",
        course=course,
        topics=topics,
        exams=exams,
        choosegroups=choosegroups,
        groups=groups,
        is_sysadmin=is_sysadmin
    )
示例#8
0
    def test_create_group(self):
        """ Fetch a group back and check it
        """

        period1 = Periods.Period(name="Period 01",
                                 title="Test 01",
                                 start=datetime.datetime.now(),
                                 finish=datetime.datetime.now(),
                                 code="CODE1"
                                 )
        period1.save()

        period2 = Periods.Period(name="Period 01")
        self.assertTrue(period2)
        self.assertEqual(period2.title, "Test 01")

        period3 = Periods.Period(code="CODE1")
        self.assertEqual(period2.title, "Test 01")

        self.assertEqual(period2.id, period3.id)

        period4 = Periods.Period(period2.id)
        self.assertEqual(period2.start, period4.start)

        name = "TESTGROUP1"
        title = "Test Group 01"
        gtype = 1
        source = None
        feed = None
        feed_args = ""

        self.assertFalse(Groups.get_ids_by_name(name))
        group = Groups.Group(g_id=0)
        group.name = name
        group.title = title
        group.gtype = gtype
        group.source = source
        group.period = period2.id
        group.feed = feed
        group.feedargs = feed_args
        group.active = True

        group.save()

        self.assertTrue(Groups.get_ids_by_name(name))
示例#9
0
def _create_config_casual(course_id, period_id):
    """ Create any needed groups/configs for a casual course
    """

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'],)
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_ADHOC_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'],)
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#10
0
def cadmin_course_add_group(course_id):
    """ We've been asked to add a group to the course.
    """
    group_id = int(request.form.get("addgroup", "0"))
    if not group_id:
        flash("No group selected")
        return redirect(url_for('cadmin_config', course_id=course_id))

    Courses.add_group(group_id, course_id)
    group = Groups.Group(group_id)
    flash("Group %s added" % (group.name, ))
    return redirect(url_for('cadmin_config', course_id=course_id))
示例#11
0
def cadmin_exam_results(course_id, exam_id):
    """ View the results of an assessment """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    exam = Exams.get_exam_struct(exam_id, course_id)
    if not exam:
        abort(404)

    if not int(exam['cid']) == int(course_id):
        flash("Assessment %s does not belong to this course." % int(exam_id))
        return redirect(url_for('cadmin_top', course_id=course_id))

    exam['start_date'] = int(date_from_py2js(exam['start']))
    exam['end_date'] = int(date_from_py2js(exam['end']))
    exam['start_hour'] = int(exam['start'].hour)
    exam['end_hour'] = int(exam['end'].hour)
    exam['start_minute'] = int(exam['start'].minute)
    exam['end_minute'] = int(exam['end'].minute)

    groups = [Groups.Group(g_id=g_id)
              for g_id
              in Groups.active_by_course(course_id)]
    results = {}
    uids = set([])
    totals = {}
    for group in groups:
        results[group.id] = Exams.get_marks(group, exam_id)
        for user_id in results[group.id]:
            uids.add(user_id)
            if user_id not in totals:
                totals[user_id] = 0.0
            for qt, val in results[group.id][user_id].iteritems():
                totals[user_id] += val['score']

    questions = Exams.get_qts_list(exam_id)
    users = {}
    for uid in uids:
        users[uid] = Users2.get_user(uid)
    return render_template(
        "cadmin_examresults.html",
        course=course,
        exam=exam,
        results=results,
        groups=groups,
        users=users,
        questions=questions,
        when=datetime.now().strftime("%H:%m, %a %d %b %Y"),
        totals=totals
    )
示例#12
0
def cadmin_group_detach(course_id, group_id):
    """ Mark the course as inactive
    """
    course = None
    try:
        course = Courses2.get_course(course_id)
    except KeyError:
        abort(404)

    if not course:
        abort(404)

    group = Groups.Group(g_id=group_id)
    Courses.del_group(group_id, course_id)
    flash("Group %s removed from course" % (group.name, ))
    return redirect(url_for("cadmin_config", course_id=course_id))
示例#13
0
def group_update_from_feed(group_id, refresh_users=False):
    """ Update group membership from it's feed
        Returns (added, removed, unknown) with usernames of users
    """
    group = Groups.Group(g_id=group_id)
    if not group.source == 'feed':
        return

    feed = Feeds.Feed(f_id=group.feed)
    scriptrun = ' '.join([feed.script, group.feedargs])
    try:
        output = feeds_run_group_script(feed.script, args=[group.feedargs, ])
    except BaseException as err:
        L.error("Exception in group feed '%s': %s" % (scriptrun, err))
        raise

    removed = []
    added = []
    unknown = []
    old_members = group.member_unames()
    new_members = output.split()[1:]
    for uname in new_members:
        uid = Users2.uid_by_uname(uname)
        if not uid:
            users_update_from_feed([uname, ])
            L.info("Group feed contained unknown user account %s" % uname)
            unknown.append(uname)
            continue
        if uname not in old_members:
            group.add_member(uid)
            added.append(uname)

    for uname in old_members:
        if uname not in new_members:
            uid = Users2.uid_by_uname(uname)
            group.remove_member(uid)
            removed.append(uname)

    if refresh_users:
        for uname in group.member_unames():
            uid = Users2.uid_by_uname(uname)
            user_update_details_from_feed(uid, uname)

    return added, removed, unknown
示例#14
0
文件: Courses.py 项目: ehchua/oasisqe
def _create_config_large(course_id, period_id):
    """ Create any needed groups/configs for a large course
    """

    # large
    #    Create a staff group set to (unconfigured) feed
    #           COURSE_name_STAFF_feed_period
    #    Create an adhoc staff group
    #           COURSE_name_STAFF_period
    #    Create a student group set to ad-hoc
    #           COURSE_name_ADHOC_period
    #    Create a student group set to (unconfigured) feed
    #           COURSE_name_feed_period

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'], )
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'], )
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#15
0
def cadmin_config(course_id):
    """ Allow some course configuration """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    user_id = session["user_id"]
    is_sysadmin = check_perm(user_id, -1, "sysadmin")
    coords = [
        Users2.get_user(perm[0]) for perm in Permissions.get_course_perms(course_id) if perm[1] == 3
    ]  # course_coord
    groups = Courses.get_groups(course_id)
    choosegroups = [group for group in Groups.all_groups() if not group.id in groups]
    return render_template(
        "courseadmin_config.html",
        course=course,
        coords=coords,
        choosegroups=choosegroups,
        groups=groups,
        is_sysadmin=is_sysadmin,
    )
示例#16
0
def cadmin_editgroup(course_id, group_id):
    """ Present a page for editing a group, membership, etc.
    """
    group = None
    try:
        group = Groups.Group(group_id)
    except KeyError:
        abort(404)

    if not group:
        abort(404)

    course = Courses2.get_course(course_id)
    if not course:
        abort(404)
    ulist = group.members()
    members = [Users2.get_user(uid) for uid in ulist]
    return render_template("courseadmin_editgroup.html",
                           course=course,
                           group=group,
                           members=members)
示例#17
0
def cadmin_config(course_id):
    """ Allow some course configuration """
    course = Courses2.get_course(course_id)
    if not course:
        abort(404)

    user_id = session['user_id']
    is_sysadmin = check_perm(user_id, -1, 'sysadmin')
    coords = [
        Users2.get_user(perm[0])
        for perm in Permissions.get_course_perms(course_id) if perm[1] == 3
    ]  # course_coord
    groups = Courses.get_groups(course_id)
    choosegroups = [
        group for group in Groups.all_groups() if group.id not in groups
    ]
    return render_template("courseadmin_config.html",
                           course=course,
                           coords=coords,
                           choosegroups=choosegroups,
                           groups=groups,
                           is_sysadmin=is_sysadmin)
示例#18
0
文件: Courses.py 项目: ehchua/oasisqe
def _create_config_casual(course_id, period_id):
    """ Create any needed groups/configs for a casual course
    """

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'], )
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_ADHOC_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'], )
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()
    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#19
0
文件: Courses.py 项目: ehchua/oasisqe
def _create_config_demonstration(course_id, period_id):
    """ Create any needed groups/configs for a demonstration course
    """

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'], )
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An Open Registration student group
    name = "C_%s_OPEN_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students, Self Registered" % (course['name'], )
    group.gtype = 2  # enrolment
    group.source = "open"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_ADHOC_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'], )
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#20
0
文件: Courses.py 项目: ehchua/oasisqe
def get_groups(course_id):
    """ Return a dict of groups currently attached to this course."""

    return Groups.active_by_course(course_id)
示例#21
0
文件: Courses.py 项目: ehchua/oasisqe
def get_users(course_id):
    """ Return a list of users in the course"""
    allusers = []
    for g_id, group in Groups.active_by_course(course_id).iteritems():
        allusers.append(group.members())
    return allusers
示例#22
0
def _create_config_demonstration(course_id, period_id):
    """ Create any needed groups/configs for a demonstration course
    """

    course = get_course(course_id)
    # An ad-hoc Staff group
    name = "C_%s_STAFF_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Staff" % (course['name'],)
    group.gtype = 1  # staff
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An Open Registration student group
    name = "C_%s_OPEN_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students, Self Registered" % (course['name'],)
    group.gtype = 2  # enrolment
    group.source = "open"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)

    # An ad-hoc student group
    name = "C_%s_ADHOC_%s" % (course['name'], period_id)
    group = Groups.get_by_name(name)
    if not group:
        group = Groups.Group(g_id=0)

    group.name = name
    group.title = "%s, Students" % (course['name'],)
    group.gtype = 2  # student
    group.source = "adhoc"
    group.period = period_id
    group.feed = None
    group.feedargs = ""
    group.active = True
    group.save()

    group = Groups.get_by_name(name)
    add_group(group.id, course_id)
示例#23
0
def get_groups(course_id):
    """ Return a dict of groups currently attached to this course."""

    return Groups.active_by_course(course_id)
示例#24
0
def get_users(course_id):
    """ Return a list of users in the course"""
    allusers = []
    for g_id, group in Groups.active_by_course(course_id).iteritems():
        allusers.append(group.members())
    return allusers