def courses(self): """ Returns the list of courses contained within this catalog. Returns: QuerySet """ return Course.search(self.query)
def get_queryset(self): partner = self.request.site.partner q = self.request.query_params.get('q') if q: queryset = Course.search(q) queryset = self.get_serializer_class().prefetch_queryset( queryset=queryset, partner=partner) else: if get_query_param(self.request, 'include_hidden_course_runs'): course_runs = CourseRun.objects.filter(course__partner=partner) else: course_runs = CourseRun.objects.filter( course__partner=partner).exclude(hidden=True) if get_query_param(self.request, 'marketable_course_runs_only'): course_runs = course_runs.marketable().active() if get_query_param( self.request, 'marketable_enrollable_course_runs_with_archived'): course_runs = course_runs.marketable().enrollable() if get_query_param(self.request, 'published_course_runs_only'): course_runs = course_runs.filter( status=CourseRunStatus.Published) queryset = self.get_serializer_class().prefetch_queryset( queryset=self.queryset, course_runs=course_runs, partner=partner) return queryset.order_by(Lower('key'))
def test_search(self): """ Verify the method returns a filtered queryset of courses. """ title = 'Some random title' courses = factories.CourseFactory.create_batch(3, title=title) courses = sorted(courses, key=lambda course: course.key) query = 'title:' + title actual = list(Course.search(query).order_by('key')) self.assertEqual(actual, courses)
def get_queryset(self): partner = self.request.site.partner q = self.request.query_params.get('q') # We don't want to create an additional elasticsearch index right now for draft courses, so we # try to implement a basic search behavior with this pubq parameter here against key and name. pub_q = self.request.query_params.get('pubq') edit_method = self.request.method not in SAFE_METHODS edit_mode = get_query_param(self.request, 'editable') or edit_method if edit_mode and q: raise EditableAndQUnsupported() if edit_mode and (not self.request.user.is_staff and not is_publisher_user(self.request.user)): raise PermissionDenied if edit_mode: # Start with either draft versions or real versions of the courses queryset = Course.objects.filter_drafts() queryset = CourseEditor.editable_courses(self.request.user, queryset, check_editors=edit_method) else: queryset = self.queryset if q: queryset = Course.search(q, queryset=queryset) queryset = self.get_serializer_class().prefetch_queryset(queryset=queryset, partner=partner) else: if edit_mode: course_runs = CourseRun.objects.filter_drafts(course__partner=partner) else: course_runs = CourseRun.objects.filter(course__partner=partner) if not get_query_param(self.request, 'include_hidden_course_runs'): course_runs = course_runs.exclude(hidden=True) if get_query_param(self.request, 'marketable_course_runs_only'): course_runs = course_runs.marketable().active() if get_query_param(self.request, 'marketable_enrollable_course_runs_with_archived'): course_runs = course_runs.marketable().enrollable() if get_query_param(self.request, 'published_course_runs_only'): course_runs = course_runs.filter(status=CourseRunStatus.Published) if get_query_param(self.request, 'include_deleted_programs'): programs = Program.objects.all() else: programs = Program.objects.exclude(status=ProgramStatus.Deleted) queryset = self.get_serializer_class().prefetch_queryset( queryset=queryset, course_runs=course_runs, partner=partner, programs=programs, ) if pub_q and edit_mode: return queryset.filter(Q(key__icontains=pub_q) | Q(title__icontains=pub_q)).order_by(Lower('key')) return queryset.order_by(Lower('key'))
def get_queryset(self): q = self.request.query_params.get('q', None) if q: queryset = Course.search(q) else: queryset = super(CourseViewSet, self).get_queryset() return queryset.order_by(Lower('key'))
def get_queryset(self): q = self.request.query_params.get('q', None) if q: queryset = Course.search(q) else: queryset = super(CourseViewSet, self).get_queryset() queryset = prefetch_related_objects_for_courses(queryset) return queryset.order_by(Lower('key'))
def get_queryset(self): partner = self.request.site.partner q = self.request.query_params.get('q') edit_mode = get_query_param( self.request, 'editable') or self.request.method not in SAFE_METHODS if edit_mode and q: raise EditableAndQUnsupported() # Start with either draft versions or real versions of the courses if edit_mode: # TODO: For now hardcode in draft=True until we choose to roll this out live, DISCO-818 queryset = Course.objects.filter_drafts(draft=True) queryset = CourseEditor.editable_courses(self.request.user, queryset) else: queryset = self.queryset if q: queryset = Course.search(q, queryset=queryset) queryset = self.get_serializer_class().prefetch_queryset( queryset=queryset, partner=partner) else: if edit_mode: course_runs = CourseRun.objects.filter_drafts( course__partner=partner) else: course_runs = CourseRun.objects.filter(course__partner=partner) if not get_query_param(self.request, 'include_hidden_course_runs'): course_runs = course_runs.exclude(hidden=True) if get_query_param(self.request, 'marketable_course_runs_only'): course_runs = course_runs.marketable().active() if get_query_param( self.request, 'marketable_enrollable_course_runs_with_archived'): course_runs = course_runs.marketable().enrollable() if get_query_param(self.request, 'published_course_runs_only'): course_runs = course_runs.filter( status=CourseRunStatus.Published) queryset = self.get_serializer_class().prefetch_queryset( queryset=queryset, course_runs=course_runs, partner=partner) return queryset.order_by(Lower('key'))
def test_search(self): """ Verify the method returns a filtered queryset of courses. """ title = 'Some random title' courses = factories.CourseFactory.create_batch(3, title=title) # Sort lowercase keys to prevent different sort orders due to casing. # For example, sorted(['a', 'Z']) gives ['Z', 'a'], but an ordered # queryset containing the same values may give ['a', 'Z'] depending # on the database backend in use. courses = sorted(courses, key=lambda course: course.key.lower()) query = 'title:' + title # Use Lower() to force a case-insensitive sort. actual = list(Course.search(query).order_by(Lower('key'))) self.assertEqual(actual, courses)
def get(self, request): """ Determine if a set of courses and/or course runs is found in the query results. Returns dict: mapping of course and run indentifiers included in the request to boolean values indicating whether or not the associated course or run is contained in the queryset described by the query found in the request. """ query = request.GET.get('query') course_run_ids = request.GET.get('course_run_ids', None) course_uuids = request.GET.get('course_uuids', None) partner = self.request.site.partner if query and (course_run_ids or course_uuids): identified_course_ids = set() specified_course_ids = [] if course_run_ids: course_run_ids = course_run_ids.split(',') specified_course_ids = course_run_ids identified_course_ids.update( i.key for i in CourseRun.search(query).filter( ESDSLQ('term', partner=partner.short_code) | ESDSLQ('terms', **{'key.raw': course_run_ids})). source(['key'])) if course_uuids: course_uuids = [ UUID(course_uuid) for course_uuid in course_uuids.split(',') ] specified_course_ids += course_uuids identified_course_ids.update( Course.search(query).filter( partner=partner, uuid__in=course_uuids).values_list('uuid', flat=True)) contains = { str(identifier): identifier in identified_course_ids for identifier in specified_course_ids } return Response(contains) return Response( 'CatalogQueryContains endpoint requires query and identifiers list(s)', status=status.HTTP_400_BAD_REQUEST)
def get_queryset(self): """ List one course --- parameters: - name: include_deleted_programs description: Will include deleted programs in the associated programs array required: false type: integer paramType: query multiple: false """ q = self.request.query_params.get('q', None) if q: queryset = Course.search(q) else: queryset = super(CourseViewSet, self).get_queryset() queryset = prefetch_related_objects_for_courses(queryset) return queryset.order_by(Lower('key'))