Grades cleanup before updating grade report
Remove deprecated SingleSectionGrader. TNL-5987 Remove display_name and module_id from Scores objects Update CourseGradeFactory.__init__ to not be user-specific Update some callers to use CourseGrade class instead of "summary" dict Remove no longer needed course_grades.py module. Renamed django signal from GRADES_UPDATED to COURSE_GRADE_CHANGED
This commit is contained in:
@@ -10,7 +10,7 @@ from opaque_keys.edx.keys import CourseKey
|
||||
from xmodule.modulestore.django import SignalHandler
|
||||
|
||||
from openedx.core.djangoapps.credit.verification_access import update_verification_partitions
|
||||
from openedx.core.djangoapps.signals.signals import GRADES_UPDATED
|
||||
from openedx.core.djangoapps.signals.signals import COURSE_GRADE_CHANGED
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -52,14 +52,14 @@ def on_pre_publish(sender, course_key, **kwargs): # pylint: disable=unused-argu
|
||||
log.info(u"Finished updating in-course reverification access rules")
|
||||
|
||||
|
||||
@receiver(GRADES_UPDATED)
|
||||
def listen_for_grade_calculation(sender, user, grade_summary, course_key, deadline, **kwargs): # pylint: disable=unused-argument
|
||||
@receiver(COURSE_GRADE_CHANGED)
|
||||
def listen_for_grade_calculation(sender, user, course_grade, course_key, deadline, **kwargs): # pylint: disable=unused-argument
|
||||
"""Receive 'MIN_GRADE_REQUIREMENT_STATUS' signal and update minimum grade requirement status.
|
||||
|
||||
Args:
|
||||
sender: None
|
||||
user(User): User Model object
|
||||
grade_summary(dict): Dict containing output from the course grader
|
||||
course_grade(CourseGrade): CourseGrade object
|
||||
course_key(CourseKey): The key for the course
|
||||
deadline(datetime): Course end date or None
|
||||
|
||||
@@ -78,7 +78,7 @@ def listen_for_grade_calculation(sender, user, grade_summary, course_key, deadli
|
||||
criteria = requirements[0].get('criteria')
|
||||
if criteria:
|
||||
min_grade = criteria.get('min_grade')
|
||||
passing_grade = grade_summary['percent'] >= min_grade
|
||||
passing_grade = course_grade.percent >= min_grade
|
||||
now = timezone.now()
|
||||
status = None
|
||||
reason = None
|
||||
@@ -89,7 +89,7 @@ def listen_for_grade_calculation(sender, user, grade_summary, course_key, deadli
|
||||
if passing_grade:
|
||||
# Student received a passing grade
|
||||
status = 'satisfied'
|
||||
reason = {'final_grade': grade_summary['percent']}
|
||||
reason = {'final_grade': course_grade.percent}
|
||||
else:
|
||||
# Submission after deadline
|
||||
|
||||
@@ -104,7 +104,7 @@ def listen_for_grade_calculation(sender, user, grade_summary, course_key, deadli
|
||||
# Student failed to receive minimum grade
|
||||
status = 'failed'
|
||||
reason = {
|
||||
'final_grade': grade_summary['percent'],
|
||||
'final_grade': course_grade.percent,
|
||||
'minimum_grade': min_grade
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ Tests for minimum grade requirement status
|
||||
import ddt
|
||||
import pytz
|
||||
from datetime import timedelta, datetime
|
||||
from mock import MagicMock
|
||||
from unittest import skipUnless
|
||||
|
||||
from django.conf import settings
|
||||
@@ -73,7 +74,9 @@ class TestMinGradedRequirementStatus(ModuleStoreTestCase):
|
||||
|
||||
def assert_requirement_status(self, grade, due_date, expected_status):
|
||||
""" Verify the user's credit requirement status is as expected after simulating a grading calculation. """
|
||||
listen_for_grade_calculation(None, self.user, {'percent': grade}, self.course.id, due_date)
|
||||
course_grade = MagicMock()
|
||||
course_grade.percent = grade
|
||||
listen_for_grade_calculation(None, self.user, course_grade, self.course.id, due_date)
|
||||
req_status = get_credit_requirement_status(self.course.id, self.request.user.username, 'grade', 'grade')
|
||||
|
||||
self.assertEqual(req_status[0]['status'], expected_status)
|
||||
|
||||
@@ -5,8 +5,8 @@ This module contains all signals.
|
||||
from django.dispatch import Signal
|
||||
|
||||
|
||||
# Signal that fires when a user is graded (in lms/grades/course_grades.py)
|
||||
GRADES_UPDATED = Signal(providing_args=["user", "grade_summary", "course_key", "deadline"])
|
||||
# Signal that fires when a user is graded
|
||||
COURSE_GRADE_CHANGED = Signal(providing_args=["user", "course_grade", "course_key", "deadline"])
|
||||
|
||||
# Signal that fires when a user is awarded a certificate in a course (in the certificates django app)
|
||||
# TODO: runtime coupling between apps will be reduced if this event is changed to carry a username
|
||||
|
||||
Reference in New Issue
Block a user