Commit 0e2534f3 by J. Cliff Dyer

Wrap update_or_create in transaction to allow validation after save

parent 86c12e67
...@@ -16,7 +16,7 @@ from lazy import lazy ...@@ -16,7 +16,7 @@ from lazy import lazy
import logging import logging
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models, transaction
from django.utils.timezone import now from django.utils.timezone import now
from model_utils.models import TimeStampedModel from model_utils.models import TimeStampedModel
...@@ -330,16 +330,17 @@ class PersistentSubsectionGrade(TimeStampedModel): ...@@ -330,16 +330,17 @@ class PersistentSubsectionGrade(TimeStampedModel):
user_id = kwargs.pop('user_id') user_id = kwargs.pop('user_id')
usage_key = kwargs.pop('usage_key') usage_key = kwargs.pop('usage_key')
attempted = kwargs.pop('attempted') attempted = kwargs.pop('attempted')
grade, _ = cls.objects.update_or_create( with transaction.atomic():
user_id=user_id, grade, _ = cls.objects.update_or_create(
course_id=usage_key.course_key, user_id=user_id,
usage_key=usage_key, course_id=usage_key.course_key,
defaults=kwargs, usage_key=usage_key,
) defaults=kwargs,
if attempted and not grade.first_attempted: )
grade.first_attempted = now() if attempted and not grade.first_attempted:
grade.full_clean() grade.first_attempted = now()
grade.save() grade.save()
grade.full_clean()
return grade return grade
@classmethod @classmethod
......
...@@ -113,7 +113,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): ...@@ -113,7 +113,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase):
with self.store.default_store(default_store): with self.store.default_store(default_store):
self.set_up_course() self.set_up_course()
self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id)) 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() self._apply_recalculate_subsection_grade()
@patch('lms.djangoapps.grades.signals.signals.SUBSECTION_SCORE_CHANGED.send') @patch('lms.djangoapps.grades.signals.signals.SUBSECTION_SCORE_CHANGED.send')
...@@ -161,7 +161,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): ...@@ -161,7 +161,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase):
self.assertTrue(PersistentGradesEnabledFlag.feature_enabled(self.course.id)) 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='problem2')
ItemFactory.create(parent=self.sequential, category='problem', display_name='problem3') 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() self._apply_recalculate_subsection_grade()
@ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
...@@ -172,7 +172,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase): ...@@ -172,7 +172,7 @@ class RecalculateSubsectionGradeTest(ModuleStoreTestCase):
with check_mongo_calls(2) and self.assertNumQueries(0): with check_mongo_calls(2) and self.assertNumQueries(0):
self._apply_recalculate_subsection_grade() self._apply_recalculate_subsection_grade()
#@skip("Pending completion of TNL-5089") @skip("Pending completion of TNL-5089")
@ddt.data( @ddt.data(
(ModuleStoreEnum.Type.mongo, True), (ModuleStoreEnum.Type.mongo, True),
(ModuleStoreEnum.Type.split, True), (ModuleStoreEnum.Type.split, True),
......
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