forked from rc/aircox
71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
from rest_framework import serializers
|
|
|
|
from .models import Diffusion, Log, Sound
|
|
|
|
|
|
__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.icons['64']
|
|
self.info = 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)
|
|
|
|
|
|
class SoundSerializer(serializers.ModelSerializer):
|
|
# serializers.HyperlinkedIdentityField(view_name='sound', format='html')
|
|
|
|
class Meta:
|
|
model = Sound
|
|
fields = ['pk', 'name', 'path', 'program', 'episode', 'embed', 'type',
|
|
'duration', 'mtime', 'is_good_quality', 'is_public']
|
|
|
|
def get_field_names(self, *args):
|
|
names = super().get_field_names(*args)
|
|
if not self.context['request'].user.is_staff and self.instance \
|
|
and not self.instance.is_public:
|
|
names.remove('path')
|
|
return names
|
|
|