2017-06-23 21:00:42 +00:00
|
|
|
from rest_framework import serializers
|
|
|
|
|
2018-05-22 19:10:48 +00:00
|
|
|
from funkwhale_api.music.serializers import TrackSerializer
|
2018-03-31 11:59:45 +00:00
|
|
|
from funkwhale_api.users.serializers import UserBasicSerializer
|
2018-01-07 21:13:32 +00:00
|
|
|
|
2018-06-10 08:55:16 +00:00
|
|
|
from . import filters, models
|
2018-01-07 21:13:32 +00:00
|
|
|
from .radios import registry
|
|
|
|
|
|
|
|
|
|
|
|
class FilterSerializer(serializers.Serializer):
|
2018-06-09 13:36:16 +00:00
|
|
|
type = serializers.CharField(source="code")
|
2018-01-07 21:13:32 +00:00
|
|
|
label = serializers.CharField()
|
|
|
|
help_text = serializers.CharField()
|
|
|
|
fields = serializers.ReadOnlyField()
|
|
|
|
|
2017-06-23 21:00:42 +00:00
|
|
|
|
2018-01-07 21:13:32 +00:00
|
|
|
class RadioSerializer(serializers.ModelSerializer):
|
2018-03-31 11:59:45 +00:00
|
|
|
user = UserBasicSerializer(read_only=True)
|
|
|
|
|
2018-01-07 21:13:32 +00:00
|
|
|
class Meta:
|
|
|
|
model = models.Radio
|
|
|
|
fields = (
|
2018-06-09 13:36:16 +00:00
|
|
|
"id",
|
|
|
|
"is_public",
|
|
|
|
"name",
|
|
|
|
"creation_date",
|
|
|
|
"user",
|
|
|
|
"config",
|
|
|
|
"description",
|
|
|
|
)
|
|
|
|
read_only_fields = ("user", "creation_date")
|
2018-01-07 21:13:32 +00:00
|
|
|
|
|
|
|
def save(self, **kwargs):
|
2018-06-09 13:36:16 +00:00
|
|
|
kwargs["config"] = [
|
|
|
|
filters.registry[f["type"]].clean_config(f)
|
|
|
|
for f in self.validated_data["config"]
|
2018-01-07 21:13:32 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
return super().save(**kwargs)
|
2017-06-23 21:00:42 +00:00
|
|
|
|
2018-05-06 09:18:28 +00:00
|
|
|
|
2017-06-23 21:00:42 +00:00
|
|
|
class RadioSessionTrackSerializerCreate(serializers.ModelSerializer):
|
2023-09-25 22:28:11 +00:00
|
|
|
count = serializers.IntegerField(required=False, allow_null=True)
|
|
|
|
|
2017-06-23 21:00:42 +00:00
|
|
|
class Meta:
|
|
|
|
model = models.RadioSessionTrack
|
2023-09-25 22:28:11 +00:00
|
|
|
fields = ("session", "count")
|
2017-06-23 21:00:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
class RadioSessionTrackSerializer(serializers.ModelSerializer):
|
2018-05-22 19:10:48 +00:00
|
|
|
track = TrackSerializer()
|
2017-06-23 21:00:42 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = models.RadioSessionTrack
|
2018-06-09 13:36:16 +00:00
|
|
|
fields = ("id", "session", "position", "track")
|
2017-06-23 21:00:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
class RadioSessionSerializer(serializers.ModelSerializer):
|
2019-07-18 13:13:09 +00:00
|
|
|
related_object_id = serializers.CharField(required=False, allow_null=True)
|
|
|
|
|
2017-06-23 21:00:42 +00:00
|
|
|
class Meta:
|
|
|
|
model = models.RadioSession
|
2018-01-07 21:13:32 +00:00
|
|
|
fields = (
|
2018-06-09 13:36:16 +00:00
|
|
|
"id",
|
|
|
|
"radio_type",
|
|
|
|
"related_object_id",
|
|
|
|
"user",
|
|
|
|
"creation_date",
|
|
|
|
"custom_radio",
|
2022-07-15 09:07:15 +00:00
|
|
|
"config",
|
2018-05-06 09:18:28 +00:00
|
|
|
)
|
2018-01-07 21:13:32 +00:00
|
|
|
|
|
|
|
def validate(self, data):
|
2019-07-18 13:13:09 +00:00
|
|
|
radio_conf = registry[data["radio_type"]]()
|
|
|
|
if radio_conf.related_object_field:
|
|
|
|
try:
|
|
|
|
data[
|
|
|
|
"related_object_id"
|
|
|
|
] = radio_conf.related_object_field.to_internal_value(
|
|
|
|
data["related_object_id"]
|
|
|
|
)
|
|
|
|
except KeyError:
|
|
|
|
raise serializers.ValidationError("Radio requires a related object")
|
|
|
|
radio_conf.validate_session(data, **self.context)
|
2018-01-07 21:13:32 +00:00
|
|
|
return data
|
2017-06-23 21:00:42 +00:00
|
|
|
|
|
|
|
def create(self, validated_data):
|
2019-05-02 08:01:02 +00:00
|
|
|
validated_data["user"] = self.context.get("user")
|
2018-06-09 13:36:16 +00:00
|
|
|
if validated_data.get("related_object_id"):
|
|
|
|
radio = registry[validated_data["radio_type"]]()
|
|
|
|
validated_data["related_object"] = radio.get_related_object(
|
|
|
|
validated_data["related_object_id"]
|
|
|
|
)
|
2017-06-23 21:00:42 +00:00
|
|
|
return super().create(validated_data)
|
2019-07-18 13:13:09 +00:00
|
|
|
|
|
|
|
def to_representation(self, instance):
|
|
|
|
repr = super().to_representation(instance)
|
|
|
|
radio_conf = registry[repr["radio_type"]]()
|
|
|
|
handler = getattr(radio_conf, "get_related_object_id_repr", None)
|
|
|
|
if handler and instance.related_object:
|
|
|
|
repr["related_object_id"] = handler(instance.related_object)
|
|
|
|
return repr
|