From 2ce9e7ca1d3cc9436107a986f10c23135fa444e8 Mon Sep 17 00:00:00 2001 From: Will Robertson Date: Sun, 26 Feb 2017 16:04:23 -0600 Subject: [PATCH 1/3] Indicate is submission was made by a staff member in admin view --- server/templates/staff/student/assignment.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/templates/staff/student/assignment.html b/server/templates/staff/student/assignment.html index 1cdf1932b..bb23f14de 100644 --- a/server/templates/staff/student/assignment.html +++ b/server/templates/staff/student/assignment.html @@ -211,7 +211,11 @@

Backups/Submissions

{{ utils.local_time(item.created, current_course) }} - {{ item.submitter.email }} + {% if item.creator %} + {{ item.creator.email }}
on behalf of
{{ item.submitter.email }} + {% else %} + {{ item.submitter.email }} + {% endif %} {% call helpers.backup_link(item.id) %} {% if item.id == assign_status.final_subm.id %} From ba5ea402482753e46f5d885b87c43b9e40a32bec Mon Sep 17 00:00:00 2001 From: Will Robertson Date: Sat, 25 Mar 2017 09:18:23 -0500 Subject: [PATCH 2/3] List students that have submissions but are unenrolled --- server/controllers/admin.py | 22 +++++- server/models.py | 6 +- server/templates/staff/course/course.html | 6 ++ .../enrollment/enrollment.unenrolled.html | 71 +++++++++++++++++++ tests/test_web.py | 6 ++ 5 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 server/templates/staff/course/enrollment/enrollment.unenrolled.html diff --git a/server/controllers/admin.py b/server/controllers/admin.py index 54d44de7a..6245e863c 100644 --- a/server/controllers/admin.py +++ b/server/controllers/admin.py @@ -450,7 +450,7 @@ def assignment_stats(cid, aid): return abort(401) stats = Assignment.assignment_stats(assign.id) - + submissions = [d for d in stats.pop('raw_data')] pie_chart = pygal.Pie(half_pie=True, disable_xml_declaration=True, @@ -941,7 +941,7 @@ def enrollment(cid): students = current_course.get_students() staff = current_course.get_staff() lab_assistants = current_course.get_participants([LAB_ASSISTANT_ROLE]) - + return render_template('staff/course/enrollment/enrollment.html', enrollments=students, staff=staff, lab_assistants=lab_assistants, @@ -1043,6 +1043,24 @@ def client(client_id): return redirect(url_for(".clients")) return render_template('staff/edit_client.html', client=client, form=form, courses=courses) +@admin.route("/course//unenrolled", methods=['GET']) +@is_staff(course_arg='cid') +def unenrolled(cid): + courses, current_course = get_courses(cid) + + submissions = set(b.submitter_id for b in (Backup.query.join(Backup.assignment).filter(Assignment.course_id == cid).all())) + enrollment = set(e.user_id for e in (Enrollment.query.filter(Enrollment.course_id == cid).all())) + unenrolled_submitters = [] + + for s in submissions: + if s not in enrollment: + unenrolled_submitters.append(User.query.get(s)) + + return render_template('staff/course/enrollment/enrollment.unenrolled.html', + current_course=current_course, + unenrolled_submitters=unenrolled_submitters, + title="Submitter") + ################ # Student View # ################ diff --git a/server/models.py b/server/models.py index 60cbe1a41..1353e3d9d 100644 --- a/server/models.py +++ b/server/models.py @@ -408,7 +408,7 @@ def assignment_stats(assign_id, detailed=True): 'active_groups': active_groups, 'percent_groups_active': active_groups/(stats['groups'] or 1) }) - + if detailed: stats.update({ 'raw_data': data @@ -562,10 +562,10 @@ def course_submissions(self, include_empty=True): current_db = db.engine.name if current_db != 'mysql': return self.course_submissions_slow(include_empty=include_empty) - + # Can only run the fast query on MySQL submissions = [] - + stats = self.mysql_course_submissions_query() keys = stats.keys() for r in stats: diff --git a/server/templates/staff/course/course.html b/server/templates/staff/course/course.html index 85b1617f7..191b4cdc6 100644 --- a/server/templates/staff/course/course.html +++ b/server/templates/staff/course/course.html @@ -91,6 +91,12 @@

Quick Links

Enrollment +
  • + + + Un-Enrolled Submitters + +
  • diff --git a/server/templates/staff/course/enrollment/enrollment.unenrolled.html b/server/templates/staff/course/enrollment/enrollment.unenrolled.html new file mode 100644 index 000000000..f524ebd0a --- /dev/null +++ b/server/templates/staff/course/enrollment/enrollment.unenrolled.html @@ -0,0 +1,71 @@ +{% extends "staff/base.html" %} +{% import 'staff/_formhelpers.html' as forms %} + +{% block title %} Un-Enrolled Submitters - {{ current_course.display_name_with_semester }}{% endblock %} + +{% block main %} +
    +

    + {{ current_course.display_name_with_semester }} Un-Enrolled Submitters + {{ current_course.offering }} +

    +
    +
    +
    + {% include 'alerts.html' %} +
    +
    +
    +
    +

    {{ title }}

    +
    +
    + +
    +
    +
    + + +
    + + + + + + + + {% for unenrolled_submitter in unenrolled_submitters %} + + + + + {% endfor %} + +
    UserSID
    {{ unenrolled_submitter.id }}
    +
    + + + +
    +
    +
    + +
    +{% endblock %} diff --git a/tests/test_web.py b/tests/test_web.py index a017d7734..f0ca3ec99 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -382,6 +382,12 @@ def test_admin_enrollment(self): self.assertTrue(self.course.offering in self.driver.page_source) self.assertTrue('Export Roster' in self.driver.page_source) + def test_admin_enrollment_unenrolled(self): + self._login(role="admin") + self.page_load(self.get_server_url() + "/admin/course/1/unenrolled") + self.assertIn('Un-Enrolled', self.driver.title) + self.assertTrue(self.course.offering in self.driver.page_source) + def test_admin_student_overview(self): self._login(role="admin") self.page_load(self.get_server_url() + "/admin/course/1/{}".format(self.user1.email)) From 0cb91aac17d97645f5fc9fa47a83fad205c6de16 Mon Sep 17 00:00:00 2001 From: Will Robertson Date: Sun, 26 Mar 2017 14:20:07 -0500 Subject: [PATCH 3/3] Improve performance of finding un-enrolled submitters --- server/controllers/admin.py | 16 ++++++++++------ .../course/enrollment/enrollment.unenrolled.html | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/server/controllers/admin.py b/server/controllers/admin.py index 6245e863c..462b253ec 100644 --- a/server/controllers/admin.py +++ b/server/controllers/admin.py @@ -1048,14 +1048,18 @@ def client(client_id): def unenrolled(cid): courses, current_course = get_courses(cid) - submissions = set(b.submitter_id for b in (Backup.query.join(Backup.assignment).filter(Assignment.course_id == cid).all())) - enrollment = set(e.user_id for e in (Enrollment.query.filter(Enrollment.course_id == cid).all())) unenrolled_submitters = [] - + staff = set(s.user for s in current_course.get_staff()) + lab_assistants = set(l.user for l in current_course.get_participants([LAB_ASSISTANT_ROLE])) + students = set(e.user for e in current_course.get_students()) + + submissions = Backup.query.join(Backup.assignment).filter(Assignment.course_id == cid).all() + submissions = set(User.query.get(b.submitter_id) for b in submissions) + for s in submissions: - if s not in enrollment: - unenrolled_submitters.append(User.query.get(s)) - + if s not in students and s not in staff and s not in lab_assistants: + unenrolled_submitters.append(s) + return render_template('staff/course/enrollment/enrollment.unenrolled.html', current_course=current_course, unenrolled_submitters=unenrolled_submitters, diff --git a/server/templates/staff/course/enrollment/enrollment.unenrolled.html b/server/templates/staff/course/enrollment/enrollment.unenrolled.html index f524ebd0a..bbf2278b6 100644 --- a/server/templates/staff/course/enrollment/enrollment.unenrolled.html +++ b/server/templates/staff/course/enrollment/enrollment.unenrolled.html @@ -39,7 +39,7 @@

    {{ title }}

    - + @@ -50,7 +50,7 @@

    {{ title }}

    {{ unenrolled_submitter.email }} - + {% endfor %}
    UserSIDName
    {{ unenrolled_submitter.id }}{{ unenrolled_submitter.name }}