See #170: include subscriptions count in channels API

merge-requests/1042/head
Eliot Berriot 2020-01-20 09:58:04 +01:00
rodzic 46d77cec2d
commit 3674d1235d
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6B501DFD73514E14
4 zmienionych plików z 27 dodań i 1 usunięć

Wyświetl plik

@ -97,6 +97,15 @@ class ChannelSerializer(serializers.ModelSerializer):
def get_artist(self, obj):
return music_serializers.serialize_artist_simple(obj.artist)
def to_representation(self, obj):
data = super().to_representation(obj)
if self.context.get("subscriptions_count"):
data["subscriptions_count"] = self.get_subscriptions_count(obj)
return data
def get_subscriptions_count(self, obj):
return obj.actor.received_follows.exclude(approved=False).count()
class SubscriptionSerializer(serializers.Serializer):
approved = serializers.BooleanField(read_only=True)

Wyświetl plik

@ -92,6 +92,11 @@ class ChannelViewSet(
request.user.actor.emitted_follows.filter(target=object.actor).delete()
return response.Response(status=204)
def get_serializer_context(self):
context = super().get_serializer_context()
context["subscriptions_count"] = self.action in ["retrieve", "create", "update"]
return context
class SubscriptionsViewSet(
ChannelsMixin,

Wyświetl plik

@ -90,6 +90,16 @@ def test_channel_serializer_representation(factories, to_api_date):
assert serializers.ChannelSerializer(channel).data == expected
def test_channel_serializer_representation_subscriptions_count(factories, to_api_date):
channel = factories["audio.Channel"]()
factories["federation.Follow"](target=channel.actor)
factories["federation.Follow"](target=channel.actor, approved=False)
serializer = serializers.ChannelSerializer(
channel, context={"subscriptions_count": True}
)
assert serializer.data["subscriptions_count"] == 1
def test_subscription_serializer(factories, to_api_date):
subscription = factories["audio.Subscription"]()
expected = {

Wyświetl plik

@ -41,7 +41,9 @@ def test_channel_create(logged_in_api_client):
def test_channel_detail(factories, logged_in_api_client):
channel = factories["audio.Channel"](artist__description=None)
url = reverse("api:v1:channels-detail", kwargs={"uuid": channel.uuid})
expected = serializers.ChannelSerializer(channel).data
expected = serializers.ChannelSerializer(
channel, context={"subscriptions_count": True}
).data
response = logged_in_api_client.get(url)
assert response.status_code == 200