Commit 1637c2f0 by Will Daly

Merge pull request #7 from edx/will/submission-request-error

Clarify error message and field errors for submission request error
parents db793358 11f1ae02
...@@ -57,10 +57,29 @@ class SubmissionRequestError(SubmissionError): ...@@ -57,10 +57,29 @@ class SubmissionRequestError(SubmissionError):
This error is reserved for problems specific to the use of the API. This error is reserved for problems specific to the use of the API.
""" """
def __init__(self, msg="", field_errors=None):
"""
Configure the submission request error.
def __init__(self, field_errors): Keyword Args:
Exception.__init__(self, repr(field_errors)) msg (unicode): The error message.
self.field_errors = copy.deepcopy(field_errors) field_errors (dict): A dictionary of errors (list of unicode)
specific to a fields provided in the request.
Example usage:
>>> raise SubmissionRequestError(
>>> "An unexpected error occurred"
>>> {"answer": ["Maximum answer length exceeded."]}
>>> )
"""
super(SubmissionRequestError, self).__init__(msg)
self.field_errors = (
copy.deepcopy(field_errors)
if field_errors is not None
else {}
)
def create_submission(student_item_dict, answer, submitted_at=None, attempt_number=None): def create_submission(student_item_dict, answer, submitted_at=None, attempt_number=None):
...@@ -141,7 +160,7 @@ def create_submission(student_item_dict, answer, submitted_at=None, attempt_numb ...@@ -141,7 +160,7 @@ def create_submission(student_item_dict, answer, submitted_at=None, attempt_numb
try: try:
submission_serializer = SubmissionSerializer(data=model_kwargs) submission_serializer = SubmissionSerializer(data=model_kwargs)
if not submission_serializer.is_valid(): if not submission_serializer.is_valid():
raise SubmissionRequestError(submission_serializer.errors) raise SubmissionRequestError(field_errors=submission_serializer.errors)
submission_serializer.save() submission_serializer.save()
sub_data = submission_serializer.data sub_data = submission_serializer.data
...@@ -153,7 +172,7 @@ def create_submission(student_item_dict, answer, submitted_at=None, attempt_numb ...@@ -153,7 +172,7 @@ def create_submission(student_item_dict, answer, submitted_at=None, attempt_numb
error_message = u"Could not serialize JSON field in submission {} for student item {}".format( error_message = u"Could not serialize JSON field in submission {} for student item {}".format(
model_kwargs, student_item_dict model_kwargs, student_item_dict
) )
raise SubmissionRequestError(error_message) raise SubmissionRequestError(msg=error_message)
except DatabaseError: except DatabaseError:
error_message = u"An error occurred while creating submission {} for student item: {}".format( error_message = u"An error occurred while creating submission {} for student item: {}".format(
model_kwargs, model_kwargs,
...@@ -191,7 +210,7 @@ def get_submission(submission_uuid, read_replica=False): ...@@ -191,7 +210,7 @@ def get_submission(submission_uuid, read_replica=False):
""" """
if not isinstance(submission_uuid, basestring): if not isinstance(submission_uuid, basestring):
raise SubmissionRequestError( raise SubmissionRequestError(
"submission_uuid ({!r}) must be a string type".format(submission_uuid) msg="submission_uuid ({!r}) must be a string type".format(submission_uuid)
) )
cache_key = "submissions.submission.{}".format(submission_uuid) cache_key = "submissions.submission.{}".format(submission_uuid)
...@@ -392,7 +411,7 @@ def get_top_submissions(course_id, item_id, item_type, number_of_top_scores): ...@@ -392,7 +411,7 @@ def get_top_submissions(course_id, item_id, item_type, number_of_top_scores):
u"Number of top scores must be a number between 1 and {}.".format(MAX_TOP_SUBMISSIONS) u"Number of top scores must be a number between 1 and {}.".format(MAX_TOP_SUBMISSIONS)
) )
logger.exception(error_msg) logger.exception(error_msg)
raise SubmissionRequestError(error_msg) raise SubmissionRequestError(msg=error_msg)
try: try:
scores = Score.objects.filter( scores = Score.objects.filter(
student_item__course_id=course_id, student_item__course_id=course_id,
...@@ -629,7 +648,7 @@ def set_score(submission_uuid, points_earned, points_possible): ...@@ -629,7 +648,7 @@ def set_score(submission_uuid, points_earned, points_possible):
submission_uuid submission_uuid
) )
logger.exception(error_msg) logger.exception(error_msg)
raise SubmissionRequestError(error_msg) raise SubmissionRequestError(msg=error_msg)
score = ScoreSerializer( score = ScoreSerializer(
data={ data={
...@@ -771,7 +790,7 @@ def _get_or_create_student_item(student_item_dict): ...@@ -771,7 +790,7 @@ def _get_or_create_student_item(student_item_dict):
student_item_serializer = StudentItemSerializer( student_item_serializer = StudentItemSerializer(
data=student_item_dict) data=student_item_dict)
if not student_item_serializer.is_valid(): if not student_item_serializer.is_valid():
raise SubmissionRequestError(student_item_serializer.errors) raise SubmissionRequestError(field_errors=student_item_serializer.errors)
return student_item_serializer.save() return student_item_serializer.save()
except DatabaseError: except DatabaseError:
error_message = u"An error occurred creating student item: {}".format( error_message = u"An error occurred creating student item: {}".format(
......
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