Skip to content

Commit 81d6691

Browse files
authored
refactor: refactor Course.retrieve to prevent calling get_object twice (#4219)
* refactor: refactor Course.retrieve to prevent calling get_object twice * fix: refetch entitlements if they are created
1 parent 54f3973 commit 81d6691

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

course_discovery/apps/api/v1/tests/test_views/test_courses.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def test_get(self):
103103
""" Verify the endpoint returns the details for a single course. """
104104
url = reverse('api:v1:course-detail', kwargs={'key': self.course.key})
105105

106-
with self.assertNumQueries(43, threshold=3):
106+
with self.assertNumQueries(26, threshold=3):
107107
response = self.client.get(url)
108108
assert response.status_code == 200
109109
assert response.data == self.serialize_course(self.course)
@@ -112,7 +112,7 @@ def test_get_uuid(self):
112112
""" Verify the endpoint returns the details for a single course with UUID. """
113113
url = reverse('api:v1:course-detail', kwargs={'key': self.course.uuid})
114114

115-
with self.assertNumQueries(44):
115+
with self.assertNumQueries(27):
116116
response = self.client.get(url)
117117
assert response.status_code == 200
118118
assert response.data == self.serialize_course(self.course)
@@ -121,7 +121,7 @@ def test_get_exclude_deleted_programs(self):
121121
""" Verify the endpoint returns no deleted associated programs """
122122
ProgramFactory(courses=[self.course], status=ProgramStatus.Deleted)
123123
url = reverse('api:v1:course-detail', kwargs={'key': self.course.key})
124-
with self.assertNumQueries(43):
124+
with self.assertNumQueries(26):
125125
response = self.client.get(url)
126126
assert response.status_code == 200
127127
assert response.data.get('programs') == []
@@ -134,7 +134,7 @@ def test_get_include_deleted_programs(self):
134134
ProgramFactory(courses=[self.course], status=ProgramStatus.Deleted)
135135
url = reverse('api:v1:course-detail', kwargs={'key': self.course.key})
136136
url += '?include_deleted_programs=1'
137-
with self.assertNumQueries(47):
137+
with self.assertNumQueries(29):
138138
response = self.client.get(url)
139139
assert response.status_code == 200
140140
assert response.data == self.serialize_course(self.course, extra_context={'include_deleted_programs': True})

course_discovery/apps/api/v1/views/courses.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,12 @@ def retrieve(self, request, *args, **kwargs):
516516
course = self.get_object()
517517
if get_query_param(request, 'editable') and not course.entitlements.exists():
518518
create_missing_entitlement(course)
519-
520-
return super().retrieve(request, *args, **kwargs)
519+
course.refresh_from_db(fields=['entitlements'])
520+
# Rather than call super().retrieve, we instantiate the serializer and return its
521+
# data ourselves. This is to prevent duplicate calls (and hence duplicate queries)
522+
# to self.get_object. Note that we have called get_object once already(see above).
523+
serializer = self.get_serializer(course)
524+
return Response(serializer.data)
521525

522526

523527
class CourseRecommendationViewSet(RetrieveModelMixin, viewsets.GenericViewSet):

0 commit comments

Comments
 (0)