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)