gault-millau/apps/news/serializers.py
2019-09-26 18:38:57 +03:00

178 lines
5.0 KiB
Python

"""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',
)