Skip to content

Commit 372a070

Browse files
create submission answers
1 parent 3468387 commit 372a070

File tree

7 files changed

+73
-5
lines changed

7 files changed

+73
-5
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ media/
77
.coverage
88
htmlcov/
99
temp/
10+
temp.*
1011
*.pid
1112
*.log

classroom/models/reading_submission.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ class ReadingSubmission(models.Model):
1313

1414
class Meta:
1515
ordering = ['exercise', 'submitter', 'submit_datetime']
16+
17+
def get_answers(self):
18+
return self.answers.all().values('question_number', 'content')

classroom/permissions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,13 @@ def has_permission(self, request, view):
1313
request.method in SAFE_METHODS or is_teacher
1414
)
1515
)
16+
17+
18+
class IsStudent(IsAuthenticated):
19+
message = _('Only student has permission for this.')
20+
21+
def has_permission(self, request, view):
22+
return (
23+
super().has_permission(request, view) and
24+
request.user.is_student()
25+
)

classroom/serializers/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .classroom import (AddReadingExerciseSerializer, AddStudentSerializer,
22
ClassroomSerializer, RemoveReadingExerciseSerializer,
33
RemoveStudentSerializer)
4-
from .exercise import ReadingExerciseSerializer
4+
from .exercise import (ReadingExerciseSerializer,
5+
ReadingExerciseSubmitSerializer)
56
from .question import ReadingQuestionSerializer
67
from .reading_submission import ReadingSubmissionSerializer

classroom/serializers/exercise.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from django.utils.translation import gettext as _
22
from rest_framework import serializers
33

4-
from classroom.models import ReadingExercise
4+
from classroom.models import (ReadingExercise, ReadingSubmission,
5+
ReadingSubmissionAnswer)
56
from classroom.utils.serializer import ValidateUniqueTogetherMixin
67

78

@@ -23,3 +24,33 @@ def save(self, **kwargs):
2324
teacher = self.context['request'].user
2425
kwargs['creator'] = teacher
2526
return super().save(**kwargs)
27+
28+
29+
class _SubmitAnswerListSerializer(serializers.ListSerializer):
30+
def save(self, exercise=None):
31+
student = self.context['request'].user
32+
submission = self._create_submission(student, exercise)
33+
self._create_submission_answers(submission)
34+
35+
def _create_submission(self, student, exercise):
36+
return ReadingSubmission.objects.create(submitter=student, exercise=exercise)
37+
38+
def _create_submission_answers(self, submission):
39+
answers_to_create = []
40+
for answer in self.validated_data:
41+
answers_to_create.append(
42+
ReadingSubmissionAnswer(
43+
submission=submission,
44+
question_number=answer['question_number'],
45+
content=answer['content'],
46+
)
47+
)
48+
ReadingSubmissionAnswer.objects.bulk_create(answers_to_create)
49+
50+
51+
class ReadingExerciseSubmitSerializer(serializers.Serializer):
52+
question_number = serializers.IntegerField(min_value=1)
53+
content = serializers.CharField()
54+
55+
class Meta:
56+
list_serializer_class = _SubmitAnswerListSerializer

classroom/serializers/reading_submission.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33

44

55
class ReadingSubmissionSerializer(serializers.HyperlinkedModelSerializer):
6+
answers = serializers.ListField(source='get_answers')
7+
68
class Meta:
79
model = ReadingSubmission
8-
fields = ['pk', 'url', 'exercise', 'submitter', 'submit_datetime']
10+
fields = [
11+
'pk', 'url', 'exercise',
12+
'submitter', 'submit_datetime', 'answers',
13+
]
914
extra_kwargs = {
1015
'url': {'view_name': 'reading-submission-detail'},
1116
'exercise': {'view_name': 'reading-exercise-detail'},

classroom/views/exercise.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
from rest_framework.decorators import action
2+
from rest_framework.response import Response
13
from rest_framework.viewsets import ModelViewSet
24

35
from classroom.filters import ReadingExerciseFilter
46
from classroom.models import ReadingExercise
5-
from classroom.permissions import IsTeacherOrReadOnly
6-
from classroom.serializers import ReadingExerciseSerializer
7+
from classroom.permissions import IsStudent, IsTeacherOrReadOnly
8+
from classroom.serializers import (ReadingExerciseSerializer,
9+
ReadingExerciseSubmitSerializer)
710

811

912
class ReadingExerciseViewSet(ModelViewSet):
@@ -13,3 +16,17 @@ class ReadingExerciseViewSet(ModelViewSet):
1316
permission_classes = [IsTeacherOrReadOnly]
1417
ordering_fields = ['identifier']
1518
ordering = ['identifier']
19+
20+
@action(
21+
methods=['POST'], detail=True, url_path='submit-answers',
22+
serializer_class=ReadingExerciseSubmitSerializer,
23+
permission_classes=[IsStudent],
24+
)
25+
def submit_answers(self, request, pk):
26+
"""Student submit their answer to this exercise.
27+
"""
28+
serializer = self.get_serializer(data=request.data, many=True)
29+
serializer.is_valid(raise_exception=True)
30+
exercise = self.get_object()
31+
serializer.save(exercise=exercise)
32+
return Response()

0 commit comments

Comments
 (0)