Skip to content

Commit

Permalink
Add degree list and degree detail views
Browse files Browse the repository at this point in the history
  • Loading branch information
Clue88 committed Nov 12, 2023
1 parent 2c84e26 commit 2e3da6f
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 58 deletions.
1 change: 1 addition & 0 deletions backend/PennCourses/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
path("review/", include("review.urls")),
path("plan/", include("plan.urls")),
path("alert/", include("alert.urls")),
path("degree/", include("degree.urls")),
path("base/", include("courses.urls")),
path("options/", include("options.urls", namespace="options")),
path(
Expand Down
20 changes: 20 additions & 0 deletions backend/degree/migrations/0003_degreeplan_unique degreeplan.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 3.2.20 on 2023-11-12 17:58

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("degree", "0002_auto_20231027_1120"),
]

operations = [
migrations.AddConstraint(
model_name="degreeplan",
constraint=models.UniqueConstraint(
fields=("program", "degree", "major", "concentration", "year"),
name="unique degreeplan",
),
),
]
21 changes: 15 additions & 6 deletions backend/degree/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,27 @@


class RuleSerializer(serializers.ModelSerializer):

class Meta:
model = Rule
fields = '__all__'
fields = "__all__"


RuleSerializer._declared_fields["rules"] = RuleSerializer(
many=True, read_only=True, source="children"
)


class DegreePlanSerializer(serializers.ModelSerializer):

class Meta:
model = DegreePlan
fields = "__all__"


class DegreePlanDetailSerializer(serializers.ModelSerializer):

# field to represent the rules related to this Degree Plan
rules = RuleSerializer(many=True, read_only=True)
rules = RuleSerializer(many=True, read_only=True, source="rule_set")

class Meta:
model = DegreePlan
fields = '__all__'

fields = "__all__"
22 changes: 4 additions & 18 deletions backend/degree/urls.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,11 @@
from django.urls import path
from degree import views
from degree.views import DegreeListSearch
from degree.views import DegreeList, DegreeDetail

urlpatterns = [
path("degrees/<int:year>", DegreeList.as_view(), name="degree-list"),
path(
"degrees/",
views.DegreeList.as_view(),
name="degree-list"),
path(
"search/degrees/",
DegreeListSearch.as_view(),
name="degree-search",
),
path(
"degrees/<slug:graduation>/<slug:full_code>/",
views.DegreeDetail.as_view(),
"degree_detail/<pk>",
DegreeDetail.as_view(),
name="degree-detail",
),
path(
"rules/",
views.RuleList.as_view(),
name="rule-list"
)
]
32 changes: 7 additions & 25 deletions backend/degree/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@
from rest_framework import generics
from PennCourses.docs_settings import PcxAutoSchema, reverse_func

from degree.models import (
DegreePlan,
)
from degree.models import DegreePlan, Rule

from degree.serializers import (
DegreePlanSerializer,
)
from degree.serializers import DegreePlanSerializer, DegreePlanDetailSerializer, RuleSerializer


class DegreeList(generics.ListAPIView):
"""
Retrieve a list of (all) degrees available.
Retrieve a list of (all) degrees available from a given year.
"""

schema = PcxAutoSchema(
Expand All @@ -26,17 +22,12 @@ class DegreeList(generics.ListAPIView):

serializer_class = DegreePlanSerializer

# TODO: Actually return a list of possible degrees
def get_queryset(self):
queryset = DegreePlan.filter()
year = self.kwargs["year"]
queryset = DegreePlan.objects.filter(year=year)
return queryset


class DegreeListSearch(DegreeList):
# TODO: unimplemented
pass


class DegreeDetail(generics.RetrieveAPIView):
"""
Retrieve a detailed look at a specific degree. Includes all details necessary to display degree
Expand All @@ -51,14 +42,5 @@ class DegreeDetail(generics.RetrieveAPIView):
},
)

serializer_class = DegreePlanSerializer # TODO: have a DegreeSerializer and DegreeListSerializer
lookup_field = "full_code"

# TODO: Actually include requirement data
def get_queryset(self):
queryset = DegreePlan.all()
return queryset

class RuleList(generics.RetrieveAPIView):
# TODO implement, maybe not needed
pass
serializer_class = DegreePlanDetailSerializer
queryset = DegreePlan.objects.all()
43 changes: 34 additions & 9 deletions backend/tests/degree/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,51 @@
from django.test import TestCase
from degree.models import DegreePlan, Rule


class SerializerTest(TestCase):
def setUp(self):
# Create sample DegreePlan instances
self.degree_plan_1 = DegreePlan.objects.create(program="EU_BSE", degree="BSE", major="BIOL", year=2023)
self.degree_plan_2 = DegreePlan.objects.create(program="EU_BSE", degree="BSE", major="CSCI", year=2024)
self.degree_plan_1 = DegreePlan.objects.create(
program="EU_BSE", degree="BSE", major="BIOL", year=2023
)
self.degree_plan_2 = DegreePlan.objects.create(
program="EU_BSE", degree="BSE", major="CSCI", year=2024
)

# Create sample Rule instances related to degree plans
self.rule_1 = Rule.objects.create(title="Rule 1", num_courses=4, credits=4.0, degree_plan=self.degree_plan_1, q="sample_q_1")
self.rule_2 = Rule.objects.create(title="Rule 2", num_courses=5, credits=5.0, degree_plan=self.degree_plan_1, q="sample_q_2")
self.rule_3 = Rule.objects.create(title="Rule 3", num_courses=3, credits=3.0, degree_plan=self.degree_plan_2, q="sample_q_3")
self.rule_1 = Rule.objects.create(
title="Rule 1",
num_courses=4,
credits=4.0,
degree_plan=self.degree_plan_1,
q="sample_q_1",
)
self.rule_2 = Rule.objects.create(
title="Rule 2",
num_courses=5,
credits=5.0,
degree_plan=self.degree_plan_1,
q="sample_q_2",
)
self.rule_3 = Rule.objects.create(
title="Rule 3",
num_courses=3,
credits=3.0,
degree_plan=self.degree_plan_2,
q="sample_q_3",
)

def test_degree_plan_serialization(self):
client = APIClient()
response = client.get(f'/api/degree-plan/{self.degree_plan_1.id}/') # Adjust the URL as needed
response = client.get(
f"/api/degree-plan/{self.degree_plan_1.id}/"
) # Adjust the URL as needed
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['program'], "EU_BSE")
self.assertEqual(response.data["program"], "EU_BSE")
self.assertTrue(False)

def test_rule_serialization(self):
client = APIClient()
response = client.get(f'/api/rule/{self.rule_1.id}/') # Adjust the URL as needed
response = client.get(f"/api/rule/{self.rule_1.id}/") # Adjust the URL as needed
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['title'], "Rule 1")
self.assertEqual(response.data["title"], "Rule 1")

0 comments on commit 2e3da6f

Please sign in to comment.