Commit 47b931aa by Will Daly

Fix a 500 error caused by retrieving peer workflow after an integrity error when…

Fix a 500 error caused by retrieving peer workflow after an integrity error when using repeatable-read
parent 2e668da1
...@@ -567,8 +567,7 @@ def create_peer_workflow(submission_uuid): ...@@ -567,8 +567,7 @@ def create_peer_workflow(submission_uuid):
submission_uuid (str): The submission associated with this workflow. submission_uuid (str): The submission associated with this workflow.
Returns: Returns:
Workflow (PeerWorkflow): A PeerWorkflow item created based on the given None
student item and submission.
Raises: Raises:
SubmissionError: There was an error retrieving the submission. SubmissionError: There was an error retrieving the submission.
...@@ -587,8 +586,11 @@ def create_peer_workflow(submission_uuid): ...@@ -587,8 +586,11 @@ def create_peer_workflow(submission_uuid):
item_id=submission['student_item']['item_id'], item_id=submission['student_item']['item_id'],
submission_uuid=submission_uuid submission_uuid=submission_uuid
) )
workflow.save()
except IntegrityError: except IntegrityError:
workflow = PeerWorkflow.objects.get(submission_uuid=submission_uuid) # If we get an integrity error, it means someone else has already
# created a workflow for this submission, so we don't need to do anything.
pass
except DatabaseError: except DatabaseError:
error_message = _( error_message = _(
u"An internal error occurred while creating a new peer " u"An internal error occurred while creating a new peer "
...@@ -597,8 +599,6 @@ def create_peer_workflow(submission_uuid): ...@@ -597,8 +599,6 @@ def create_peer_workflow(submission_uuid):
) )
logger.exception(error_message) logger.exception(error_message)
raise PeerAssessmentInternalError(error_message) raise PeerAssessmentInternalError(error_message)
workflow.save()
return workflow
def create_peer_workflow_item(scorer_submission_uuid, submission_uuid): def create_peer_workflow_item(scorer_submission_uuid, submission_uuid):
......
...@@ -358,11 +358,11 @@ class TestPeerApi(CacheResetTest): ...@@ -358,11 +358,11 @@ class TestPeerApi(CacheResetTest):
self.assertNotEqual(pwis[0].started_at, yesterday) self.assertNotEqual(pwis[0].started_at, yesterday)
def test_peer_workflow_integrity_error(self): def test_peer_workflow_integrity_error(self):
tim_sub, tim = self._create_student_and_submission("Tim", "Tim's answer") tim_sub, __ = self._create_student_and_submission("Tim", "Tim's answer")
with patch.object(PeerWorkflow.objects, "get_or_create") as mock_peer: with patch.object(PeerWorkflow.objects, "get_or_create") as mock_peer:
mock_peer.side_effect = IntegrityError("Oh no!") mock_peer.side_effect = IntegrityError("Oh no!")
workflow = peer_api.create_peer_workflow(tim_sub["uuid"]) # This should not raise an exception
self.assertEquals(tim_sub["uuid"], workflow.submission_uuid) peer_api.create_peer_workflow(tim_sub["uuid"])
@raises(peer_api.PeerAssessmentWorkflowError) @raises(peer_api.PeerAssessmentWorkflowError)
def test_no_submission_found_closing_assessment(self): def test_no_submission_found_closing_assessment(self):
......
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