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)
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))
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))
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
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)
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))
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)
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))
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
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)
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)