46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from rest_framework import serializers
|
|
|
|
from funkwhale_api.music import models as music_models
|
|
from . import models
|
|
|
|
|
|
class FilteredArtistSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = music_models.Artist
|
|
fields = ["id", "name"]
|
|
|
|
|
|
class TargetSerializer(serializers.Serializer):
|
|
type = serializers.ChoiceField(choices=["artist"])
|
|
id = serializers.CharField()
|
|
|
|
def to_representation(self, value):
|
|
if value["type"] == "artist":
|
|
data = FilteredArtistSerializer(value["obj"]).data
|
|
data.update({"type": "artist"})
|
|
return data
|
|
|
|
def to_internal_value(self, value):
|
|
if value["type"] == "artist":
|
|
field = serializers.PrimaryKeyRelatedField(
|
|
queryset=music_models.Artist.objects.all()
|
|
)
|
|
value["obj"] = field.to_internal_value(value["id"])
|
|
return value
|
|
|
|
|
|
class UserFilterSerializer(serializers.ModelSerializer):
|
|
target = TargetSerializer()
|
|
|
|
class Meta:
|
|
model = models.UserFilter
|
|
fields = ["uuid", "target", "creation_date"]
|
|
read_only_fields = ["uuid", "creation_date"]
|
|
|
|
def validate(self, data):
|
|
target = data.pop("target")
|
|
if target["type"] == "artist":
|
|
data["target_artist"] = target["obj"]
|
|
|
|
return data
|