Skip to content
Snippets Groups Projects
Commit 7ef26937 authored by Konrad Mohrfeldt's avatar Konrad Mohrfeldt :koala:
Browse files

fix(REST): fix duplicate results in show result set

The filter annotation for ordering by show ownership introduced
a join that caused some results to appear more than once.
parent 002ee321
No related branches found
No related tags found
No related merge requests found
Pipeline #5830 passed
import datetime import datetime
from django_filters import constants
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django_filters import widgets from django_filters import widgets
from django import forms from django import forms
from django.db.models import Q, QuerySet from django.db.models import Exists, OuterRef, Q, QuerySet
from django.utils import timezone from django.utils import timezone
from program import models from program import models
...@@ -38,9 +39,25 @@ class IntegerInFilter(filters.BaseInFilter): ...@@ -38,9 +39,25 @@ class IntegerInFilter(filters.BaseInFilter):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
class ShowOrderingFilter(filters.OrderingFilter):
def filter(self, qs: QuerySet, value):
if value in constants.EMPTY_VALUES:
return qs
ordering = [self.get_ordering_value(param) for param in value]
fields = (field.lstrip("-") for field in ordering)
if "is_owner" in fields:
_id = getattr(self.parent.request.user, "id", None)
qs = qs.annotate(
is_owner=Exists(
models.Show.owners.through.objects.filter(user=_id, show=OuterRef("pk")),
)
)
return qs.order_by(*ordering)
class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet): class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
order = filters.OrderingFilter( order = ShowOrderingFilter(
fields=["name", "id", "is_active", "is_owner"], fields=["name", "slug", "id", "is_active", "is_owner"],
help_text="Order shows by the given field(s).", help_text="Order shows by the given field(s).",
) )
category_ids = IntegerInFilter( category_ids = IntegerInFilter(
...@@ -100,11 +117,6 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet): ...@@ -100,11 +117,6 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
help_text="Return only shows of the given type slug.", help_text="Return only shows of the given type slug.",
) )
def filter_queryset(self, queryset):
_id = getattr(self.request.user, "id", None)
queryset = queryset.annotate(is_owner=Q(owners=_id))
return super().filter_queryset(queryset)
def filter_active(self, queryset: QuerySet, name: str, value: bool): def filter_active(self, queryset: QuerySet, name: str, value: bool):
# Filter currently running shows # Filter currently running shows
# Get currently running schedules to filter by first # Get currently running schedules to filter by first
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment