mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 07:49:23 +02:00
Can now accept/deny follow requests
This commit is contained in:
parent
ca02aca327
commit
fc09a3b320
11 changed files with 344 additions and 21 deletions
|
@ -43,6 +43,7 @@ class LibraryTrackFilter(django_filters.FilterSet):
|
|||
|
||||
|
||||
class FollowFilter(django_filters.FilterSet):
|
||||
pending = django_filters.CharFilter(method='filter_pending')
|
||||
ordering = django_filters.OrderingFilter(
|
||||
# tuple-mapping retains order
|
||||
fields=(
|
||||
|
@ -50,9 +51,16 @@ class FollowFilter(django_filters.FilterSet):
|
|||
('modification_date', 'modification_date'),
|
||||
),
|
||||
)
|
||||
q = fields.SearchFilter(search_fields=[
|
||||
'actor__domain',
|
||||
'actor__preferred_username',
|
||||
])
|
||||
|
||||
class Meta:
|
||||
model = models.Follow
|
||||
fields = {
|
||||
'approved': ['exact'],
|
||||
}
|
||||
fields = ['approved', 'pending', 'q']
|
||||
|
||||
def filter_pending(self, queryset, field_name, value):
|
||||
if value.lower() in ['true', '1', 'yes']:
|
||||
queryset = queryset.filter(approved__isnull=True)
|
||||
return queryset
|
||||
|
|
|
@ -190,6 +190,35 @@ class APILibraryScanSerializer(serializers.Serializer):
|
|||
until = serializers.DateTimeField(required=False)
|
||||
|
||||
|
||||
class APILibraryFollowUpdateSerializer(serializers.Serializer):
|
||||
follow = serializers.IntegerField()
|
||||
approved = serializers.BooleanField()
|
||||
|
||||
def validate_follow(self, value):
|
||||
from . import actors
|
||||
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||
qs = models.Follow.objects.filter(
|
||||
pk=value,
|
||||
target=library_actor,
|
||||
)
|
||||
try:
|
||||
return qs.get()
|
||||
except models.Follow.DoesNotExist:
|
||||
raise serializers.ValidationError('Invalid follow')
|
||||
|
||||
def save(self):
|
||||
new_status = self.validated_data['approved']
|
||||
follow = self.validated_data['follow']
|
||||
if new_status == follow.approved:
|
||||
return follow
|
||||
|
||||
follow.approved = new_status
|
||||
follow.save(update_fields=['approved', 'modification_date'])
|
||||
if new_status:
|
||||
activity.accept_follow(follow)
|
||||
return follow
|
||||
|
||||
|
||||
class APILibraryCreateSerializer(serializers.ModelSerializer):
|
||||
actor = serializers.URLField()
|
||||
federation_enabled = serializers.BooleanField()
|
||||
|
@ -233,8 +262,13 @@ class APILibraryCreateSerializer(serializers.ModelSerializer):
|
|||
library_data = library.get_library_data(
|
||||
acs.validated_data['library_url'])
|
||||
if 'errors' in library_data:
|
||||
raise serializers.ValidationError(str(library_data['errors']))
|
||||
# we pass silently because it may means we require permission
|
||||
# before scanning
|
||||
pass
|
||||
validated_data['library'] = library_data
|
||||
validated_data['library'].setdefault(
|
||||
'id', acs.validated_data['library_url']
|
||||
)
|
||||
validated_data['actor'] = actor
|
||||
return validated_data
|
||||
|
||||
|
@ -244,7 +278,7 @@ class APILibraryCreateSerializer(serializers.ModelSerializer):
|
|||
defaults={
|
||||
'actor': validated_data['actor'],
|
||||
'follow': validated_data['follow'],
|
||||
'tracks_count': validated_data['library']['totalItems'],
|
||||
'tracks_count': validated_data['library'].get('totalItems'),
|
||||
'federation_enabled': validated_data['federation_enabled'],
|
||||
'autoimport': validated_data['autoimport'],
|
||||
'download_files': validated_data['download_files'],
|
||||
|
|
|
@ -221,31 +221,42 @@ class LibraryViewSet(
|
|||
queryset = models.Follow.objects.filter(
|
||||
actor=library_actor
|
||||
).select_related(
|
||||
'target',
|
||||
'actor',
|
||||
'target',
|
||||
).order_by('-creation_date')
|
||||
filterset = filters.FollowFilter(request.GET, queryset=queryset)
|
||||
serializer = serializers.APIFollowSerializer(filterset.qs, many=True)
|
||||
final_qs = filterset.qs
|
||||
serializer = serializers.APIFollowSerializer(final_qs, many=True)
|
||||
data = {
|
||||
'results': serializer.data,
|
||||
'count': len(filterset.qs),
|
||||
'count': len(final_qs),
|
||||
}
|
||||
return response.Response(data)
|
||||
|
||||
@list_route(methods=['get'])
|
||||
@list_route(methods=['get', 'patch'])
|
||||
def followers(self, request, *args, **kwargs):
|
||||
if request.method.lower() == 'patch':
|
||||
serializer = serializers.APILibraryFollowUpdateSerializer(
|
||||
data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
follow = serializer.save()
|
||||
return response.Response(
|
||||
serializers.APIFollowSerializer(follow).data
|
||||
)
|
||||
|
||||
library_actor = actors.SYSTEM_ACTORS['library'].get_actor_instance()
|
||||
queryset = models.Follow.objects.filter(
|
||||
target=library_actor
|
||||
).select_related(
|
||||
'target',
|
||||
'actor',
|
||||
'target',
|
||||
).order_by('-creation_date')
|
||||
filterset = filters.FollowFilter(request.GET, queryset=queryset)
|
||||
serializer = serializers.APIFollowSerializer(filterset.qs, many=True)
|
||||
final_qs = filterset.qs
|
||||
serializer = serializers.APIFollowSerializer(final_qs, many=True)
|
||||
data = {
|
||||
'results': serializer.data,
|
||||
'count': len(filterset.qs),
|
||||
'count': len(final_qs),
|
||||
}
|
||||
return response.Response(data)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue