Exemplo n.º 1
0
    def courses(self):
        """ Returns the list of courses contained within this catalog.

        Returns:
            QuerySet
        """
        return Course.search(self.query)
Exemplo n.º 2
0
    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'))
Exemplo n.º 3
0
    def courses(self):
        """ Returns the list of courses contained within this catalog.

        Returns:
            QuerySet
        """
        return Course.search(self.query)
Exemplo n.º 4
0
 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 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)
Exemplo n.º 6
0
    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'))
Exemplo n.º 7
0
    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'))
Exemplo n.º 8
0
    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'))
Exemplo n.º 9
0
    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'))
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    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'))
Exemplo n.º 13
0
    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'))