From dbd0468a6ea9649250ae3c79da0684671559fc08 Mon Sep 17 00:00:00 2001 From: rabia23 <rabiaiftikhar2392@gmail.com> Date: Thu, 14 Dec 2017 12:17:56 +0000 Subject: [PATCH] EDUCATOR-1930 resolve Integrity Error exception in set score method for student module table's duplicate entry --- lms/djangoapps/courseware/model_data.py | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/lms/djangoapps/courseware/model_data.py b/lms/djangoapps/courseware/model_data.py index 681763e88f7..2a208c34f86 100644 --- a/lms/djangoapps/courseware/model_data.py +++ b/lms/djangoapps/courseware/model_data.py @@ -27,7 +27,7 @@ from abc import ABCMeta, abstractmethod from collections import defaultdict, namedtuple from contracts import contract, new_contract -from django.db import DatabaseError +from django.db import DatabaseError, IntegrityError, transaction from opaque_keys.edx.asides import AsideUsageKeyV1, AsideUsageKeyV2 from opaque_keys.edx.block_types import BlockTypeKeyV1 from opaque_keys.edx.keys import CourseKey @@ -994,15 +994,27 @@ def set_score(user_id, usage_key, score, max_score): """ Set the score and max_score for the specified user and xblock usage. """ - student_module, created = StudentModule.objects.get_or_create( - student_id=user_id, - module_state_key=usage_key, - course_id=usage_key.course_key, - defaults={ - 'grade': score, - 'max_grade': max_score, - } - ) + created = False + kwargs = {"student_id": user_id, "module_state_key": usage_key, "course_id": usage_key.course_key} + try: + with transaction.atomic(): + student_module, created = StudentModule.objects.get_or_create( + defaults={ + 'grade': score, + 'max_grade': max_score, + }, + **kwargs + ) + except IntegrityError: + # log information for duplicate entry and get the record as above command failed. + student_module = StudentModule.objects.get(**kwargs) + log.warning( + 'set_score: IntegrityError for student %d - course_id %s - usage_key %s having ' + 'score %d and max_score %d same as request score %d and max_score %d', + user_id, usage_key.course_key, usage_key, student_module.grade, student_module.max_grade, + score, max_score + ) + if not created: student_module.grade = score student_module.max_grade = max_score -- GitLab