Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 10 additions & 16 deletions src/apps/api/views/competitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,44 +45,36 @@ class CompetitionViewSet(ModelViewSet):

def get_queryset(self):
qs = super().get_queryset()

# Filter for search bar
search_query = self.request.query_params.get('search')
# If user is logged in
if self.request.user.is_authenticated:

# filter by competition_type first, 'competition' by default
competition_type = self.request.query_params.get('type', Competition.COMPETITION)

if competition_type != 'any' and self.detail is False:
qs = qs.filter(competition_type=competition_type)

# Filter to only see competitions you own
mine = self.request.query_params.get('mine', None)

if mine:
# either competition is mine
# or
# I am one of the collaborator
qs = Competition.objects.filter(
(Q(created_by=self.request.user)) |
(Q(collaborators__in=[self.request.user]))

)

participating_in = self.request.query_params.get('participating_in', None)

if participating_in:
qs = qs.filter(participants__user=self.request.user, participants__status="approved")

participant_status_query = CompetitionParticipant.objects.filter(
competition=OuterRef('pk'),
user=self.request.user
).values_list('status')[:1]
qs = qs.annotate(participant_status=Subquery(participant_status_query))

# `mine` is true when this is called from "Benchmarks I'm Running"
# `participating_in` is true when this is called from "Benchmarks I'm in"
# `mine` and `participating_in` are none when this is called either from Search bar
# or from competition detail page
if (not mine) and (not participating_in):
# `search_query` is true when this is called from the search bar
if search_query:
# User is logged in then filter
# competitions which this user owns
# or
Expand All @@ -98,11 +90,14 @@ def get_queryset(self):
(Q(participants__user=self.request.user) & Q(participants__status="approved"))
).distinct()
else:
# if user is not authenticated only filter published/public competitions
qs = qs.filter(Q(published=True))
# if user is not authenticated only show public competitions in the search
if (search_query):
qs = qs.filter(Q(published=True))

# On GETs lets optimize the query to reduce DB calls
if self.request.method == 'GET':

logger.warning("\n\nGET\n\n")
qs = qs.select_related('created_by')
if self.action != 'list':
qs = qs.select_related('created_by')
Expand All @@ -125,7 +120,6 @@ def get_queryset(self):
), distinct=True)
)

search_query = self.request.query_params.get('search')
# search_query is true when called from searchbar
if search_query:
qs = qs.filter(Q(title__icontains=search_query) | Q(description__icontains=search_query))
Expand Down