178 lines
5.0 KiB
Python
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',
|
|
)
|
|
|