from furl import furl from rest_framework import serializers from rest_framework.reverse import reverse as drf_reverse from .fields import UUIDHyperlinkedIdentityField from .models import Album, Artist, Track,Playlist,PlaylistTrack class TrackAlbumArtistSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="artist-detail") class Meta: model = Artist fields = ("uuid", "url", "name") class TrackAlbumSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="album-detail") artist = TrackAlbumArtistSerializer() class Meta: model = Album fields = ("uuid", "url", "name", "artist") class TrackSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="track-detail") album = TrackAlbumSerializer() class Meta: model = Track fields = ("uuid", "url", "name", "number", "album") class PlaylistSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="playlist-detail") class Meta: model = Playlist fields = ("uuid", "name","url",) class AlbumTrackSerializer(TrackSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="track-detail") class Meta: model = Track fields = ("uuid", "url", "name", "number") class AlbumArtistSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="artist-detail") class Meta: model = Artist fields = ("uuid", "url", "name") class AlbumSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="album-detail") artist = AlbumArtistSerializer() tracks = AlbumTrackSerializer(many=True) class Meta: model = Album fields = ("uuid", "url", "name", "year", "artist", "tracks") class ArtistSerializer(serializers.ModelSerializer): uuid = serializers.ReadOnlyField() url = UUIDHyperlinkedIdentityField(view_name="artist-detail") albums_url = serializers.SerializerMethodField() class Meta: model = Artist fields = ("uuid", "url", "name", "albums_url") def get_albums_url(self, artist): path = drf_reverse("album-list", request=self.context["request"]) return furl(path).set({"artist_uuid": artist.uuid}).url class UpdatePlaylistSerializer(serializers.ModelSerializer): ''' serializer to update Tacks ''' def __init__(self, *args, **kwargs): super(UpdatePlaylistSerializer, self).__init__(*args, **kwargs) context = kwargs.get('context', None) if context: self.request = kwargs['context']['request'] class Meta(object): ''' meta for user ''' fields = "__all__" model = Playlist def update(self, *args, **kwargs): self.instance.name = self.request.data['name'] self.instance.save() return self.instance def to_representation(self, *args, **kwargs): _ = self return { 'details': "PLAYLIST UPDATED SUCCESSFULLY" } class PlaylistCreateSerializer(serializers.ModelSerializer): ''' Serializer to create tracks ''' def __init__(self, *args, **kwargs): super(PlaylistCreateSerializer, self).__init__(*args, **kwargs) context = kwargs.get('context', None) if context: self.request = kwargs['context']['request'] class Meta(object): ''' meta for creating Playlist ''' fields = ('uuid', 'name',) model = Playlist def create(self, validated_data): instance = super(PlaylistCreateSerializer, self).create(validated_data) return instance def to_representation(self, *args, **kwargs): _ = self return { 'details': "PLAYLIST SUCCESSFULLY CREATED" }