diff --git a/backend/courses/views.py b/backend/courses/views.py index 9a9397f8..66715e2a 100644 --- a/backend/courses/views.py +++ b/backend/courses/views.py @@ -251,22 +251,24 @@ def get_serializer_context(self): return context + http_method_names = ["get", "post"] search_fields = ("full_code", "title", "sections__instructors__name") + filter_backends = [TypedCourseSearchBackend, CourseSearchAdvancedFilterBackend] - def get(self, request, *args, **kwargs): - queryset = super().get_queryset() - queryset = TypedCourseSearchBackend().filter_queryset(request, queryset, self) + def get_filter_backends(self): + if self.request.method == "GET": + return [TypedCourseSearchBackend] + + if self.request.method == "POST": + return [TypedCourseSearchBackend, CourseSearchAdvancedFilterBackend] - serializer = self.get_serializer(queryset, many=True) - return Response(serializer.data) + return super().get_filter_backends() def post(self, request, *args, **kwargs): - queryset = super().get_queryset() - queryset = TypedCourseSearchBackend().filter_queryset(request, queryset, self) - queryset = CourseSearchAdvancedFilterBackend().filter_queryset(request, queryset, self) + return self.list(request, *args, **kwargs) - serializer = self.get_serializer(queryset, many=True) - return Response(serializer.data) + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) class CourseDetail(generics.RetrieveAPIView, BaseCourseMixin): diff --git a/backend/degree/views.py b/backend/degree/views.py index a569f8aa..f0008135 100644 --- a/backend/degree/views.py +++ b/backend/degree/views.py @@ -91,7 +91,7 @@ def create(self, request, *args, **kwargs): if DegreePlan.objects.filter(name=name, person=self.request.user).exists(): return Response( {"warning": f"A degree plan with name {name} already exists."}, - status=status.HTTP_409_CONFLICT + status=status.HTTP_409_CONFLICT, ) new_degree_plan = DegreePlan(name=name, person=self.request.user) new_degree_plan.save() diff --git a/frontend/plan/actions/index.js b/frontend/plan/actions/index.js index 0e98b0cf..65774d6c 100644 --- a/frontend/plan/actions/index.js +++ b/frontend/plan/actions/index.js @@ -274,42 +274,29 @@ export function fetchCourseSearch(filterData) { }; } -const advancedCourseSearch = (_, searchData) => - doAPIRequest(`/base/current/search/courses/?search=${searchData.query}`, { - method: "POST", - credentials: "include", - mode: "same-origin", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - "X-CSRFToken": getCsrf(), - }, - body: JSON.stringify(searchData.filters), - }); +function advancedCourseSearch(_, searchData) { + const empty = searchData.filters.children.length === 0; + return doAPIRequest( + `/base/current/search/courses/?search=${searchData.query}`, + { + method: empty ? "GET" : "POST", + credentials: "include", + mode: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + "X-CSRFToken": getCsrf(), + }, + body: empty ? null : JSON.stringify(searchData.filters), + } + ); +} const debouncedAdvancedCourseSearch = AwesomeDebouncePromise( advancedCourseSearch, 500 ); -export function fetchAdvancedCourseSearch(searchData) { - return (dispatch) => { - dispatch(updateSearchRequest()); - debouncedAdvancedCourseSearch(dispatch, searchData) - .then((res) => res.json()) - .then((res) => res.filter((course) => course.num_sections > 0)) - .then((res) => - batch(() => { - dispatch(updateScrollPos()); - dispatch(updateSearch(res)); - if (res.length === 1) - dispatch(fetchCourseDetails(res[0].id)); - }) - ) - .catch((error) => dispatch(courseSearchError(error))); - }; -} - export function updateSearchText(s) { return { type: UPDATE_SEARCH_TEXT,