"""News app common serializers.""" from rest_framework import serializers from gallery.models import Image from location import models as location_models from location.serializers import CountrySimpleSerializer from main.serializers import MetaDataContentSerializer from news import models from utils.methods import image_url_valid from utils.serializers import TranslatedField class NewsPromoImageSerializer(serializers.Serializer): horizontal_web_image = serializers.SerializerMethodField() horizontal_mobile_image = serializers.SerializerMethodField() def get_horizontal_web_image(self, obj): return obj['news_promo_horizontal_web'].url def get_horizontal_mobile_image(self, obj): return obj['news_promo_horizontal_mobile'].url class NewsTileImageSerializer(serializers.Serializer): horizontal_web_image = serializers.SerializerMethodField() horizontal_mobile_image = serializers.SerializerMethodField() vertical_web_image = serializers.SerializerMethodField() def get_horizontal_web_image(self, obj): return obj['news_tile_horizontal_web'].url def get_horizontal_mobile_image(self, obj): return obj['news_tile_horizontal_mobile'].url def get_vertical_web_image(self, obj): return obj['news_tile_vertical_web'].url class NewsHighlightImageSerializer(serializers.Serializer): vertical_web_image = serializers.SerializerMethodField() def get_vertical_web_image(self, obj): return obj['news_highlight_vertical'].url class NewsEditorImageSerializer(serializers.Serializer): web_image = serializers.SerializerMethodField() mobile_image = serializers.SerializerMethodField() def get_web_image(self, obj): return obj['news_editor_web'].url def get_mobile_image(self, obj): return obj['news_editor_mobile'].url class NewsGallerySerializer(serializers.ModelSerializer): promo_images = NewsPromoImageSerializer(source='image') tile_images = NewsTileImageSerializer(source='image') highlight_images = NewsHighlightImageSerializer(source='image') editor_images = NewsEditorImageSerializer(source='image') class Meta: """Meta class.""" model = Image fields = [ 'promo_images', 'tile_images', 'highlight_images', 'editor_images', ] class NewsTypeSerializer(serializers.ModelSerializer): """News type serializer.""" class Meta: """Meta class.""" model = models.NewsType fields = ('id', 'name') class NewsBaseSerializer(serializers.ModelSerializer): """Base serializer for News model.""" gallery = serializers.SerializerMethodField() # read only fields title_translated = TranslatedField() subtitle_translated = TranslatedField() # related fields news_type = NewsTypeSerializer(read_only=True) tags = MetaDataContentSerializer(read_only=True, many=True) slug = serializers.SlugField(allow_blank=False, required=True, max_length=50) class Meta: """Meta class.""" model = models.News fields = ( 'id', 'title_translated', 'subtitle_translated', 'is_highlighted', 'news_type', 'tags', 'slug', 'gallery', ) def get_gallery(self, obj): if image_url_valid(url=obj.image.image.url): return NewsGallerySerializer(obj.image).data class NewsDetailSerializer(NewsBaseSerializer): """News detail serializer.""" description_translated = TranslatedField() country = CountrySimpleSerializer(read_only=True) class Meta(NewsBaseSerializer.Meta): """Meta class.""" fields = NewsBaseSerializer.Meta.fields + ( 'description_translated', 'start', 'end', 'playlist', 'is_publish', 'author', 'country', ) class NewsBackOfficeBaseSerializer(NewsBaseSerializer): """News back office base serializer.""" class Meta(NewsBaseSerializer.Meta): """Meta class.""" fields = NewsBaseSerializer.Meta.fields + ( 'title', 'subtitle', ) class NewsBackOfficeDetailSerializer(NewsBackOfficeBaseSerializer, NewsDetailSerializer): """News detail serializer for back-office users.""" news_type_id = serializers.PrimaryKeyRelatedField( source='news_type', write_only=True, queryset=models.NewsType.objects.all()) country_id = serializers.PrimaryKeyRelatedField( source='country', write_only=True, queryset=location_models.Country.objects.all()) class Meta(NewsBackOfficeBaseSerializer.Meta, NewsDetailSerializer.Meta): """Meta class.""" fields = NewsBackOfficeBaseSerializer.Meta.fields + \ NewsDetailSerializer.Meta.fields + ( 'description', 'news_type_id', 'country_id', )