Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-ora2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-ora2
Commits
6730e55a
Commit
6730e55a
authored
Jan 27, 2014
by
Stephen Sanchez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Problems with rebase..
parent
65c65454
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
45 deletions
+47
-45
apps/submissions/api.py
+23
-28
apps/submissions/models.py
+1
-4
apps/submissions/tests/test_api.py
+23
-13
No files found.
apps/submissions/api.py
View file @
6730e55a
...
...
@@ -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_
stru
ct
,
answer
,
submitted_at
=
None
,
def
create_submission
(
student_item_
di
ct
,
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
SubmissionS
truct
(
**
SubmissionSerializer
(
submission
)
.
data
)
return
SubmissionS
erializer
(
submission
)
.
data
def
get_submissions
(
student_item_
stru
ct
,
limit
=
None
):
def
get_submissions
(
student_item_
di
ct
,
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
[
SubmissionS
truct
(
**
SubmissionSerializer
(
submission
)
.
data
)
for
return
[
SubmissionS
erializer
(
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
apps/submissions/models.py
View file @
6730e55a
...
...
@@ -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.
...
...
apps/submissions/tests/test_api.py
View file @
6730e55a
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
=
StudentItemStru
ct
(
STUDENT_ITEM
=
di
ct
(
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment