from django.core.urlresolvers import reverse
from radioco.apps.global_settings.models import SiteConfiguration, RadiocomConfiguration
from radioco.apps.radioco.tz_utils import transform_datetime_tz, get_active_timezone
from radioco.apps.programmes.models import Programme, Episode
from radioco.apps.schedules.models import Schedule
from rest_framework import serializers
[docs]class AbsoluteURLField(serializers.URLField):
"""
A field similar to URLField but returning always the absolute url
For example:
class ExampleSerializer(self):
episode_url = AbsoluteURLField()
photo_url = AbsoluteURLField(source='photo.url', read_only=True)
rss_url = AbsoluteURLField(source='slug', reverse_url='programmes:rss')
"""
def __init__(self, method_name=None, source=None, reverse_url=None, **kwargs):
self.method_name = method_name
self.reverse_url = reverse_url
kwargs['source'] = source
super(AbsoluteURLField, self).__init__(**kwargs)
[docs] def to_representation(self, value):
if self.reverse_url:
value = reverse(self.reverse_url, args=[value])
return super(AbsoluteURLField, self).to_representation(self.context['request'].build_absolute_uri(value)) if value else None
[docs]class DateTimeFieldTz(serializers.DateTimeField):
"""
Field to display the datetime in the current timezone
"""
[docs] def to_representation(self, date):
return super(DateTimeFieldTz, self).to_representation(transform_datetime_tz(date, tz=get_active_timezone()))
[docs]class ProgrammeSerializer(serializers.ModelSerializer):
runtime = serializers.DurationField()
photo_url = AbsoluteURLField(source='photo.url', read_only=True)
rss_url = AbsoluteURLField(source='slug', reverse_url='programmes:rss')
[docs]class RadiocomProgrammeSerializer(serializers.ModelSerializer):
logo_url = AbsoluteURLField(source='photo.url', read_only=True)
rss_url = AbsoluteURLField(source='slug', reverse_url='programmes:rss')
description = serializers.CharField(source='synopsis')
[docs]class EpisodeSerializer(serializers.ModelSerializer):
programme = serializers.SlugRelatedField(slug_field='slug', queryset=Programme.objects.all)
[docs]class ScheduleSerializer(serializers.ModelSerializer):
title = serializers.SerializerMethodField()
programme = serializers.SlugRelatedField(slug_field='slug', queryset=Programme.objects.all())
start = serializers.DateTimeField(source='start_dt')
runtime = serializers.ReadOnlyField()
[docs] def get_title(self, schedule):
return schedule.programme.name
[docs] def validate(self, attrs):
programme = attrs.get('programme')
start = attrs.get('start_dt')
if programme.start_dt and programme.start_dt > start \
or programme.end_dt and programme.end_dt < start:
raise serializers.ValidationError('Schedule is outside of the programme dates constraints')
return attrs
[docs]class TransmissionSerializer(serializers.Serializer):
id = serializers.IntegerField(source='schedule.id')
name = serializers.CharField(max_length=100)
slug = serializers.SlugField(max_length=100)
start = DateTimeFieldTz()
end = DateTimeFieldTz()
schedule = serializers.IntegerField(source='schedule.id')
episode = serializers.IntegerField(source='episode.id')
programme = serializers.IntegerField(source='programme.id')
programme_url = AbsoluteURLField()
episode_url = AbsoluteURLField()
type = serializers.CharField(max_length=1, source='schedule.type')
source = serializers.IntegerField(source='schedule.source.id')
[docs]class RadiocomTransmissionSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
description = serializers.CharField(source='programme.synopsis')
start = DateTimeFieldTz()
end = DateTimeFieldTz()
programme_url = AbsoluteURLField()
logo_url = AbsoluteURLField(source='programme.photo.url', read_only=True)
type = serializers.CharField(max_length=1, source='schedule.type')
rss_url = AbsoluteURLField(source='slug', reverse_url='programmes:rss')
[docs]class TransmissionSerializerLight(serializers.Serializer): # WARNING: Hack to save changes
id = serializers.IntegerField(source='schedule.id')
start = serializers.DateTimeField()
new_start = serializers.DateTimeField(allow_null=True)
[docs] def validate(self, attrs):
programme = self.instance.programme
new_start = attrs.get('new_start')
if programme.start_dt and programme.start_dt > new_start \
or programme.end_dt and programme.end_dt < new_start:
raise serializers.ValidationError('Schedule is outside of the programme dates constraints')
return attrs
[docs]class RadiocomConfigurationSerializer(serializers.ModelSerializer):
icon_url = serializers.CharField(source='big_icon_url')
big_icon_url = serializers.CharField()
station_photos = serializers.SerializerMethodField()
facebook_url = serializers.SerializerMethodField()
twitter_url = serializers.SerializerMethodField()
[docs] def get_station_photos(self, obj):
return filter(lambda x: bool(x), [image_url.strip() for image_url in obj.station_photos.split(',')])
[docs] def get_facebook_url(self, obj):
return SiteConfiguration.get_global().facebook_address