def _update(user, course_data, force_update_subsections=False): """ Computes, saves, and returns a CourseGrade object for the given user and course. Sends a COURSE_GRADE_CHANGED signal to listeners and COURSE_GRADE_NOW_PASSED if learner has passed course or COURSE_GRADE_NOW_FAILED if learner is now failing course """ should_persist = should_persist_grades(course_data.course_key) if should_persist and force_update_subsections: prefetch(user, course_data.course_key) course_grade = CourseGrade( user, course_data, force_update_subsections=force_update_subsections ) course_grade = course_grade.update() should_persist = should_persist and course_grade.attempted if should_persist: course_grade._subsection_grade_factory.bulk_create_unsaved() PersistentCourseGrade.update_or_create( user_id=user.id, course_id=course_data.course_key, course_version=course_data.version, course_edited_timestamp=course_data.edited_on, grading_policy_hash=course_data.grading_policy_hash, percent_grade=course_grade.percent, letter_grade=course_grade.letter_grade or "", passed=course_grade.passed, ) COURSE_GRADE_CHANGED.send_robust( sender=None, user=user, course_grade=course_grade, course_key=course_data.course_key, deadline=course_data.course.end, ) if course_grade.passed: COURSE_GRADE_NOW_PASSED.send( sender=CourseGradeFactory, user=user, course_id=course_data.course_key, ) else: COURSE_GRADE_NOW_FAILED.send( sender=CourseGradeFactory, user=user, course_id=course_data.course_key, grade=course_grade, ) log.info( u'Grades: Update, %s, User: %s, %s, persisted: %s', course_data.full_string(), user.id, course_grade, should_persist, ) return course_grade
def _update(user, course_data, force_update_subsections=False): """ Computes, saves, and returns a CourseGrade object for the given user and course. Sends a COURSE_GRADE_CHANGED signal to listeners and COURSE_GRADE_NOW_PASSED if learner has passed course or COURSE_GRADE_NOW_FAILED if learner is now failing course """ should_persist = should_persist_grades(course_data.course_key) if should_persist and force_update_subsections: prefetch_grade_overrides_and_visible_blocks(user, course_data.course_key) course_grade = CourseGrade( user, course_data, force_update_subsections=force_update_subsections ) course_grade = course_grade.update() should_persist = should_persist and course_grade.attempted if should_persist: course_grade._subsection_grade_factory.bulk_create_unsaved() # lint-amnesty, pylint: disable=protected-access PersistentCourseGrade.update_or_create( user_id=user.id, course_id=course_data.course_key, course_version=course_data.version, course_edited_timestamp=course_data.edited_on, grading_policy_hash=course_data.grading_policy_hash, percent_grade=course_grade.percent, letter_grade=course_grade.letter_grade or "", passed=course_grade.passed, ) COURSE_GRADE_CHANGED.send_robust( sender=None, user=user, course_grade=course_grade, course_key=course_data.course_key, deadline=course_data.course.end, ) if course_grade.passed: COURSE_GRADE_NOW_PASSED.send( sender=CourseGradeFactory, user=user, course_id=course_data.course_key, ) else: COURSE_GRADE_NOW_FAILED.send( sender=CourseGradeFactory, user=user, course_id=course_data.course_key, grade=course_grade, ) log.info( 'Grades: Update, %s, User: %s, %s, persisted: %s', course_data.full_string(), user.id, course_grade, should_persist, ) return course_grade
def _update(user, course_data, read_only, force_update_subsections=False): """ Computes, saves, and returns a CourseGrade object for the given user and course. Sends a COURSE_GRADE_CHANGED signal to listeners and a COURSE_GRADE_NOW_PASSED if learner has passed course. """ course_grade = CourseGrade( user, course_data, force_update_subsections=force_update_subsections) course_grade.update() should_persist = (( not read_only ) and # TODO(TNL-6786) Remove the read_only boolean once all grades are back-filled. should_persist_grades(course_data.course_key) and (not waffle().is_enabled(WRITE_ONLY_IF_ENGAGED) or course_grade.attempted)) if should_persist: course_grade._subsection_grade_factory.bulk_create_unsaved() PersistentCourseGrade.update_or_create( user_id=user.id, course_id=course_data.course_key, course_version=course_data.version, course_edited_timestamp=course_data.edited_on, grading_policy_hash=course_data.grading_policy_hash, percent_grade=course_grade.percent, letter_grade=course_grade.letter_grade or "", passed=course_grade.passed, ) COURSE_GRADE_CHANGED.send_robust( sender=None, user=user, course_grade=course_grade, course_key=course_data.course_key, deadline=course_data.course.end, ) if course_grade.passed: COURSE_GRADE_NOW_PASSED.send( sender=CourseGradeFactory, user=user, course_id=course_data.course_key, ) log.info( u'Grades: Update, %s, User: %s, %s, persisted: %s', course_data.full_string(), user.id, course_grade, should_persist, ) return course_grade
def _signal_listeners_when_grade_computed(self): """ Signal all listeners when grades are computed. """ responses = COURSE_GRADE_CHANGED.send_robust( sender=None, user=self.student, course_grade=self, course_key=self.course.id, deadline=self.course.end ) for receiver, response in responses: log.debug("Signal fired when student grade is calculated. Receiver: %s. Response: %s", receiver, response)
def _signal_listeners_when_grade_computed(self): """ Signal all listeners when grades are computed. """ responses = COURSE_GRADE_CHANGED.send_robust(sender=None, user=self.student, course_grade=self, course_key=self.course.id, deadline=self.course.end) for receiver, response in responses: log.debug( 'Signal fired when student grade is calculated. Receiver: %s. Response: %s', receiver, response)