Commit 39d441e1 by John Jarvis

Merge pull request #765 from edx/jarv/grade-dump

Jarv/grade dump
parents b1a76f12 6ba85765
from courseware import grades, courses from courseware import grades, courses
from certificates.models import GeneratedCertificate
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
import os import os
...@@ -28,6 +29,13 @@ class Command(BaseCommand): ...@@ -28,6 +29,13 @@ class Command(BaseCommand):
Generate a list of grades for all students Generate a list of grades for all students
that are enrolled in a course. that are enrolled in a course.
CSV will include the following:
- username
- email
- grade in the certificate table if it exists
- computed grade
- grade breakdown
Outputs grades to a csv file. Outputs grades to a csv file.
Example: Example:
...@@ -57,8 +65,7 @@ class Command(BaseCommand): ...@@ -57,8 +65,7 @@ class Command(BaseCommand):
course_id = options['course'] course_id = options['course']
print "Fetching enrolled students for {0}".format(course_id) print "Fetching enrolled students for {0}".format(course_id)
enrolled_students = User.objects.filter( enrolled_students = User.objects.filter(
courseenrollment__course_id=course_id).prefetch_related( courseenrollment__course_id=course_id)
"groups").order_by('username')
factory = RequestMock() factory = RequestMock()
request = factory.get('/') request = factory.get('/')
...@@ -69,6 +76,11 @@ class Command(BaseCommand): ...@@ -69,6 +76,11 @@ class Command(BaseCommand):
start = datetime.datetime.now() start = datetime.datetime.now()
rows = [] rows = []
header = None header = None
print "Fetching certificate data"
cert_grades = {cert.user.username: cert.grade
for cert in list(GeneratedCertificate.objects.filter(
course_id=course_id).prefetch_related('user'))}
print "Grading students"
for count, student in enumerate(enrolled_students): for count, student in enumerate(enrolled_students):
count += 1 count += 1
if count % STATUS_INTERVAL == 0: if count % STATUS_INTERVAL == 0:
...@@ -86,10 +98,13 @@ class Command(BaseCommand): ...@@ -86,10 +98,13 @@ class Command(BaseCommand):
grade = grades.grade(student, request, course) grade = grades.grade(student, request, course)
if not header: if not header:
header = [section['label'] for section in grade[u'section_breakdown']] header = [section['label'] for section in grade[u'section_breakdown']]
rows.append(["email", "username"] + header) rows.append(["email", "username", "certificate-grade", "grade"] + header)
percents = {section['label']: section['percent'] for section in grade[u'section_breakdown']} percents = {section['label']: section['percent'] for section in grade[u'section_breakdown']}
row_percents = [percents[label] for label in header] row_percents = [percents[label] for label in header]
rows.append([student.email, student.username] + row_percents) if student.username in cert_grades:
rows.append([student.email, student.username, cert_grades[student.username], grade['percent']] + row_percents)
else:
rows.append([student.email, student.username, "N/A", grade['percent']] + row_percents)
with open(options['output'], 'wb') as f: with open(options['output'], 'wb') as f:
writer = csv.writer(f) writer = csv.writer(f)
writer.writerows(rows) writer.writerows(rows)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment