diff --git a/autograder_django_backend/autograder/migrations/0002_alter_student_courses.py b/autograder_django_backend/autograder/migrations/0002_alter_student_courses.py new file mode 100644 index 0000000..2760a17 --- /dev/null +++ b/autograder_django_backend/autograder/migrations/0002_alter_student_courses.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.12 on 2022-06-22 20:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("autograder", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="student", + name="courses", + field=models.ManyToManyField( + blank=True, related_name="students", to="autograder.Course" + ), + ), + ] diff --git a/autograder_django_backend/autograder/models.py b/autograder_django_backend/autograder/models.py index c4f63ba..41dc85a 100644 --- a/autograder_django_backend/autograder/models.py +++ b/autograder_django_backend/autograder/models.py @@ -34,7 +34,7 @@ class Student(models.Model): Assignment, on_delete=models.CASCADE, related_name="students", null=True ) - courses = models.ManyToManyField(Course, related_name="students") + courses = models.ManyToManyField(Course, related_name="students", blank=True) def get_professors(self): return list(Professor.objects.filter(courses__in=self.courses.all())) diff --git a/autograder_django_backend/autograder/serializers.py b/autograder_django_backend/autograder/serializers.py index b5927e4..bc63a8b 100644 --- a/autograder_django_backend/autograder/serializers.py +++ b/autograder_django_backend/autograder/serializers.py @@ -1,9 +1,27 @@ from rest_framework import serializers -from .models import Assignment +from .models import Assignment, Course, Professor, Student class AssignmentSerializer(serializers.ModelSerializer): class Meta: model = Assignment fields = "__all__" + + +class CourseSerializer(serializers.ModelSerializer): + class Meta: + model = Course + fields = "__all__" + + +class StudentSerializer(serializers.ModelSerializer): + class Meta: + model = Student + fields = "__all__" + + +class ProfessorSerializer(serializers.ModelSerializer): + class Meta: + model = Professor + fields = "__all__" diff --git a/autograder_django_backend/autograder/tests/test_assignment.py b/autograder_django_backend/autograder/tests/test_assignment.py index 5389850..fa8e905 100644 --- a/autograder_django_backend/autograder/tests/test_assignment.py +++ b/autograder_django_backend/autograder/tests/test_assignment.py @@ -3,7 +3,7 @@ from autograder.models import Course, Assignment, Professor, Student from autograder_django_backend.utils.tests import get_client -# Test creating a course through the API +# Test creating an assignment through the API @pytest.mark.django_db(transaction=True) def test_create_assignment_api(): client, user = get_client() diff --git a/autograder_django_backend/autograder/tests/test_course.py b/autograder_django_backend/autograder/tests/test_course.py index fdfbd7a..f81353e 100644 --- a/autograder_django_backend/autograder/tests/test_course.py +++ b/autograder_django_backend/autograder/tests/test_course.py @@ -1,6 +1,7 @@ from django.test import TestCase import pytest from autograder.models import Course, Assignment, Professor, Student +from autograder_django_backend.utils.tests import get_client @pytest.mark.django_db(transaction=True) @@ -76,3 +77,30 @@ def test_get_students_of_course(): assert student_one in list_of_students assert student_two in list_of_students assert student_three in list_of_students + + +# Test creating a course through the API +@pytest.mark.django_db(transaction=True) +def test_create_course_api(): + client, user = get_client() + + professor = Professor.objects.create(name="test_professor", email="test@test.com") + + response = client.post( + "/api/courses/", + { + "course_id": "COMP 2406", + "name": "Fundamentals of Web Applications", + "description": "Introduction to Internet application development; emphasis on computer science fundamentals of technologies underlying web applications. Topics include: scripting and functional languages, language-based virtual machines, database query languages, remote procedure calls over the Internet, and performance and security concerns in modern distributed applications.", + "section": "A", + "professor": professor.id, + }, + format="json", + ) + + assert response.status_code == 201 + + assignment = Course.objects.get(course_id="COMP 2406") + + assert assignment.course_id == "COMP 2406" + assert assignment.name == "Fundamentals of Web Applications" diff --git a/autograder_django_backend/autograder/tests/test_professor.py b/autograder_django_backend/autograder/tests/test_professor.py index 9006e77..f4f51fa 100644 --- a/autograder_django_backend/autograder/tests/test_professor.py +++ b/autograder_django_backend/autograder/tests/test_professor.py @@ -2,6 +2,7 @@ import pytest from autograder.models import Course, Assignment, Professor, Student from autograder.tests.factory import student_factory +from autograder_django_backend.utils.tests import get_client @pytest.mark.django_db(transaction=True) @@ -36,3 +37,21 @@ def test_get_students_of_professor(): # Check that the student is in the list assert student in students + + +@pytest.mark.django_db(transaction=True) +def test_create_professor_api(): + client, user = get_client() + + response = client.post( + "/api/professors/", + {"name": "test_professor", "email": "test@test.com"}, + format="json", + ) + + assert response.status_code == 201 + + assignment = Professor.objects.get(name="test_professor") + + assert assignment.name == "test_professor" + assert assignment.email == "test@test.com" diff --git a/autograder_django_backend/autograder/tests/test_student.py b/autograder_django_backend/autograder/tests/test_student.py index 621d79f..17eeb7a 100644 --- a/autograder_django_backend/autograder/tests/test_student.py +++ b/autograder_django_backend/autograder/tests/test_student.py @@ -2,6 +2,7 @@ import pytest from autograder.models import Course, Assignment, Professor, Student from autograder.tests.factory import student_factory +from autograder_django_backend.utils.tests import get_client @pytest.mark.django_db(transaction=True) @@ -54,3 +55,26 @@ def test_student_get_all_professors(): assert professor_one in list_of_professors assert professor_two in list_of_professors + + +@pytest.mark.django_db(transaction=True) +def test_create_student_api(): + client, user = get_client() + + response = client.post( + "/api/students/", + { + "name": "test_student", + "email": "test@test.com", + }, + format="json", + ) + + print(response.data) + + assert response.status_code == 201 + + assignment = Student.objects.get(name="test_student") + + assert assignment.name == "test_student" + assert assignment.email == "test@test.com" diff --git a/autograder_django_backend/autograder/views.py b/autograder_django_backend/autograder/views.py index 8751e05..d3b5fa8 100644 --- a/autograder_django_backend/autograder/views.py +++ b/autograder_django_backend/autograder/views.py @@ -1,9 +1,29 @@ from rest_framework import viewsets -from .models import Assignment -from .serializers import AssignmentSerializer +from .models import Assignment, Course, Professor, Student +from .serializers import ( + AssignmentSerializer, + CourseSerializer, + ProfessorSerializer, + StudentSerializer, +) class AssignmentViewSet(viewsets.ModelViewSet): queryset = Assignment.objects.all() serializer_class = AssignmentSerializer + + +class StudentViewSet(viewsets.ModelViewSet): + queryset = Student.objects.all() + serializer_class = StudentSerializer + + +class ProfessorViewSet(viewsets.ModelViewSet): + queryset = Professor.objects.all() + serializer_class = ProfessorSerializer + + +class CourseViewSet(viewsets.ModelViewSet): + queryset = Course.objects.all() + serializer_class = CourseSerializer diff --git a/autograder_django_backend/config/api_router.py b/autograder_django_backend/config/api_router.py index 0ddd1ea..300f274 100644 --- a/autograder_django_backend/config/api_router.py +++ b/autograder_django_backend/config/api_router.py @@ -1,6 +1,11 @@ from django.conf import settings from rest_framework.routers import DefaultRouter, SimpleRouter -from autograder.views import AssignmentViewSet +from autograder.views import ( + AssignmentViewSet, + CourseViewSet, + ProfessorViewSet, + StudentViewSet, +) from autograder_django_backend.users.api.views import UserViewSet @@ -11,6 +16,9 @@ router.register("users", UserViewSet) router.register("assignments", AssignmentViewSet) +router.register("courses", CourseViewSet) +router.register("professors", ProfessorViewSet) +router.register("students", StudentViewSet) app_name = "api"