From 45c54ee6a567a49ccf48ace481c376414c52562c Mon Sep 17 00:00:00 2001 From: Jansen Kantor <jkantor@edx.org> Date: Mon, 5 Oct 2020 19:58:33 -0400 Subject: [PATCH] log grade policy changes (#25247) * log grade policy changes * quality --- .../contentstore/signals/handlers.py | 2 + .../models/settings/course_grading.py | 47 +++++++++---------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/cms/djangoapps/contentstore/signals/handlers.py b/cms/djangoapps/contentstore/signals/handlers.py index 53e0c429c2a..deb34d1d698 100644 --- a/cms/djangoapps/contentstore/signals/handlers.py +++ b/cms/djangoapps/contentstore/signals/handlers.py @@ -34,6 +34,8 @@ def locked(expiry_seconds, key): if cache.add(cache_key, "true", expiry_seconds): log.info(u'Locking task in cache with key: %s for %s seconds', cache_key, expiry_seconds) return func(*args, **kwargs) + else: + log.info('Task with key %s already exists in cache', cache_key) return wrapper return task_decorator diff --git a/cms/djangoapps/models/settings/course_grading.py b/cms/djangoapps/models/settings/course_grading.py index f937c139af3..e53e8ac4cc8 100644 --- a/cms/djangoapps/models/settings/course_grading.py +++ b/cms/djangoapps/models/settings/course_grading.py @@ -2,6 +2,7 @@ import json +import logging from base64 import b64encode from datetime import timedelta from hashlib import sha1 @@ -14,6 +15,8 @@ from track.event_transaction_utils import create_new_event_transaction_id from xmodule.modulestore.django import modulestore from models.settings.waffle import material_recompute_only +log = logging.getLogger(__name__) + GRADING_POLICY_CHANGED_EVENT_TYPE = 'edx.grades.grading_policy_changed' @@ -68,6 +71,7 @@ class CourseGradingModel(object): Probably not the usual path for updates as it's too coarse grained. """ descriptor = modulestore().get_course(course_key) + previous_grading_policy_hash = six.text_type(hash_grading_policy(descriptor.grading_policy)) graders_parsed = [CourseGradingModel.parse_grader(jsonele) for jsonele in jsondict['graders']] fire_signal = CourseGradingModel.must_fire_grading_event_and_signal( @@ -84,35 +88,17 @@ class CourseGradingModel(object): CourseGradingModel.update_grace_period_from_json(course_key, jsondict['grace_period'], user) CourseGradingModel.update_minimum_grade_credit_from_json(course_key, jsondict['minimum_grade_credit'], user) - if fire_signal: - _grading_event_and_signal(course_key, user.id) - return CourseGradingModel.fetch(course_key) - - @staticmethod - def update_from_json_selective(course_key, jsondict, user): - """ - New version that doesn't fire change events when only name or short name are changed. - Decode the json into CourseGradingModel and save any changes. Returns the modified model. - Probably not the usual path for updates as it's too coarse grained. - """ descriptor = modulestore().get_course(course_key) - - graders_parsed = [CourseGradingModel.parse_grader(jsonele) for jsonele in jsondict['graders']] - fire_signal = CourseGradingModel.must_fire_grading_event_and_signal( - course_key, - graders_parsed, - descriptor, - jsondict + new_grading_policy_hash = six.text_type(hash_grading_policy(descriptor.grading_policy)) + log.info( + "Updated course grading policy for course %s from %s to %s. fire_signal = %s", + six.text_type(course_key), + previous_grading_policy_hash, + new_grading_policy_hash, + fire_signal ) - descriptor.raw_grader = graders_parsed - descriptor.grade_cutoffs = jsondict['grade_cutoffs'] - - modulestore().update_item(descriptor, user.id) - CourseGradingModel.update_grace_period_from_json(course_key, jsondict['grace_period'], user) - - CourseGradingModel.update_minimum_grade_credit_from_json(course_key, jsondict['minimum_grade_credit'], user) if fire_signal: _grading_event_and_signal(course_key, user.id) @@ -169,6 +155,7 @@ class CourseGradingModel(object): grader which is a full model on the client but not on the server (just a dict) """ descriptor = modulestore().get_course(course_key) + previous_grading_policy_hash = six.text_type(hash_grading_policy(descriptor.grading_policy)) # parse removes the id; so, grab it before parse index = int(grader.get('id', len(descriptor.raw_grader))) @@ -186,6 +173,16 @@ class CourseGradingModel(object): descriptor.raw_grader.append(grader) modulestore().update_item(descriptor, user.id) + + descriptor = modulestore().get_course(course_key) + new_grading_policy_hash = six.text_type(hash_grading_policy(descriptor.grading_policy)) + log.info( + "Updated grader for course %s. Grading policy has changed from %s to %s. fire_signal = %s", + six.text_type(course_key), + previous_grading_policy_hash, + new_grading_policy_hash, + fire_signal + ) if fire_signal: _grading_event_and_signal(course_key, user.id) -- GitLab