mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 04:09:25 +02:00
Ensure owner of tracks/albums/artists can approve suggestions
This commit is contained in:
parent
5b7fad0bef
commit
22bd1512c7
5 changed files with 86 additions and 7 deletions
|
@ -11,7 +11,12 @@ def can_suggest(obj, actor):
|
|||
|
||||
|
||||
def can_approve(obj, actor):
|
||||
return obj.is_local and actor.user and actor.user.get_permissions()["library"]
|
||||
if not obj.is_local or not actor.user:
|
||||
return False
|
||||
|
||||
return (
|
||||
actor.id is not None and actor.id == obj.attributed_to_id
|
||||
) or actor.user.get_permissions()["library"]
|
||||
|
||||
|
||||
class TagMutation(mutations.UpdateMutationSerializer):
|
||||
|
|
|
@ -19,6 +19,16 @@ from . import filters, models, tasks
|
|||
cover_field = VersatileImageFieldSerializer(allow_null=True, sizes="square")
|
||||
|
||||
|
||||
def serialize_attributed_to(self, obj):
|
||||
# Import at runtime to avoid a circular import issue
|
||||
from funkwhale_api.federation import serializers as federation_serializers
|
||||
|
||||
if not obj.attributed_to_id:
|
||||
return
|
||||
|
||||
return federation_serializers.APIActorSerializer(obj.attributed_to).data
|
||||
|
||||
|
||||
class LicenseSerializer(serializers.Serializer):
|
||||
id = serializers.SerializerMethodField()
|
||||
url = serializers.URLField()
|
||||
|
@ -68,6 +78,7 @@ class ArtistAlbumSerializer(serializers.ModelSerializer):
|
|||
class ArtistWithAlbumsSerializer(serializers.ModelSerializer):
|
||||
albums = ArtistAlbumSerializer(many=True, read_only=True)
|
||||
tags = serializers.SerializerMethodField()
|
||||
attributed_to = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = models.Artist
|
||||
|
@ -80,12 +91,15 @@ class ArtistWithAlbumsSerializer(serializers.ModelSerializer):
|
|||
"albums",
|
||||
"is_local",
|
||||
"tags",
|
||||
"attributed_to",
|
||||
)
|
||||
|
||||
def get_tags(self, obj):
|
||||
tagged_items = getattr(obj, "_prefetched_tagged_items", [])
|
||||
return [ti.tag.name for ti in tagged_items]
|
||||
|
||||
get_attributed_to = serialize_attributed_to
|
||||
|
||||
|
||||
class ArtistSimpleSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
|
@ -139,6 +153,7 @@ class AlbumSerializer(serializers.ModelSerializer):
|
|||
cover = cover_field
|
||||
is_playable = serializers.SerializerMethodField()
|
||||
tags = serializers.SerializerMethodField()
|
||||
attributed_to = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = models.Album
|
||||
|
@ -155,8 +170,11 @@ class AlbumSerializer(serializers.ModelSerializer):
|
|||
"is_playable",
|
||||
"is_local",
|
||||
"tags",
|
||||
"attributed_to",
|
||||
)
|
||||
|
||||
get_attributed_to = serialize_attributed_to
|
||||
|
||||
def get_tracks(self, o):
|
||||
ordered_tracks = o.tracks.all()
|
||||
return AlbumTrackSerializer(ordered_tracks, many=True).data
|
||||
|
@ -213,6 +231,7 @@ class TrackSerializer(serializers.ModelSerializer):
|
|||
uploads = serializers.SerializerMethodField()
|
||||
listen_url = serializers.SerializerMethodField()
|
||||
tags = serializers.SerializerMethodField()
|
||||
attributed_to = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = models.Track
|
||||
|
@ -232,8 +251,11 @@ class TrackSerializer(serializers.ModelSerializer):
|
|||
"license",
|
||||
"is_local",
|
||||
"tags",
|
||||
"attributed_to",
|
||||
)
|
||||
|
||||
get_attributed_to = serialize_attributed_to
|
||||
|
||||
def get_listen_url(self, obj):
|
||||
return obj.listen_url
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ def get_libraries(filter_uploads):
|
|||
|
||||
|
||||
class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
|
||||
queryset = models.Artist.objects.all()
|
||||
queryset = models.Artist.objects.all().select_related("attributed_to")
|
||||
serializer_class = serializers.ArtistWithAlbumsSerializer
|
||||
permission_classes = [oauth_permissions.ScopePermission]
|
||||
required_scope = "libraries"
|
||||
|
@ -92,7 +92,9 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
|
|||
|
||||
class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
|
||||
queryset = (
|
||||
models.Album.objects.all().order_by("artist", "release_date").select_related()
|
||||
models.Album.objects.all()
|
||||
.order_by("artist", "release_date")
|
||||
.select_related("artist", "attributed_to")
|
||||
)
|
||||
serializer_class = serializers.AlbumSerializer
|
||||
permission_classes = [oauth_permissions.ScopePermission]
|
||||
|
@ -188,7 +190,11 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
|
|||
A simple ViewSet for viewing and editing accounts.
|
||||
"""
|
||||
|
||||
queryset = models.Track.objects.all().for_nested_serialization()
|
||||
queryset = (
|
||||
models.Track.objects.all()
|
||||
.for_nested_serialization()
|
||||
.select_related("attributed_to")
|
||||
)
|
||||
serializer_class = serializers.TrackSerializer
|
||||
permission_classes = [oauth_permissions.ScopePermission]
|
||||
required_scope = "libraries"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue