Skip to content

Commit 8d1c059

Browse files
Merge pull request #78 from UNLV-CS472-672/submissions_endpoints
Submissions Endpoints and Testing
2 parents dbc4fec + f5bcfef commit 8d1c059

File tree

7 files changed

+467
-5
lines changed

7 files changed

+467
-5
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from django.db import models
2+
from django.apps import apps
3+
4+
class SubmissionManager(models.Manager):
5+
# POST /submissions/: Create a new submission
6+
def create_submission(self, student_profile, submission_status=None, score=None):
7+
"""Helper method to create a new submission"""
8+
Submissions = apps.get_model('submissions', 'Submissions') # Dynamically import the Submissions model
9+
submission = Submissions.objects.create(
10+
student_profile=student_profile,
11+
submission_status=submission_status or Submissions.NOT_SUBMITTED,
12+
score=score
13+
)
14+
return submission
15+
16+
# PATCH /submissions/{submission_id}/
17+
def update_submission_status(self, submission_id, status):
18+
"""Update the status of a submission"""
19+
Submissions = apps.get_model('submissions', 'Submissions')
20+
submission = Submissions.objects.get(pk=submission_id) # Directly use Submissions.objects.get
21+
submission.submission_status = status
22+
submission.save()
23+
return submission
24+
25+
# GET /submissions/{submission_id}/: Retrieve a specific submission.
26+
def get_submission(self, submission_id):
27+
"""Retrieve a specific submission by ID"""
28+
Submissions = apps.get_model('submissions', 'Submissions')
29+
return Submissions.objects.get(id=submission_id)
30+
31+
# GET /submissions/: Retrieves all submissions
32+
def get_all_submissions(self):
33+
"""Retrieve all submissions"""
34+
Submissions = apps.get_model('submissions', 'Submissions')
35+
return Submissions.objects.all()
36+
37+
class FileSubmissionManager(models.Manager):
38+
# POST /submissions/: Create a new submission (file)
39+
def create_file_submission(self, submission, file):
40+
"""Helper method to create a file submission"""
41+
FileSubmissions = apps.get_model('submissions', 'FileSubmissions')
42+
file_submission = FileSubmissions.objects.create(
43+
submission=submission,
44+
file=file
45+
)
46+
return file_submission
47+
48+
class QuizSubmissionManager(models.Manager):
49+
# POST /submissions/quiz-submissions: Create a new submission (quiz)
50+
def create_quiz_submission(self, submission):
51+
"""Create a new quiz submission entry"""
52+
QuizSubmissions = apps.get_model('submissions', 'QuizSubmissions')
53+
quiz_submission = QuizSubmissions.objects.create(
54+
submission=submission
55+
)
56+
return quiz_submission
57+
58+
# POST /submissions/quizzes/{submission_id}/answers/: Saves an answer to a specific quiz question.
59+
def save_quiz_answer(self, quiz_submission, student_response, is_correct):
60+
"""Save a student’s answer to a quiz question"""
61+
StudentQuizAnswers = apps.get_model('submissions', 'StudentQuizAnswers')
62+
answer = StudentQuizAnswers.objects.create(
63+
quiz_submission=quiz_submission,
64+
student_response=student_response,
65+
is_correct=is_correct
66+
)
67+
return answer
68+
69+
# GET /submissions/quizzes/{submission_id}/answers/: Fetches all answers for a student’s quiz attempt.
70+
def get_quiz_answers(self, quiz_submission_id):
71+
"""Fetch all answers for a specific quiz submission"""
72+
StudentQuizAnswers = apps.get_model('submissions', 'StudentQuizAnswers')
73+
return StudentQuizAnswers.objects.filter(quiz_submission_id=quiz_submission_id)
74+
75+
# POST /submissions/quizzes/{submission_id}/submit/: Marks the quiz as submitted.
76+
def mark_quiz_as_submitted(self, quiz_submission):
77+
"""Mark a quiz submission as submitted"""
78+
Submissions = apps.get_model('submissions', 'Submissions')
79+
quiz_submission.submission.submission_status = Submissions.SUBMITTED
80+
quiz_submission.submission.save()
81+
return quiz_submission.submission.submission_status
82+

backend/apps/submissions/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.db import models
22
from django.utils import timezone
33
from django.core.exceptions import ValidationError
4+
from apps.submissions.managers import SubmissionManager, FileSubmissionManager, QuizSubmissionManager
45

56
### Missing fields will be added in as other apps are updated
67

@@ -39,6 +40,9 @@ class Submissions(models.Model):
3940
submitted_at = models.DateTimeField(default=timezone.now) # Changed to DateTimeField for better accuracy
4041
graded_at = models.DateTimeField(null=True, blank=True, auto_now_add=True) # Ensures it's only set once
4142

43+
# Submission manager
44+
objects = SubmissionManager()
45+
4246
def clean(self):
4347
"""Custom validation for submission"""
4448
# Ensure student_profile is set
@@ -74,6 +78,9 @@ class FileSubmissions(models.Model):
7478
blank=True
7579
)
7680

81+
# File submission manager
82+
objects = FileSubmissionManager()
83+
7784
def __str__(self):
7885
return f"File Submission for {self.submission.id}"
7986

@@ -86,6 +93,9 @@ class QuizSubmissions(models.Model):
8693
submission = models.OneToOneField(Submissions, on_delete=models.CASCADE)
8794
### quiz = models.ForeignKey('app.Quiz', on_delete=models.CASCADE)
8895

96+
# Quiz submission manager
97+
objects = QuizSubmissionManager()
98+
8999
def __str__(self):
90100
return f"Quiz Submission for {self.submission.id}"
91101

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from rest_framework import serializers
2+
from .models import Submissions, FileSubmissions, QuizSubmissions, StudentQuizAnswers
3+
4+
5+
class SubmissionsSerializer(serializers.ModelSerializer):
6+
class Meta:
7+
model = Submissions
8+
fields = '__all__'
9+
10+
def validate_score(self, value):
11+
if value is not None and value < 0:
12+
raise serializers.ValidationError("Score cannot be negative.")
13+
return value
14+
15+
class QuizSubmissionsSerializer(serializers.ModelSerializer):
16+
class Meta:
17+
model = QuizSubmissions
18+
fields = '__all__'
19+
20+
class StudentQuizAnswersSerializer(serializers.ModelSerializer):
21+
class Meta:
22+
model = StudentQuizAnswers
23+
fields = '__all__'
24+
25+
class FileSubmissionsSerializer(serializers.ModelSerializer):
26+
class Meta:
27+
model = FileSubmissions
28+
fields = '__all__'

0 commit comments

Comments
 (0)