Wrap update_or_create in transaction to allow validation after save
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user