Skip to content

Commit 94e7c67

Browse files
committed
current semester endpoint with tests
1 parent 66fe723 commit 94e7c67

5 files changed

Lines changed: 56 additions & 29 deletions

File tree

backend/tests/wrapped/test_routes.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from rest_framework.test import APIClient
66

77
from wrapped.models import (
8-
Font,
98
GlobalStat,
109
GlobalStatKey,
1110
GlobalStatPageField,
@@ -35,9 +34,6 @@ def setUp(self):
3534
self.glob_key = GlobalStatKey.objects.create(key="total_gsr_hours")
3635
self.glob_key2 = GlobalStatKey.objects.create(key="total_gym_hours")
3736
self.ind_key2 = IndividualStatKey.objects.create(key="gym_hours")
38-
self.font1 = Font.objects.create(name="Arial", filepath="test/fonts/arial.ttf")
39-
self.font2 = Font.objects.create(name="Verdana", filepath="test/fonts/verdana.ttf")
40-
self.font3 = Font.objects.create(name="Helvetica", filepath="test/fonts/helvetica.ttf")
4137

4238
self.ind_stat = IndividualStat.objects.create(
4339
user=self.user,
@@ -76,10 +72,6 @@ def setUp(self):
7672
template_path="wrapped/gsr_page2.html",
7773
duration=timedelta(minutes=1),
7874
)
79-
self.page.required_fonts.add(self.font1)
80-
self.page.required_fonts.add(self.font2)
81-
self.page2.required_fonts.add(self.font2)
82-
self.page2.required_fonts.add(self.font3)
8375
self.semester.pages.add(self.page)
8476
self.semester.pages.add(self.page2)
8577

@@ -123,23 +115,13 @@ def test_get_current_semester(self):
123115
"bottom": "1000",
124116
"middle_left": "2000",
125117
},
126-
"required_font_names": ["Arial", "Verdana"],
127-
"required_font_paths": [
128-
"test/fonts/arial.ttf",
129-
"test/fonts/verdana.ttf",
130-
],
131118
"duration": "00:01:00",
132119
},
133120
{
134121
"id": 2,
135122
"name": "GSR_Page2",
136123
"template_path": "wrapped/gsr_page2.html",
137124
"combined_stats": {},
138-
"required_font_names": ["Verdana", "Helvetica"],
139-
"required_font_paths": [
140-
"test/fonts/verdana.ttf",
141-
"test/fonts/helvetica.ttf",
142-
],
143125
"duration": "00:01:00",
144126
},
145127
],
@@ -164,23 +146,13 @@ def test_get_semester(self):
164146
"bottom": "1000",
165147
"middle_left": "2000",
166148
},
167-
"required_font_names": ["Arial", "Verdana"],
168-
"required_font_paths": [
169-
"test/fonts/arial.ttf",
170-
"test/fonts/verdana.ttf",
171-
],
172149
"duration": "00:01:00",
173150
},
174151
{
175152
"id": 2,
176153
"name": "GSR_Page2",
177154
"template_path": "wrapped/gsr_page2.html",
178155
"combined_stats": {},
179-
"required_font_names": ["Verdana", "Helvetica"],
180-
"required_font_paths": [
181-
"test/fonts/verdana.ttf",
182-
"test/fonts/helvetica.ttf",
183-
],
184156
"duration": "00:01:00",
185157
},
186158
],
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Generated by Django 5.0.2 on 2025-11-16 19:44
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("wrapped", "0005_alter_semester_semester"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="semester",
15+
name="current",
16+
field=models.BooleanField(default=False),
17+
),
18+
migrations.AddConstraint(
19+
model_name="semester",
20+
constraint=models.UniqueConstraint(fields=("semester",), name="semester_unique"),
21+
),
22+
migrations.AddConstraint(
23+
model_name="semester",
24+
constraint=models.UniqueConstraint(
25+
condition=models.Q(("current", True)),
26+
fields=("current",),
27+
name="single_current_semester",
28+
),
29+
),
30+
]

backend/wrapped/models.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from django.contrib.auth import get_user_model
44
from django.db import models
5+
from django.db.models import Q
56

67

78
User = get_user_model()
@@ -28,6 +29,20 @@ class GlobalStatKey(StatKey):
2829
class Semester(models.Model):
2930
semester = models.CharField(max_length=16, primary_key=True, null=False, blank=False)
3031
pages = models.ManyToManyField("Page", blank=True)
32+
current = models.BooleanField(default=False)
33+
34+
class Meta:
35+
constraints = [
36+
models.UniqueConstraint(fields=["semester"], name="semester_unique"),
37+
models.UniqueConstraint(
38+
fields=["current"],
39+
condition=Q(current=True),
40+
name="single_current_semester",
41+
),
42+
]
43+
44+
def __str__(self):
45+
return self.semester
3146

3247

3348
class GlobalStat(models.Model):

backend/wrapped/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from django.urls import path
22

3-
from wrapped.views import SemesterView
3+
from wrapped.views import SemesterCurrentView, SemesterView
44

55

66
urlpatterns = [
7+
path("semester/current/", SemesterCurrentView.as_view(), name="semester-current-detail"),
78
path("semester/<str:semester_id>/", SemesterView.as_view(), name="semester-detail"),
89
]

backend/wrapped/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,12 @@ def get(self, request, semester_id):
1313
semester = Semester.objects.get(semester=semester_id)
1414
serializer = SemesterSerializer(semester, context={"user": request.user})
1515
return Response(serializer.data)
16+
17+
18+
class SemesterCurrentView(APIView):
19+
permission_classes = [IsAuthenticated]
20+
21+
def get(self, request):
22+
current_semester = Semester.objects.filter(current=True).first()
23+
serializer = SemesterSerializer(current_semester, context={"user": request.user})
24+
return Response(serializer.data)

0 commit comments

Comments
 (0)