Skip to content
Snippets Groups Projects
serializers.py 3.01 KiB
Newer Older
  • Learn to ignore specific revisions
  • from funkwhale_api.music.serializers import TrackSerializer
    
    Bat's avatar
    Bat committed
    from funkwhale_api.users.serializers import UserBasicSerializer
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    from . import filters, models
    
    from .radios import registry
    
    
    class FilterSerializer(serializers.Serializer):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        type = serializers.CharField(source="code")
    
        label = serializers.CharField()
        help_text = serializers.CharField()
        fields = serializers.ReadOnlyField()
    
    
    class RadioSerializer(serializers.ModelSerializer):
    
    Bat's avatar
    Bat committed
        user = UserBasicSerializer(read_only=True)
    
    
        class Meta:
            model = models.Radio
            fields = (
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "id",
                "is_public",
                "name",
                "creation_date",
                "user",
                "config",
                "description",
            )
            read_only_fields = ("user", "creation_date")
    
    
        def save(self, **kwargs):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            kwargs["config"] = [
                filters.registry[f["type"]].clean_config(f)
                for f in self.validated_data["config"]
    
            ]
    
            return super().save(**kwargs)
    
    class RadioSessionTrackSerializerCreate(serializers.ModelSerializer):
        class Meta:
            model = models.RadioSessionTrack
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            fields = ("session",)
    
    
    
    class RadioSessionTrackSerializer(serializers.ModelSerializer):
    
        track = TrackSerializer()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            fields = ("id", "session", "position", "track")
    
    
    
    class RadioSessionSerializer(serializers.ModelSerializer):
    
    
        related_object_id = serializers.CharField(required=False, allow_null=True)
    
    
            fields = (
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "id",
                "radio_type",
                "related_object_id",
                "user",
                "creation_date",
                "custom_radio",
    
    
        def validate(self, data):
    
            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)
    
            return data
    
            validated_data["user"] = self.context.get("user")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            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"]
                )
    
    
        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