From 32e7bc8a9ce69e06bb3aa06d5667d4d41a847c8b Mon Sep 17 00:00:00 2001 From: Agate Date: Wed, 22 Apr 2020 09:17:05 +0200 Subject: [PATCH] Exclude external podcasts from library home --- api/funkwhale_api/audio/filters.py | 16 +++++++++++++++- api/tests/audio/test_filters.py | 16 ++++++++++++++++ front/src/components/library/Home.vue | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/api/funkwhale_api/audio/filters.py b/api/funkwhale_api/audio/filters.py index 3a8da5ca7..6b1a9e8d9 100644 --- a/api/funkwhale_api/audio/filters.py +++ b/api/funkwhale_api/audio/filters.py @@ -4,6 +4,7 @@ import django_filters from funkwhale_api.common import fields from funkwhale_api.common import filters as common_filters +from funkwhale_api.federation import actors from funkwhale_api.moderation import filters as moderation_filters from . import models @@ -28,6 +29,7 @@ class ChannelFilter(moderation_filters.HiddenContentFilterSet): subscribed = django_filters.BooleanFilter( field_name="_", method="filter_subscribed" ) + external = django_filters.BooleanFilter(field_name="_", method="filter_external") ordering = django_filters.OrderingFilter( # tuple-mapping retains order fields=( @@ -38,7 +40,7 @@ class ChannelFilter(moderation_filters.HiddenContentFilterSet): class Meta: model = models.Channel - fields = ["q", "scope", "tag", "subscribed", "ordering"] + fields = ["q", "scope", "tag", "subscribed", "ordering", "external"] hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["CHANNEL"] def filter_subscribed(self, queryset, name, value): @@ -56,6 +58,18 @@ class ChannelFilter(moderation_filters.HiddenContentFilterSet): else: return queryset.exclude(query) + def filter_external(self, queryset, name, value): + query = Q( + attributed_to=actors.get_service_actor(), + actor__preferred_username__startswith="rssfeed-", + ) + if value is True: + queryset = queryset.filter(query) + if value is False: + queryset = queryset.exclude(query) + + return queryset + class IncludeChannelsFilterSet(django_filters.FilterSet): """ diff --git a/api/tests/audio/test_filters.py b/api/tests/audio/test_filters.py index c0cb9caa4..d7a0a7980 100644 --- a/api/tests/audio/test_filters.py +++ b/api/tests/audio/test_filters.py @@ -1,3 +1,5 @@ +import pytest + from funkwhale_api.audio import filters from funkwhale_api.audio import models @@ -30,3 +32,17 @@ def test_channel_filter_subscribed_false(factories, mocker, queryset_equal_list) ) assert filterset.qs == [other_channel] + + +@pytest.mark.parametrize("external, expected_index", [("true", 0), ("false", 1)]) +def test_channel_filter_external( + external, expected_index, factories, mocker, queryset_equal_list +): + user = factories["users.User"](with_actor=True) + channels = [factories["audio.Channel"](external=True), factories["audio.Channel"]()] + qs = models.Channel.objects.all() + filterset = filters.ChannelFilter( + {"external": external}, request=mocker.Mock(user=user), queryset=qs + ) + + assert filterset.qs == [channels[expected_index]] diff --git a/front/src/components/library/Home.vue b/front/src/components/library/Home.vue index 15f505f84..20df9429a 100644 --- a/front/src/components/library/Home.vue +++ b/front/src/components/library/Home.vue @@ -30,7 +30,7 @@

New channels

- +