Added API endpoints to list library followees and followers
This commit is contained in:
parent
3caa03aedf
commit
e82a53da35
|
@ -0,0 +1,19 @@
|
||||||
|
import django_filters
|
||||||
|
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
|
||||||
|
class FollowFilter(django_filters.FilterSet):
|
||||||
|
ordering = django_filters.OrderingFilter(
|
||||||
|
# tuple-mapping retains order
|
||||||
|
fields=(
|
||||||
|
('creation_date', 'creation_date'),
|
||||||
|
('modification_date', 'modification_date'),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Follow
|
||||||
|
fields = {
|
||||||
|
'approved': ['exact'],
|
||||||
|
}
|
|
@ -96,6 +96,22 @@ class ActorSerializer(serializers.ModelSerializer):
|
||||||
return value[:500]
|
return value[:500]
|
||||||
|
|
||||||
|
|
||||||
|
class APIActorSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.Actor
|
||||||
|
fields = [
|
||||||
|
'id',
|
||||||
|
'url',
|
||||||
|
'creation_date',
|
||||||
|
'summary',
|
||||||
|
'preferred_username',
|
||||||
|
'name',
|
||||||
|
'last_fetch_date',
|
||||||
|
'domain',
|
||||||
|
'type',
|
||||||
|
'manually_approves_followers',
|
||||||
|
|
||||||
|
]
|
||||||
class LibraryActorSerializer(ActorSerializer):
|
class LibraryActorSerializer(ActorSerializer):
|
||||||
url = serializers.ListField(
|
url = serializers.ListField(
|
||||||
child=serializers.JSONField())
|
child=serializers.JSONField())
|
||||||
|
@ -224,6 +240,9 @@ class FollowSerializer(serializers.Serializer):
|
||||||
|
|
||||||
|
|
||||||
class APIFollowSerializer(serializers.ModelSerializer):
|
class APIFollowSerializer(serializers.ModelSerializer):
|
||||||
|
actor = APIActorSerializer()
|
||||||
|
target = APIActorSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Follow
|
model = models.Follow
|
||||||
fields = [
|
fields = [
|
||||||
|
|
|
@ -18,6 +18,7 @@ from funkwhale_api.music.models import TrackFile
|
||||||
from . import activity
|
from . import activity
|
||||||
from . import actors
|
from . import actors
|
||||||
from . import authentication
|
from . import authentication
|
||||||
|
from . import filters
|
||||||
from . import library
|
from . import library
|
||||||
from . import models
|
from . import models
|
||||||
from . import permissions
|
from . import permissions
|
||||||
|
@ -177,6 +178,40 @@ class LibraryViewSet(viewsets.GenericViewSet):
|
||||||
data = library.scan_from_account_name(account)
|
data = library.scan_from_account_name(account)
|
||||||
return response.Response(data)
|
return response.Response(data)
|
||||||
|
|
||||||
|
@list_route(methods=['get'])
|
||||||
|
def following(self, request, *args, **kwargs):
|
||||||
|
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||||
|
queryset = models.Follow.objects.filter(
|
||||||
|
actor=library_actor
|
||||||
|
).select_related(
|
||||||
|
'target',
|
||||||
|
'target',
|
||||||
|
).order_by('-creation_date')
|
||||||
|
filterset = filters.FollowFilter(request.GET, queryset=queryset)
|
||||||
|
serializer = serializers.APIFollowSerializer(filterset.qs, many=True)
|
||||||
|
data = {
|
||||||
|
'results': serializer.data,
|
||||||
|
'count': len(filterset.qs),
|
||||||
|
}
|
||||||
|
return response.Response(data)
|
||||||
|
|
||||||
|
@list_route(methods=['get'])
|
||||||
|
def followers(self, request, *args, **kwargs):
|
||||||
|
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||||
|
queryset = models.Follow.objects.filter(
|
||||||
|
target=library_actor
|
||||||
|
).select_related(
|
||||||
|
'target',
|
||||||
|
'target',
|
||||||
|
).order_by('-creation_date')
|
||||||
|
filterset = filters.FollowFilter(request.GET, queryset=queryset)
|
||||||
|
serializer = serializers.APIFollowSerializer(filterset.qs, many=True)
|
||||||
|
data = {
|
||||||
|
'results': serializer.data,
|
||||||
|
'count': len(filterset.qs),
|
||||||
|
}
|
||||||
|
return response.Response(data)
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
serializer = serializers.APILibraryCreateSerializer(data=request.data)
|
serializer = serializers.APILibraryCreateSerializer(data=request.data)
|
||||||
|
|
|
@ -233,3 +233,31 @@ def test_follow_library(superuser_api_client, mocker, factories, r_mock):
|
||||||
on_behalf_of=library_actor,
|
on_behalf_of=library_actor,
|
||||||
to=[actor.url]
|
to=[actor.url]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_can_list_system_actor_following(factories, superuser_api_client):
|
||||||
|
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||||
|
follow1 = factories['federation.Follow'](actor=library_actor)
|
||||||
|
follow2 = factories['federation.Follow']()
|
||||||
|
|
||||||
|
url = reverse('api:v1:federation:libraries-following')
|
||||||
|
response = superuser_api_client.get(url)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.data['results'] == [
|
||||||
|
serializers.APIFollowSerializer(follow1).data
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def test_can_list_system_actor_followers(factories, superuser_api_client):
|
||||||
|
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||||
|
follow1 = factories['federation.Follow'](actor=library_actor)
|
||||||
|
follow2 = factories['federation.Follow'](target=library_actor)
|
||||||
|
|
||||||
|
url = reverse('api:v1:federation:libraries-followers')
|
||||||
|
response = superuser_api_client.get(url)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.data['results'] == [
|
||||||
|
serializers.APIFollowSerializer(follow2).data
|
||||||
|
]
|
||||||
|
|
Loading…
Reference in New Issue