Skip to content
Snippets Groups Projects
Unverified Commit 34129e24 authored by Sofiya Semenova's avatar Sofiya Semenova Committed by GitHub
Browse files

Merge pull request #18194 from edx/sofiya/ed-2893

Management command to force enrollment regrade
parents 6e55d272 2baadff2
No related merge requests found
"""
Command to recalculate a user's grades for a course, for every user in
a csv of (user, course) pairs.
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import csv
from django.core.management.base import BaseCommand
from lms.djangoapps.grades.tasks import recalculate_course_and_subsection_grades_for_user
class Command(BaseCommand):
"""
Example usage:
$ ./manage.py lms recalculate_learner_course_grades learner_courses_to_recalculate.csv
"""
help = 'Recalculates a user\'s grades for a course, for every user in a csv of (user, course) pairs'
def add_arguments(self, parser):
parser.add_argument('csv')
def handle(self, *args, **options):
filename = options['csv']
with open(filename) as csv_file:
self.regrade_learner_in_course_from_csv(csv_file)
def regrade_learner_in_course_from_csv(self, csv_file):
csv_reader = csv.DictReader(csv_file)
for row in csv_reader:
recalculate_course_and_subsection_grades_for_user.apply_async(
kwargs={'user_id': row['user_id'], 'course_key': row['course_id']}
)
"""
Tests for recalculate_learner_grades management command.
"""
from tempfile import NamedTemporaryFile
import mock
from lms.djangoapps.grades.management.commands import recalculate_learner_grades
from lms.djangoapps.grades.tests.test_tasks import HasCourseWithProblemsMixin
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory, CourseEnrollmentFactory
DATE_FORMAT = "%Y-%m-%d %H:%M"
class TestRecalculateLearnerGrades(HasCourseWithProblemsMixin, ModuleStoreTestCase):
"""
Tests recalculate learner grades management command.
"""
def setUp(self):
super(TestRecalculateLearnerGrades, self).setUp()
self.command = recalculate_learner_grades.Command()
self.course1 = CourseFactory.create()
self.course2 = CourseFactory.create()
self.course3 = CourseFactory.create()
self.user1 = UserFactory.create()
self.user2 = UserFactory.create()
CourseEnrollmentFactory(course_id=self.course1.id, user=self.user1)
CourseEnrollmentFactory(course_id=self.course1.id, user=self.user2)
CourseEnrollmentFactory(course_id=self.course2.id, user=self.user1)
CourseEnrollmentFactory(course_id=self.course2.id, user=self.user2)
self.user_course_pairs = [
(str(self.user1.id), str(self.course1.id)),
(str(self.user1.id), str(self.course2.id)),
(str(self.user2.id), str(self.course1.id)),
(str(self.user2.id), str(self.course2.id))
]
@mock.patch(
'lms.djangoapps.grades.management.commands.recalculate_learner_grades.'
'recalculate_course_and_subsection_grades_for_user'
)
def test_recalculate_grades(self, task_mock):
with NamedTemporaryFile() as csv:
csv.write("course_id,user_id\n")
csv.writelines(course + "," + user + "\n" for user, course in self.user_course_pairs)
csv.seek(0)
self.command.handle(csv=csv.name)
expected_calls = []
for user, course in self.user_course_pairs:
expected_calls.append(mock.call(
kwargs={
"user_id": user,
"course_key": course
}
))
task_mock.apply_async.assert_has_calls(expected_calls, any_order=True)
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