diff --git a/lms/djangoapps/grades/models.py b/lms/djangoapps/grades/models.py index eabebf861f..5ea359885e 100644 --- a/lms/djangoapps/grades/models.py +++ b/lms/djangoapps/grades/models.py @@ -16,7 +16,7 @@ from lazy import lazy import logging from django.core.exceptions import ValidationError -from django.db import models +from django.db import models, transaction from django.utils.timezone import now from model_utils.models import TimeStampedModel @@ -330,16 +330,17 @@ class PersistentSubsectionGrade(TimeStampedModel): user_id = kwargs.pop('user_id') usage_key = kwargs.pop('usage_key') attempted = kwargs.pop('attempted') - grade, _ = cls.objects.update_or_create( - user_id=user_id, - course_id=usage_key.course_key, - usage_key=usage_key, - defaults=kwargs, - ) - if attempted and not grade.first_attempted: - grade.first_attempted = now() - grade.full_clean() - grade.save() + with transaction.atomic(): + grade, _ = cls.objects.update_or_create( + user_id=user_id, + course_id=usage_key.course_key, + usage_key=usage_key, + defaults=kwargs, + ) + if attempted and not grade.first_attempted: + grade.first_attempted = now() + grade.save() + grade.full_clean() return grade @classmethod diff --git a/lms/djangoapps/grades/tests/test_tasks.py b/lms/djangoapps/grades/tests/test_tasks.py index 153ec574dc..b97a812e0a 100644 --- a/lms/djangoapps/grades/tests/test_tasks.py +++ b/lms/djangoapps/grades/tests/test_tasks.py @@ -113,7 +113,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): with self.store.default_store(default_store): self.set_up_course() self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id)) - with check_mongo_calls(2) and self.assertNumQueries(23 + added_queries): + with check_mongo_calls(2) and self.assertNumQueries(24 + added_queries): self._apply_recalculate_subsection_grade() @patch('lms.djangoapps.grades.signals.signals.SUBSECTION_SCORE_CHANGED.send') @@ -161,7 +161,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id)) ItemFactory.create(parent=self.sequential, category='problem', display_name='problem2') ItemFactory.create(parent=self.sequential, category='problem', display_name='problem3') - with check_mongo_calls(2) and self.assertNumQueries(23 + added_queries): + with check_mongo_calls(2) and self.assertNumQueries(24 + added_queries): self._apply_recalculate_subsection_grade() @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) @@ -172,7 +172,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): with check_mongo_calls(2) and self.assertNumQueries(0): self._apply_recalculate_subsection_grade() - #@skip("Pending completion of TNL-5089") + @skip("Pending completion of TNL-5089") @ddt.data( (ModuleStoreEnum.Type.mongo, True), (ModuleStoreEnum.Type.split, True),