mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-05 03:59:24 +02:00
See #170: fixed fetch of channel track not working
This commit is contained in:
parent
1d37a2c819
commit
e7622729a9
7 changed files with 100 additions and 23 deletions
|
@ -388,16 +388,19 @@ class Fetch(models.Model):
|
|||
from . import serializers
|
||||
|
||||
return {
|
||||
contexts.FW.Artist: serializers.ArtistSerializer,
|
||||
contexts.FW.Album: serializers.AlbumSerializer,
|
||||
contexts.FW.Track: serializers.TrackSerializer,
|
||||
contexts.AS.Audio: serializers.UploadSerializer,
|
||||
contexts.FW.Library: serializers.LibrarySerializer,
|
||||
contexts.AS.Group: serializers.ActorSerializer,
|
||||
contexts.AS.Person: serializers.ActorSerializer,
|
||||
contexts.AS.Organization: serializers.ActorSerializer,
|
||||
contexts.AS.Service: serializers.ActorSerializer,
|
||||
contexts.AS.Application: serializers.ActorSerializer,
|
||||
contexts.FW.Artist: [serializers.ArtistSerializer],
|
||||
contexts.FW.Album: [serializers.AlbumSerializer],
|
||||
contexts.FW.Track: [serializers.TrackSerializer],
|
||||
contexts.AS.Audio: [
|
||||
serializers.UploadSerializer,
|
||||
serializers.ChannelUploadSerializer,
|
||||
],
|
||||
contexts.FW.Library: [serializers.LibrarySerializer],
|
||||
contexts.AS.Group: [serializers.ActorSerializer],
|
||||
contexts.AS.Person: [serializers.ActorSerializer],
|
||||
contexts.AS.Organization: [serializers.ActorSerializer],
|
||||
contexts.AS.Service: [serializers.ActorSerializer],
|
||||
contexts.AS.Application: [serializers.ActorSerializer],
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1766,6 +1766,7 @@ class ChannelUploadSerializer(jsonld.JsonLdSerializer):
|
|||
disc = serializers.IntegerField(min_value=1, allow_null=True, required=False)
|
||||
album = serializers.URLField(max_length=500, required=False)
|
||||
license = serializers.URLField(allow_null=True, required=False)
|
||||
attributedTo = serializers.URLField(max_length=500, required=False)
|
||||
copyright = TruncatedCharField(
|
||||
truncate_length=music_models.MAX_LENGTHS["COPYRIGHT"],
|
||||
allow_null=True,
|
||||
|
@ -1808,9 +1809,10 @@ class ChannelUploadSerializer(jsonld.JsonLdSerializer):
|
|||
"position": jsonld.first_val(contexts.FW.position),
|
||||
"image": jsonld.first_obj(contexts.AS.image),
|
||||
"tags": jsonld.raw(contexts.AS.tag),
|
||||
"attributedTo": jsonld.first_id(contexts.AS.attributedTo),
|
||||
}
|
||||
|
||||
def validate_album(self, v):
|
||||
def _validate_album(self, v):
|
||||
return utils.retrieve_ap_object(
|
||||
v,
|
||||
actor=actors.get_service_actor(),
|
||||
|
@ -1821,6 +1823,17 @@ class ChannelUploadSerializer(jsonld.JsonLdSerializer):
|
|||
)
|
||||
|
||||
def validate(self, data):
|
||||
if not self.context.get("channel"):
|
||||
if not data.get("attributedTo"):
|
||||
raise serializers.ValidationError(
|
||||
"Missing channel context and no attributedTo available"
|
||||
)
|
||||
actor = actors.get_actor(data["attributedTo"])
|
||||
if not actor.get_channel():
|
||||
raise serializers.ValidationError("Not a channel")
|
||||
self.context["channel"] = actor.get_channel()
|
||||
if data.get("album"):
|
||||
data["album"] = self._validate_album(data["album"])
|
||||
validated_data = super().validate(data)
|
||||
if data.get("content"):
|
||||
validated_data["description"] = {
|
||||
|
|
|
@ -374,8 +374,8 @@ def fetch(fetch_obj):
|
|||
except IndexError:
|
||||
return error("missing_jsonld_type")
|
||||
try:
|
||||
serializer_class = fetch_obj.serializers[type]
|
||||
model = serializer_class.Meta.model
|
||||
serializer_classes = fetch_obj.serializers[type]
|
||||
model = serializer_classes[0].Meta.model
|
||||
except (KeyError, AttributeError):
|
||||
fetch_obj.status = "skipped"
|
||||
fetch_obj.fetch_date = timezone.now()
|
||||
|
@ -388,8 +388,14 @@ def fetch(fetch_obj):
|
|||
else:
|
||||
existing = model.objects.filter(fid=id).first()
|
||||
|
||||
serializer = serializer_class(existing, data=payload)
|
||||
if not serializer.is_valid():
|
||||
serializer = None
|
||||
for serializer_class in serializer_classes:
|
||||
serializer = serializer_class(existing, data=payload)
|
||||
if not serializer.is_valid():
|
||||
continue
|
||||
else:
|
||||
break
|
||||
if serializer.errors:
|
||||
return error("validation", validation_errors=serializer.errors)
|
||||
try:
|
||||
obj = serializer.save()
|
||||
|
|
|
@ -185,6 +185,16 @@ class UploadFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
|||
import_status="finished", library__privacy_level="everyone"
|
||||
)
|
||||
|
||||
@factory.post_generation
|
||||
def channel(self, created, extracted, **kwargs):
|
||||
if not extracted:
|
||||
return
|
||||
from funkwhale_api.audio import factories as audio_factories
|
||||
|
||||
audio_factories.ChannelFactory(
|
||||
library=self.library, artist=self.track.artist, **kwargs
|
||||
)
|
||||
|
||||
|
||||
@registry.register
|
||||
class UploadVersionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue