Commit 6730e55a by Stephen Sanchez

Problems with rebase..

parent 65c65454
......@@ -7,9 +7,8 @@ import copy
from django.db import DatabaseError
from django.utils.encoding import force_unicode
from submissions.serializers import SubmissionSerializer
from submissions.models import Submission, StudentItem, SubmissionStruct
from apps.submissions.serializers import StudentItemSerializer
from submissions.serializers import SubmissionSerializer, StudentItemSerializer
from submissions.models import Submission, StudentItem
class SubmissionInternalError(Exception):
......@@ -17,9 +16,7 @@ class SubmissionInternalError(Exception):
class SubmissionRequestError(Exception):
def __init__(self, field_errors):
print field_errors
self.field_errors = copy.deepcopy(field_errors)
super(SubmissionRequestError, self).__init__()
......@@ -34,7 +31,7 @@ class SubmissionNotFoundError(Exception):
pass
def create_submission(student_item_struct, answer, submitted_at=None,
def create_submission(student_item_dict, answer, submitted_at=None,
attempt_number=None):
"""Creates a submission for evaluation.
......@@ -60,13 +57,7 @@ def create_submission(student_item_struct, answer, submitted_at=None,
item cannot be accessed or the submission cannot be saved.
"""
try:
student_item_model, _ = StudentItem.objects.get_or_create(
**student_item_struct._asdict()
)
except DatabaseError as err:
raise SubmissionInternalError(err)
student_item_model = _get_or_create_student_item(student_item_dict)
if attempt_number is None:
try:
submissions = Submission.objects.filter(
......@@ -88,10 +79,10 @@ def create_submission(student_item_struct, answer, submitted_at=None,
except DatabaseError as err:
raise SubmissionInternalError(err)
return SubmissionStruct(**SubmissionSerializer(submission).data)
return SubmissionSerializer(submission).data
def get_submissions(student_item_struct, limit=None):
def get_submissions(student_item_dict, limit=None):
"""Retrieves the submissions for the specified student item,
ordered by most recent submitted date.
......@@ -117,13 +108,7 @@ def get_submissions(student_item_struct, limit=None):
the associated student item.
"""
try:
student_item_model, _ = StudentItem.objects.get_or_create(
**student_item_struct._asdict()
)
except DatabaseError as err:
raise SubmissionInternalError(err)
student_item_model = _get_or_create_student_item(student_item_dict)
try:
submission_models = Submission.objects.filter(
student_item=student_item_model)
......@@ -133,7 +118,7 @@ def get_submissions(student_item_struct, limit=None):
if limit:
submission_models = submission_models[:limit]
return [SubmissionStruct(**SubmissionSerializer(submission).data) for
return [SubmissionSerializer(submission).data for
submission in submission_models]
......@@ -149,8 +134,18 @@ def set_score(student_item):
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)
def _get_or_create_student_item(student_item_dict):
try:
student_item_model = StudentItem.objects.get(**student_item_dict)
except StudentItem.DoesNotExist:
student_item_serializer = StudentItemSerializer(data=student_item_dict)
student_item_serializer.is_valid()
if student_item_serializer.errors:
raise SubmissionRequestError(student_item_serializer.errors)
student_item_model = StudentItem.objects.create(**student_item_dict)
except DatabaseError:
raise SubmissionInternalError(
"An error occurred creating a student "
"item for: {!r}".format(student_item_dict)
)
return student_item_model
......@@ -20,8 +20,6 @@ from collections import namedtuple
from django.db import models
from django.utils.timezone import now
StudentItemStruct = namedtuple("StudentItemStruct", "student_id course_id item_id item_type")
class StudentItem(models.Model):
"""Represents a single item for a single course for a single user.
......@@ -49,8 +47,6 @@ class StudentItem(models.Model):
("course_id", "student_id", "item_id"),
)
SubmissionStruct = namedtuple("SubmissionStruct", "student_item attempt_number submitted_at created_at answer")
class Submission(models.Model):
"""A single response by a student for a given problem in a given course.
......@@ -77,6 +73,7 @@ class Submission(models.Model):
class Meta:
ordering = ["-submitted_at"]
class Score(models.Model):
"""What the user scored for a given StudentItem.
......
import datetime
from django.test import TestCase
import sys
from submissions.models import StudentItem, StudentItemStruct
from submissions.api import create_submission, get_submissions
from submissions.api import create_submission, get_submissions, SubmissionRequestError
STUDENT_ITEM = StudentItemStruct(
STUDENT_ITEM = dict(
student_id="Tim",
course_id="Demo_Course",
item_id="item_one",
item_type="Peer_Submission"
item_type="Peer_Submission",
)
ANSWER_ONE = "this is my answer!"
ANSWER_TWO = "this is my other answer!"
BAD_STUDENT_ITEM = dict(
student_id="Bad Tim",
course_id=451,
item_id=True,
)
ANSWER_ONE = u"this is my answer!"
ANSWER_TWO = u"this is my other answer!"
class TestApi(TestCase):
......@@ -39,8 +45,8 @@ class TestApi(TestCase):
# Test a limit on the submissions
submissions = get_submissions(STUDENT_ITEM, 1)
self.assertEqual(1, len(submissions))
self.assertEqual(ANSWER_ONE, submissions[0].answer)
self.assertEqual(more_recent_date.year, submissions[0].submitted_at.year)
self.assertEqual(ANSWER_ONE, submissions[0]["answer"])
self.assertEqual(more_recent_date.year, submissions[0]["submitted_at"].year)
def test_set_attempt_number(self):
create_submission(STUDENT_ITEM, ANSWER_ONE, None, 2)
......@@ -48,11 +54,15 @@ class TestApi(TestCase):
self._assert_submission(submissions[0], ANSWER_ONE, 1, 2)
def test_error_checking(self):
create_submission(STUDENT_ITEM, -100)
try:
create_submission(BAD_STUDENT_ITEM, -100)
self.fail("Bad Student Item should fail validation")
except SubmissionRequestError as err:
self.assertEqual([u"This field is required."], err.field_errors["item_type"])
def _assert_submission(self, submission, expected_answer, expected_item,
expected_attempt):
self.assertIsNotNone(submission)
self.assertEqual(submission.answer, expected_answer)
self.assertEqual(submission.student_item, expected_item)
self.assertEqual(submission.attempt_number, expected_attempt)
\ No newline at end of file
self.assertEqual(submission["answer"], expected_answer)
self.assertEqual(submission["student_item"], expected_item)
self.assertEqual(submission["attempt_number"], expected_attempt)
\ No newline at end of file
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