Can now accept/deny follow requests

This commit is contained in:
Eliot Berriot 2018-04-14 18:50:37 +02:00
parent ca02aca327
commit fc09a3b320
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
11 changed files with 344 additions and 21 deletions

View file

@ -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

View file

@ -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'],

View file

@ -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)