- various __all__

- serializer: track search, reorder module files
- autocomplete: allow simple string value selection
- playlist editor:
    - ui & flow improve
    - init data
    - save user settings
    - autocomplete
    - fix bugs
    - discard changes
This commit is contained in:
bkfox
2022-12-12 00:25:57 +01:00
parent 61af53eecb
commit 180cc8bc02
30 changed files with 708 additions and 259 deletions

View File

@ -0,0 +1,3 @@
from .log import *
from .sound import *
from .admin import *

View File

@ -0,0 +1,30 @@
from rest_framework import serializers
from taggit.serializers import TagListSerializerField, TaggitSerializer
from ..models import Track, UserSettings
__all__ = ('TrackSerializer', 'UserSettingsSerializer')
class TrackSerializer(TaggitSerializer, serializers.ModelSerializer):
tags = TagListSerializerField()
class Meta:
model = Track
fields = ('pk', 'artist', 'title', 'album', 'year', 'position',
'info', 'tags', 'episode', 'sound')
class UserSettingsSerializer(serializers.ModelSerializer):
# TODO: validate fields values (playlist_editor_columns at least)
class Meta:
model = UserSettings
fields = ('playlist_editor_columns', 'playlist_editor_sep')
def create(self, validated_data):
user = self.context.get('user')
if user:
validated_data['user_id'] = user.id
return super().create(validated_data)

53
aircox/serializers/log.py Normal file
View File

@ -0,0 +1,53 @@
from rest_framework import serializers
from ..models import Diffusion, Log
__all__ = ('LogInfo', 'LogInfoSerializer')
class LogInfo:
obj = None
start, end = None, None
title, artist = '', ''
url, cover = None, None
info = None
def __init__(self, obj):
self.obj = obj
if isinstance(obj, Diffusion):
self.from_diffusion(obj)
elif isinstance(obj, Log):
self.from_log(obj)
else:
raise ValueError('`obj` must be a Diffusion or a Track Log.')
@property
def type(self):
return 'track' if isinstance(self.obj, Log) else 'diffusion'
def from_diffusion(self, obj):
episode = obj.episode
self.start, self.end = obj.start, obj.end
self.title, self.url = episode.title, episode.get_absolute_url()
self.cover = episode.cover and episode.cover.icons['64']
self.info = episode.category and episode.category.title
self.obj = obj
def from_log(self, obj):
track = obj.track
self.start = obj.date
self.title, self.artist = track.title, track.artist
self.info = track.info
self.obj = obj
class LogInfoSerializer(serializers.Serializer):
type = serializers.CharField(max_length=10)
start = serializers.DateTimeField()
end = serializers.DateTimeField(required=False)
title = serializers.CharField(max_length=200)
artist = serializers.CharField(max_length=200, required=False)
info = serializers.CharField(max_length=200, required=False)
url = serializers.URLField(required=False)
cover = serializers.URLField(required=False)

View File

@ -0,0 +1,21 @@
from rest_framework import serializers
from ..models import Sound
class SoundSerializer(serializers.ModelSerializer):
file = serializers.FileField(use_url=False)
class Meta:
model = Sound
fields = ['pk', 'name', 'program', 'episode', 'type', 'file',
'duration', 'mtime', 'is_good_quality', 'is_public', 'url']
class PodcastSerializer(serializers.ModelSerializer):
# serializers.HyperlinkedIdentityField(view_name='sound', format='html')
class Meta:
model = Sound
fields = ['pk', 'name', 'program', 'episode', 'type',
'duration', 'mtime', 'url', 'is_downloadable']