diff --git a/program/filters.py b/program/filters.py index f530bf1de61e0a58503cd3333276baa0b2e97c40..dd78807b349560f02edef2e84c559840ed1c2ae7 100644 --- a/program/filters.py +++ b/program/filters.py @@ -71,6 +71,16 @@ class ShowOrderingFilter(filters.OrderingFilter): return qs.order_by(*ordering) +class DefaultFilterSet(filters.FilterSet): + ids = IntegerInFilter( + field_name="id", + help_text="Return only entities matching the specified id(s).", + ) + + class Meta: + fields = ("ids",) + + class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet): ids = IntegerInFilter( field_name="id", @@ -408,3 +418,14 @@ class ImageFilterSet(filters.FilterSet): class Meta: fields = ("ids",) + + +class ProfileFilterSet(DefaultFilterSet): + is_show_host = StaticQueryBooleanFilter( + query=Exists(models.Show.objects.filter(hosts=OuterRef("pk"))), + label="Is show host", + help_text="Return only profiles that are hosts of a show.", + ) + + class Meta: + fields = DefaultFilterSet.Meta.fields + ("is_show_host",) diff --git a/program/views.py b/program/views.py index 96393ecaf53896811c2dfed1e40bd8493925276b..18cbdef3621bc5b95daad09e62182b2f99cb51d0 100644 --- a/program/views.py +++ b/program/views.py @@ -1554,7 +1554,8 @@ class APIProfileViewSet(ActiveFilterMixin, viewsets.ModelViewSet): queryset = Profile.objects.all().order_by("-is_active", "name") serializer_class = ProfileSerializer pagination_class = LimitOffsetPagination - filter_backends = [drf_filters.SearchFilter] + filter_backends = [DjangoFilterBackend, drf_filters.SearchFilter] + filterset_class = filters.ProfileFilterSet search_fields = ["name", "email"] def get_serializer_context(self):