def filter_queryset()

in src/olympia/ratings/views.py [0:0]


    def filter_queryset(self, qs):
        addon_identifier = None
        if self.action == 'list':
            addon_identifier = self.request.GET.get('addon')
            user_identifier = self.request.GET.get('user')
            version_identifier = self.request.GET.get('version')
            score_filter = (
                self.request.GET.get('score')
                if is_gate_active(self.request, 'ratings-score-filter')
                else None
            )
            exclude_ratings = self.request.GET.get('exclude_ratings')
            if addon_identifier:
                qs = qs.filter(addon=self.get_addon_object())
            if user_identifier:
                try:
                    user_identifier = int(user_identifier)
                except ValueError as exc:
                    raise ParseError('user parameter should be an integer.') from exc
                qs = qs.filter(user=user_identifier)
            if version_identifier:
                try:
                    version_identifier = int(version_identifier)
                except ValueError as exc:
                    raise ParseError('version parameter should be an integer.') from exc
                qs = qs.filter(version=version_identifier)
            elif addon_identifier:
                # When filtering on addon but not on version, only return the
                # latest rating posted by each user.
                qs = qs.filter(is_latest=True)
            if not addon_identifier and not user_identifier:
                # Don't allow listing ratings without filtering by add-on or
                # user.
                raise ParseError('Need an addon or user parameter')
            if user_identifier and addon_identifier and version_identifier:
                # When user, addon and version identifiers are set, we are
                # effectively only looking for one or zero objects. Fake
                # pagination in that case, avoiding all count() calls and
                # therefore related cache-machine invalidation issues. Needed
                # because the frontend wants to call this before and after
                # having posted a new rating, and needs accurate results.
                self.pagination_class = OneOrZeroPageNumberPagination
            if score_filter:
                try:
                    scores = [int(score) for score in score_filter.split(',')]
                except ValueError as exc:
                    raise ParseError(
                        'score parameter should be an integer or a list of '
                        'integers (separated by a comma).'
                    ) from exc
                qs = qs.filter(rating__in=scores)
            if exclude_ratings:
                try:
                    exclude_ratings = [
                        int(rating) for rating in exclude_ratings.split(',')
                    ]
                except ValueError as exc:
                    raise ParseError(
                        'exclude_ratings parameter should be an '
                        'integer or a list of integers '
                        '(separated by a comma).'
                    ) from exc
                qs = qs.exclude(pk__in=exclude_ratings)

        if not addon_identifier:
            # If we're not filtering by addon too, which has it's own permission
            # checks, make sure we're only returning ratings for public add-ons.
            qs = qs.filter(
                addon__status=amo.STATUS_APPROVED, addon__disabled_by_user=False
            )
        return super().filter_queryset(qs)