Skip to content

Commit 1614c73

Browse files
authored
Merge pull request #8 from Lab-Lab-Lab/fix_grading_issue
Fix grading issue
2 parents 0eaabcd + 3c3f87a commit 1614c73

File tree

5 files changed

+73
-25
lines changed

5 files changed

+73
-25
lines changed

config/settings/local.py

-1
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,4 @@
6565
# CORS_ALLOWED_ORIGIN_REGEXES = [
6666
# r"^http://localhost:3000$", # works for local dev
6767
# ]
68-
print('CORS_ALLOWED_ORIGIN_REGEXES', CORS_ALLOWED_ORIGIN_REGEXES)
6968
# ------------------------------------------------------------------------------

requirements.txt

-1
This file was deleted.

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-r requirements/local.txt

teleband/assignments/api/views.py

+49-16
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, UpdateModelMixin
55
from rest_framework.response import Response
66
from rest_framework.viewsets import GenericViewSet
7+
from django.db.models import OuterRef, Subquery
78

8-
from .serializers import AssignmentViewSetSerializer, AssignmentInstrumentSerializer, AssignmentSerializer
9+
from .serializers import (
10+
AssignmentViewSetSerializer,
11+
AssignmentInstrumentSerializer,
12+
AssignmentSerializer,
13+
)
914
from teleband.assignments.api.serializers import ActivitySerializer, PiecePlanSerializer
1015
from teleband.musics.api.serializers import PartTranspositionSerializer
1116

@@ -29,14 +34,22 @@ class ActivityViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
2934
permission_classes = [IsTeacher]
3035

3136
def get_queryset(self):
32-
return self.queryset.filter(
33-
pk__in=Assignment.objects.filter(
34-
enrollment__course__slug=self.kwargs["course_slug_slug"]
37+
# Define a subquery to get the first assignment for each activity
38+
distinct_activity_assignments = (
39+
Assignment.objects.filter(
40+
enrollment__course__slug=self.kwargs["course_slug_slug"],
41+
activity=OuterRef("id"),
3542
)
36-
.distinct("activity")
37-
.values_list("pk", flat=True)
43+
.order_by("id", "pk")
44+
.values("activity_id")[:1]
3845
)
3946

47+
# Use the subquery to filter the main queryset
48+
queryset = self.queryset.filter(pk__in=Subquery(distinct_activity_assignments))
49+
50+
return queryset
51+
52+
4053
class AssignmentViewSet(
4154
RetrieveModelMixin, UpdateModelMixin, ListModelMixin, GenericViewSet
4255
):
@@ -71,16 +84,36 @@ def get_queryset(self):
7184
role = self.request.user.enrollment_set.get(course=course).role
7285

7386
if role.name == "Student":
74-
return Assignment.objects.filter(
75-
enrollment__course=course, enrollment__user=self.request.user
76-
).select_related("activity", "instrument", "piece", "activity__part_type", "instrument__transposition", "group").prefetch_related("submissions")
87+
return (
88+
Assignment.objects.filter(
89+
enrollment__course=course, enrollment__user=self.request.user
90+
)
91+
.select_related(
92+
"activity",
93+
"instrument",
94+
"piece",
95+
"activity__part_type",
96+
"instrument__transposition",
97+
"group",
98+
)
99+
.prefetch_related("submissions")
100+
)
77101
if role.name == "Teacher":
78-
return Assignment.objects.filter(enrollment__course=course).select_related("activity", "instrument", "piece", "activity__part_type", "instrument__transposition", "group")
102+
return Assignment.objects.filter(enrollment__course=course).select_related(
103+
"activity",
104+
"instrument",
105+
"piece",
106+
"activity__part_type",
107+
"instrument__transposition",
108+
"group",
109+
)
79110

80111
def list(self, request, *args, **kwargs):
81112
assignments = self.get_queryset()
82113

83-
serialized = AssignmentViewSetSerializer(assignments, context={'request': request}, many=True)
114+
serialized = AssignmentViewSetSerializer(
115+
assignments, context={"request": request}, many=True
116+
)
84117

85118
grouped = defaultdict(list)
86119
for assignment in serialized.data:
@@ -101,24 +134,24 @@ def list(self, request, *args, **kwargs):
101134
}
102135

103136
# FIXME: this should respect order from server/pieceplan and mayeb do this as a backup?
104-
orderFromActivityType = lambda a: ordering[a['activity_type_name'].split()[0]]
137+
orderFromActivityType = lambda a: ordering[a["activity_type_name"].split()[0]]
105138
for pieceplan in grouped:
106139
grouped[pieceplan].sort(key=orderFromActivityType)
107140

108141
return Response(grouped)
109142

110143

111-
class PiecePlanViewSet(
112-
RetrieveModelMixin, ListModelMixin, GenericViewSet
113-
):
144+
class PiecePlanViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
114145
serializer_class = PiecePlanSerializer
115146
queryset = PiecePlan.objects.prefetch_related("piece")
116147
lookup_field = "id"
117148
permission_classes = [IsTeacher]
118149

119150
def get_queryset(self):
120151
course = Course.objects.get(slug=self.kwargs["course_slug_slug"])
121-
return PiecePlan.objects.filter(curriculum__course=course).prefetch_related("piece")
152+
return PiecePlan.objects.filter(curriculum__course=course).prefetch_related(
153+
"piece"
154+
)
122155

123156
# def get_serializer_class(self):
124157
# if self.action == "create":

teleband/submissions/admin.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66

77
@admin.register(Submission)
88
class SubmissionAdmin(VersionAdmin):
9-
list_display = ("id", "assignment", "submitted",)
9+
list_display = (
10+
"id",
11+
"assignment",
12+
"submitted",
13+
)
1014
list_filter = ("assignment__piece",)
15+
raw_id_fields = ("assignment",)
1116

1217

1318
@admin.register(SubmissionAttachment)
@@ -27,7 +32,7 @@ class GradeAdmin(VersionAdmin):
2732
"rhythm",
2833
"tone",
2934
"expression",
30-
"created_at"
35+
"created_at",
3136
)
3237
# list_filter = ("student_submission", "own_submission", "grader")
3338
list_filter = ("grader",)

teleband/submissions/api/views.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from rest_framework.response import Response
66
from rest_framework.viewsets import GenericViewSet, ModelViewSet
77
from teleband.submissions.api.teacher_serializers import TeacherSubmissionSerializer
8-
8+
from django.db.models import OuterRef, Subquery
99

1010
from .serializers import (
1111
GradeSerializer,
@@ -72,18 +72,29 @@ def recent(self, request, **kwargs):
7272
piece_slug = request.GET["piece_slug"]
7373
activity_name = request.GET["activity_name"]
7474

75-
queryset = (
75+
# https://chatgpt.com/share/827ac4eb-110d-423c-a106-1e696059fc83
76+
# Define a subquery to get the latest submission for each enrollment
77+
latest_submissions = (
7678
Submission.objects.filter(
79+
assignment__enrollment=OuterRef("assignment__enrollment"),
7780
assignment__enrollment__course__slug=course_id,
7881
assignment__activity__activity_type__name=activity_name,
7982
assignment__part__piece__slug=piece_slug,
8083
)
81-
.order_by("assignment__enrollment", "-submitted")
82-
.distinct("assignment__enrollment")
84+
.order_by("-submitted")
85+
.values("pk")[:1]
8386
)
8487

88+
# Use the subquery to filter the main queryset
89+
filtered_submissions = Submission.objects.filter(
90+
pk__in=Subquery(latest_submissions)
91+
).order_by("assignment__enrollment", "-submitted")
92+
93+
# The final queryset will have the latest submissions for each enrollment
94+
submissions = filtered_submissions
95+
8596
serializer = self.serializer_class(
86-
queryset, many=True, context={"request": request}
97+
submissions, many=True, context={"request": request}
8798
)
8899
return Response(status=status.HTTP_200_OK, data=serializer.data)
89100

0 commit comments

Comments
 (0)