@@ -461,7 +461,7 @@ def bulk_read_grades(cls, user_id, course_key):
461461 )
462462
463463 @classmethod
464- def update_or_create_grade (cls , ** params ):
464+ def update_or_create_grade (cls , grading_policy_hash = None , ** params ):
465465 """
466466 Wrapper for objects.update_or_create.
467467 """
@@ -490,11 +490,11 @@ def update_or_create_grade(cls, **params):
490490 grade .save ()
491491
492492 cls ._emit_grade_calculated_event (grade )
493- cls ._emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks )
493+ cls ._emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks , grading_policy_hash )
494494 return grade
495495
496496 @classmethod
497- def bulk_create_grades (cls , grade_params_iter , user_id , course_key ):
497+ def bulk_create_grades (cls , grade_params_iter , user_id , course_key , grading_policy_hash = None ):
498498 """
499499 Bulk creation of grades.
500500 """
@@ -514,7 +514,7 @@ def bulk_create_grades(cls, grade_params_iter, user_id, course_key):
514514 grades = cls .objects .bulk_create (grades )
515515 for grade , visible_blocks in zip (grades , visible_blocks_list , strict = True ):
516516 cls ._emit_grade_calculated_event (grade )
517- cls ._emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks )
517+ cls ._emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks , grading_policy_hash )
518518 return grades
519519
520520 @classmethod
@@ -545,21 +545,26 @@ def _emit_grade_calculated_event(grade):
545545 events .subsection_grade_calculated (grade )
546546
547547 @staticmethod
548- def _emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks ):
548+ def _emit_openedx_persistent_subsection_grade_changed_event (grade , visible_blocks , grading_policy_hash = None ):
549549 """
550550 When called emits an event when a persistent subsection grade is created or updated.
551+
552+ ``grading_policy_hash`` should be supplied by callers that already have the course's
553+ block structure loaded, so it can be reused instead of loading the course from the
554+ modulestore (an extra query per event). When not provided, it is computed here.
551555 """
552556 # .. event_implemented_name: PERSISTENT_SUBSECTION_GRADE_CHANGED
553557 # .. event_type: org.openedx.learning.course.persistent_subsection_grade.changed.v1
554- try :
555- grading_policy_hash = GradesCourseData (user = None , course_key = grade .course_id ).grading_policy_hash
556- except Exception : # pylint: disable=broad-except
557- grading_policy_hash = ""
558- log .debug (
559- "Unable to compute grading_policy_hash for course %s" ,
560- grade .course_id ,
561- exc_info = True ,
562- )
558+ if grading_policy_hash is None :
559+ try :
560+ grading_policy_hash = GradesCourseData (user = None , course_key = grade .course_id ).grading_policy_hash
561+ except Exception : # pylint: disable=broad-except
562+ grading_policy_hash = ""
563+ log .debug (
564+ "Unable to compute grading_policy_hash for course %s" ,
565+ grade .course_id ,
566+ exc_info = True ,
567+ )
563568
564569 xblocks_scoring_data = [
565570 XBlockWithScoringData (
0 commit comments