Commit 79a2b6e2 by Gregory Martin Committed by Sanford Student

Eventing for grading policy change

parent aac143e6
......@@ -11,6 +11,7 @@ from contentstore.proctoring import register_special_exams
from lms.djangoapps.grades.tasks import compute_all_grades_for_course
from openedx.core.djangoapps.credit.signals import on_course_publish
from openedx.core.lib.gating import api as gating_api
from track.event_transaction_utils import get_event_transaction_id, get_event_transaction_type
from util.module_utils import yield_dynamic_descriptor_descendants
from .signals import GRADING_POLICY_CHANGED
from xmodule.modulestore.django import SignalHandler, modulestore
......@@ -95,7 +96,11 @@ def handle_grading_policy_changed(sender, **kwargs):
Receives signal and kicks off celery task to recalculate grades
"""
course_key = kwargs.get('course_key')
result = compute_all_grades_for_course.apply_async(course_key=course_key)
result = compute_all_grades_for_course.apply_async(
course_key=course_key,
event_transaction_id=get_event_transaction_id(),
event_transaction_type=get_event_transaction_type(),
)
log.info("Grades: Created {task_name}[{task_id}] with arguments {kwargs}".format(
task_name=compute_all_grades_for_course.name,
task_id=result.task_id,
......
from base64 import b64encode
from datetime import timedelta
from hashlib import sha1
import json
from contentstore.signals.signals import GRADING_POLICY_CHANGED
from eventtracking import tracker
from track.event_transaction_utils import create_new_event_transaction_id, set_event_transaction_type
from xmodule.modulestore.django import modulestore
GRADING_POLICY_CHANGED_EVENT_TYPE = 'edx.grades.grading_policy_changed'
class CourseGradingModel(object):
"""
......@@ -66,8 +73,7 @@ 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)
GRADING_POLICY_CHANGED.send(sender=CourseGradingModel, user_id=user.id, course_id=course_key)
_grading_event_and_signal(course_key, user.id)
return CourseGradingModel.fetch(course_key)
......@@ -89,8 +95,7 @@ class CourseGradingModel(object):
descriptor.raw_grader.append(grader)
modulestore().update_item(descriptor, user.id)
GRADING_POLICY_CHANGED.send(sender=CourseGradingModel, user_id=user.id, course_id=course_key)
_grading_event_and_signal(course_key, user.id)
return CourseGradingModel.jsonize_grader(index, descriptor.raw_grader[index])
......@@ -104,7 +109,7 @@ class CourseGradingModel(object):
descriptor.grade_cutoffs = cutoffs
modulestore().update_item(descriptor, user.id)
_grading_event_and_signal(course_key, user.id)
return cutoffs
@staticmethod
......@@ -160,8 +165,7 @@ class CourseGradingModel(object):
descriptor.raw_grader = descriptor.raw_grader
modulestore().update_item(descriptor, user.id)
GRADING_POLICY_CHANGED.send(sender=CourseGradingModel, user_id=user.id, course_id=course_key)
_grading_event_and_signal(course_key, user.id)
@staticmethod
def delete_grace_period(course_key, user):
......@@ -192,13 +196,7 @@ class CourseGradingModel(object):
del descriptor.graded
modulestore().update_item(descriptor, user.id)
GRADING_POLICY_CHANGED.send(
sender=CourseGradingModel,
user_id=user.id,
course_id=descriptor.location.course_key
)
_grading_event_and_signal(descriptor.location.course_key, user.id)
return {'graderType': grader_type}
@staticmethod
......@@ -253,3 +251,27 @@ class CourseGradingModel(object):
"short_label": grader.get('short_label', ""),
"weight": grader.get('weight', 0) * 100,
}
def _grading_event_and_signal(course_key, user_id):
name = GRADING_POLICY_CHANGED_EVENT_TYPE
course = modulestore().get_course(course_key)
data = {
"course_id": unicode(course_key),
"user_id": unicode(user_id),
"grading_policy_hash": unicode(hash_grading_policy(course.grading_policy)),
"event_transaction_id": unicode(create_new_event_transaction_id()),
"event_transaction_type": GRADING_POLICY_CHANGED_EVENT_TYPE,
}
tracker.emit(name, data)
GRADING_POLICY_CHANGED.send(sender=CourseGradingModel, user_id=user_id, course_id=course_key)
def hash_grading_policy(grading_policy):
ordered_policy = json.dumps(
grading_policy,
separators=(',', ':'), # Remove spaces from separators for more compact representation
sort_keys=True,
)
return b64encode(sha1(ordered_policy).digest())
......@@ -91,6 +91,12 @@ def compute_grades_for_course_v2(self, **kwargs):
waffle switch. If false or not provided, use the global value of
the ESTIMATE_FIRST_ATTEMPTED waffle switch.
"""
if 'event_transaction_id' in kwargs:
set_event_transaction_id(kwargs['event_transaction_id'])
if 'event_transaction_type' in kwargs:
set_event_transaction_type(kwargs['event_transaction_type'])
course_key = kwargs.pop('course_key')
offset = kwargs.pop('offset')
batch_size = kwargs.pop('batch_size')
......
Markdown is supported
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