diff --git a/common/djangoapps/student/management/commands/get_grades.py b/common/djangoapps/student/management/commands/get_grades.py index f0d5b5ec5d..e24fef26e3 100644 --- a/common/djangoapps/student/management/commands/get_grades.py +++ b/common/djangoapps/student/management/commands/get_grades.py @@ -1,4 +1,5 @@ from courseware import grades, courses +from certificates.models import GeneratedCertificate from django.test.client import RequestFactory from django.core.management.base import BaseCommand, CommandError import os @@ -28,6 +29,13 @@ class Command(BaseCommand): Generate a list of grades for all students 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. Example: @@ -57,8 +65,7 @@ class Command(BaseCommand): course_id = options['course'] print "Fetching enrolled students for {0}".format(course_id) enrolled_students = User.objects.filter( - courseenrollment__course_id=course_id).prefetch_related( - "groups").order_by('username') + courseenrollment__course_id=course_id) factory = RequestMock() request = factory.get('/') @@ -69,6 +76,11 @@ class Command(BaseCommand): start = datetime.datetime.now() rows = [] 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): count += 1 if count % STATUS_INTERVAL == 0: @@ -86,10 +98,13 @@ class Command(BaseCommand): grade = grades.grade(student, request, course) if not header: 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']} 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: writer = csv.writer(f) writer.writerows(rows)