Commit 6fa23b7f by Clinton Blackburn

Improved 404 Handling

The query to check if course data exists can be quite slow for some tables. Instead of running this query, we simply execute the actual query to retrieve data. If no data is returned, DRF will return a 404.
parent 603c1c27
...@@ -129,19 +129,17 @@ class CourseViewTestCaseMixin(DemoCourseMixin): ...@@ -129,19 +129,17 @@ class CourseViewTestCaseMixin(DemoCourseMixin):
raise NotImplementedError raise NotImplementedError
def assertIntervalFilteringWorks(self, expected_response, start_date, end_date): def assertIntervalFilteringWorks(self, expected_response, start_date, end_date):
# If start date is after date of existing data, no data should be returned # If start date is after date of existing data, return a 404
date = (start_date + datetime.timedelta(days=30)).strftime(settings.DATE_FORMAT) date = (start_date + datetime.timedelta(days=30)).strftime(settings.DATE_FORMAT)
response = self.authenticated_get( response = self.authenticated_get(
'%scourses/%s%s?start_date=%s' % (self.api_root_path, self.course_id, self.path, date)) '%scourses/%s%s?start_date=%s' % (self.api_root_path, self.course_id, self.path, date))
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 404)
self.assertListEqual([], response.data)
# If end date is before date of existing data, no data should be returned # If end date is before date of existing data, return a 404
date = (start_date - datetime.timedelta(days=30)).strftime(settings.DATE_FORMAT) date = (start_date - datetime.timedelta(days=30)).strftime(settings.DATE_FORMAT)
response = self.authenticated_get( response = self.authenticated_get(
'%scourses/%s%s?end_date=%s' % (self.api_root_path, self.course_id, self.path, date)) '%scourses/%s%s?end_date=%s' % (self.api_root_path, self.course_id, self.path, date))
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 404)
self.assertListEqual([], response.data)
# If data falls in date range, data should be returned # If data falls in date range, data should be returned
start_date = start_date.strftime(settings.DATE_FORMAT) start_date = start_date.strftime(settings.DATE_FORMAT)
......
...@@ -21,6 +21,7 @@ class BaseCourseView(generics.ListAPIView): ...@@ -21,6 +21,7 @@ class BaseCourseView(generics.ListAPIView):
end_date = None end_date = None
course_id = None course_id = None
slug = None slug = None
allow_empty = False
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.course_id = self.kwargs.get('course_id') self.course_id = self.kwargs.get('course_id')
...@@ -41,17 +42,10 @@ class BaseCourseView(generics.ListAPIView): ...@@ -41,17 +42,10 @@ class BaseCourseView(generics.ListAPIView):
return super(BaseCourseView, self).get(request, *args, **kwargs) return super(BaseCourseView, self).get(request, *args, **kwargs)
def verify_course_exists_or_404(self, course_id):
if self.model.objects.filter(course_id=course_id).exists():
return True
raise Http404
def apply_date_filtering(self, queryset): def apply_date_filtering(self, queryset):
raise NotImplementedError raise NotImplementedError
def get_queryset(self): def get_queryset(self):
self.verify_course_exists_or_404(self.course_id)
queryset = self.model.objects.filter(course_id=self.course_id) queryset = self.model.objects.filter(course_id=self.course_id)
queryset = self.apply_date_filtering(queryset) queryset = self.apply_date_filtering(queryset)
return queryset return queryset
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment