Skip to content
Snippets Groups Projects
Verified Commit 7ae0b23c authored by Eliot Berriot's avatar Eliot Berriot
Browse files

See #170: filtering subscribed channels in API

parent 4236cc62
No related branches found
No related tags found
No related merge requests found
from django.db.models import Q
import django_filters
from funkwhale_api.common import fields
......@@ -23,12 +25,30 @@ class ChannelFilter(moderation_filters.HiddenContentFilterSet):
)
tag = TAG_FILTER
scope = common_filters.ActorScopeFilter(actor_field="attributed_to", distinct=True)
subscribed = django_filters.BooleanFilter(
field_name="_", method="filter_subscribed"
)
class Meta:
model = models.Channel
fields = ["q", "scope", "tag"]
fields = ["q", "scope", "tag", "subscribed"]
hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["CHANNEL"]
def filter_subscribed(self, queryset, name, value):
if not self.request.user.is_authenticated:
return queryset.none()
emitted_follows = self.request.user.actor.emitted_follows.exclude(
target__channel__isnull=True
)
query = Q(actor__in=emitted_follows.values_list("target", flat=True))
if value is True:
return queryset.filter(query)
else:
return queryset.exclude(query)
class IncludeChannelsFilterSet(django_filters.FilterSet):
"""
......
from funkwhale_api.audio import filters
from funkwhale_api.audio import models
def test_channel_filter_subscribed_true(factories, mocker, queryset_equal_list):
user = factories["users.User"](with_actor=True)
channel = factories["audio.Channel"]()
other_channel = factories["audio.Channel"]()
factories["audio.Subscription"](target=channel.actor, actor=user.actor)
factories["audio.Subscription"](target=other_channel.actor)
qs = models.Channel.objects.all()
filterset = filters.ChannelFilter(
{"subscribed": "true"}, request=mocker.Mock(user=user), queryset=qs
)
assert filterset.qs == [channel]
def test_channel_filter_subscribed_false(factories, mocker, queryset_equal_list):
user = factories["users.User"](with_actor=True)
channel = factories["audio.Channel"]()
other_channel = factories["audio.Channel"]()
factories["audio.Subscription"](target=channel.actor, actor=user.actor)
factories["audio.Subscription"](target=other_channel.actor)
qs = models.Channel.objects.all()
filterset = filters.ChannelFilter(
{"subscribed": "false"}, request=mocker.Mock(user=user), queryset=qs
)
assert filterset.qs == [other_channel]
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