Merge pull request #11941 from CredoReference/invalid-order-in-problem-grade-report-csv
EdX problem grade report doesn't order problems as shown in course
This commit is contained in:
@@ -836,7 +836,7 @@ def _order_problems(blocks):
|
||||
an OrderedDict that maps a problem id to its headers in the final report.
|
||||
"""
|
||||
problems = OrderedDict()
|
||||
assignments = dict()
|
||||
assignments = OrderedDict()
|
||||
# First, sort out all the blocks into their correct assignments and all the
|
||||
# assignments into their correct types.
|
||||
for block in blocks:
|
||||
|
||||
@@ -330,3 +330,13 @@ class TestReportMixin(object):
|
||||
self.assertEqual(csv_rows, expected_rows)
|
||||
else:
|
||||
self.assertItemsEqual(csv_rows, expected_rows)
|
||||
|
||||
def get_csv_row_with_headers(self):
|
||||
"""
|
||||
Helper function to return list with the column names from the CSV file (the first row)
|
||||
"""
|
||||
report_store = ReportStore.from_config(config_name='GRADES_DOWNLOAD')
|
||||
report_csv_filename = report_store.links_for(self.course.id)[0][0]
|
||||
with open(report_store.path_to(self.course.id, report_csv_filename)) as csv_file:
|
||||
rows = unicodecsv.reader(csv_file, encoding='utf-8')
|
||||
return rows.next()
|
||||
|
||||
@@ -17,7 +17,6 @@ import ddt
|
||||
from freezegun import freeze_time
|
||||
from mock import Mock, patch
|
||||
import tempfile
|
||||
import json
|
||||
from openedx.core.djangoapps.course_groups import cohorts
|
||||
import unicodecsv
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -34,11 +33,7 @@ from django.conf import settings
|
||||
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||
from pytz import UTC
|
||||
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
from student.tests.factories import UserFactory
|
||||
from student.models import CourseEnrollment
|
||||
from xmodule.partitions.partitions import Group, UserPartition
|
||||
|
||||
from student.tests.factories import CourseEnrollmentFactory, UserFactory
|
||||
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory
|
||||
import openedx.core.djangoapps.user_api.course_tag.api as course_tag_api
|
||||
from openedx.core.djangoapps.user_api.partition_schemes import RandomUserPartitionScheme
|
||||
@@ -734,6 +729,71 @@ class TestProblemReportSplitTestContent(TestReportMixin, TestConditionalContent,
|
||||
))
|
||||
])
|
||||
|
||||
def test_problem_grade_report_valid_columns_order(self):
|
||||
"""
|
||||
Test that in the CSV grade report columns are placed in the proper order
|
||||
"""
|
||||
grader_num = 7
|
||||
|
||||
self.course = CourseFactory.create(
|
||||
grading_policy={
|
||||
"GRADER": [{
|
||||
"type": "Homework %d" % i,
|
||||
"min_count": 1,
|
||||
"drop_count": 0,
|
||||
"short_label": "HW %d" % i,
|
||||
"weight": 1.0
|
||||
} for i in xrange(1, grader_num)]
|
||||
}
|
||||
)
|
||||
|
||||
# Create users
|
||||
self.student_a = UserFactory.create(username='student_a', email='student_a@example.com')
|
||||
CourseEnrollmentFactory.create(user=self.student_a, course_id=self.course.id)
|
||||
self.student_b = UserFactory.create(username='student_b', email='student_b@example.com')
|
||||
CourseEnrollmentFactory.create(user=self.student_b, course_id=self.course.id)
|
||||
|
||||
problem_vertical_list = []
|
||||
|
||||
for i in xrange(1, grader_num):
|
||||
chapter_name = 'Chapter %d' % i
|
||||
problem_section_name = 'Problem section %d' % i
|
||||
problem_section_format = 'Homework %d' % i
|
||||
problem_vertical_name = 'Problem Unit %d' % i
|
||||
|
||||
chapter = ItemFactory.create(parent_location=self.course.location,
|
||||
display_name=chapter_name)
|
||||
|
||||
# Add a sequence to the course to which the problems can be added
|
||||
problem_section = ItemFactory.create(parent_location=chapter.location,
|
||||
category='sequential',
|
||||
metadata={'graded': True,
|
||||
'format': problem_section_format},
|
||||
display_name=problem_section_name)
|
||||
|
||||
# Create a vertical
|
||||
problem_vertical = ItemFactory.create(
|
||||
parent_location=problem_section.location,
|
||||
category='vertical',
|
||||
display_name=problem_vertical_name
|
||||
)
|
||||
problem_vertical_list.append(problem_vertical)
|
||||
|
||||
problem_names = []
|
||||
for i in xrange(1, grader_num):
|
||||
problem_url = 'test_problem_%d' % i
|
||||
self.define_option_problem(problem_url, parent=problem_vertical_list[i - 1])
|
||||
title = 'Homework %d 1: Problem section %d - %s' % (i, i, problem_url)
|
||||
problem_names.append(title)
|
||||
|
||||
header_row = [u'Student ID', u'Email', u'Username', u'Final Grade']
|
||||
for problem in problem_names:
|
||||
header_row += [problem + ' (Earned)', problem + ' (Possible)']
|
||||
|
||||
with patch('instructor_task.tasks_helper._get_current_task'):
|
||||
upload_problem_grade_report(None, None, self.course.id, None, 'graded')
|
||||
self.assertEquals(self.get_csv_row_with_headers(), header_row)
|
||||
|
||||
|
||||
class TestProblemReportCohortedContent(TestReportMixin, ContentGroupTestCase, InstructorTaskModuleTestCase):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user