Commit 65c65454 by Stephen Sanchez

Updates to the API.

parent c041d4a3
...@@ -2,16 +2,34 @@ ...@@ -2,16 +2,34 @@
Public interface for the submissions app. Public interface for the submissions app.
""" """
import copy
from django.db import DatabaseError from django.db import DatabaseError
from django.utils.encoding import force_unicode from django.utils.encoding import force_unicode
from submissions.serializers import SubmissionSerializer from submissions.serializers import SubmissionSerializer
from submissions.models import Submission, StudentItem, SubmissionStruct from submissions.models import Submission, StudentItem, SubmissionStruct
from apps.submissions.serializers import StudentItemSerializer
class SubmissionAccessError(Exception): class SubmissionInternalError(Exception):
pass pass
class SubmissionRequestError(Exception):
def __init__(self, field_errors):
print field_errors
self.field_errors = copy.deepcopy(field_errors)
super(SubmissionRequestError, self).__init__()
def __unicode__(self):
return repr(self)
def __repr__(self):
return "SubmissionRequestError({!r})".format(self.field_errors)
class SubmissionNotFoundError(Exception): class SubmissionNotFoundError(Exception):
pass pass
...@@ -44,17 +62,17 @@ def create_submission(student_item_struct, answer, submitted_at=None, ...@@ -44,17 +62,17 @@ def create_submission(student_item_struct, answer, submitted_at=None,
""" """
try: try:
student_item_model, _ = StudentItem.objects.get_or_create( student_item_model, _ = StudentItem.objects.get_or_create(
**student_item_struct._asdict()) **student_item_struct._asdict()
)
except DatabaseError as err: except DatabaseError as err:
raise SubmissionAccessError(err) raise SubmissionInternalError(err)
if attempt_number is None: if attempt_number is None:
try: try:
submissions = Submission.objects.filter( submissions = Submission.objects.filter(
student_item=student_item_model)[:0] student_item=student_item_model)[:0]
except DatabaseError as err: except DatabaseError as err:
raise SubmissionAccessError(err) raise SubmissionInternalError(err)
attempt_number = submissions[0].attempt_number + 1 if submissions else 1 attempt_number = submissions[0].attempt_number + 1 if submissions else 1
model_kwargs = { model_kwargs = {
...@@ -68,7 +86,8 @@ def create_submission(student_item_struct, answer, submitted_at=None, ...@@ -68,7 +86,8 @@ def create_submission(student_item_struct, answer, submitted_at=None,
try: try:
submission = Submission.objects.create(**model_kwargs) submission = Submission.objects.create(**model_kwargs)
except DatabaseError as err: except DatabaseError as err:
raise SubmissionAccessError(err) raise SubmissionInternalError(err)
return SubmissionStruct(**SubmissionSerializer(submission).data) return SubmissionStruct(**SubmissionSerializer(submission).data)
...@@ -100,9 +119,10 @@ def get_submissions(student_item_struct, limit=None): ...@@ -100,9 +119,10 @@ def get_submissions(student_item_struct, limit=None):
""" """
try: try:
student_item_model, _ = StudentItem.objects.get_or_create( student_item_model, _ = StudentItem.objects.get_or_create(
**student_item_struct._asdict()) **student_item_struct._asdict()
)
except DatabaseError as err: except DatabaseError as err:
raise SubmissionAccessError(err) raise SubmissionInternalError(err)
try: try:
submission_models = Submission.objects.filter( submission_models = Submission.objects.filter(
...@@ -127,3 +147,10 @@ def get_scores(course_id, student_id, types=None): ...@@ -127,3 +147,10 @@ def get_scores(course_id, student_id, types=None):
def set_score(student_item): def set_score(student_item):
pass pass
def _validate_student_item(student_item_struct):
student_item_serializer = StudentItemSerializer(data=student_item_struct._asdict())
student_item_serializer.is_valid()
if student_item_serializer.errors:
raise SubmissionRequestError(student_item_serializer.errors)
...@@ -47,6 +47,9 @@ class TestApi(TestCase): ...@@ -47,6 +47,9 @@ class TestApi(TestCase):
submissions = get_submissions(STUDENT_ITEM) submissions = get_submissions(STUDENT_ITEM)
self._assert_submission(submissions[0], ANSWER_ONE, 1, 2) self._assert_submission(submissions[0], ANSWER_ONE, 1, 2)
def test_error_checking(self):
create_submission(STUDENT_ITEM, -100)
def _assert_submission(self, submission, expected_answer, expected_item, def _assert_submission(self, submission, expected_answer, expected_item,
expected_attempt): expected_attempt):
self.assertIsNotNone(submission) self.assertIsNotNone(submission)
......
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