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
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
......
......@@ -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),
......
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