"""News app common serializers.""" from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from account.serializers.common import UserSerializer from gallery.models import Image from gallery.serializers import ImageSerializer from location import models as location_models from location.serializers import CountrySimpleSerializer from main.serializers import MetaDataContentSerializer from news import models from utils.serializers import TranslatedField, ProjectModelSerializer class NewsImageSerializer(ImageSerializer): """News images""" promo_web_url = serializers.SerializerMethodField() promo_mobile_url = serializers.SerializerMethodField() class Meta: model = Image fields = ImageSerializer.Meta.fields + [ 'promo_web_url', 'promo_mobile_url' ] def get_promo_web_url(self, obj): return obj.get_image_url(thumbnail_key='news_promo_horizontal_web') def get_promo_mobile_url(self, obj): return obj.get_image_url(thumbnail_key='news_promo_horizontal_mobile') class NewsTypeSerializer(serializers.ModelSerializer): """News type serializer.""" class Meta: """Meta class.""" model = models.NewsType fields = ('id', 'name') class NewsBaseSerializer(ProjectModelSerializer): """Base serializer for News model.""" # read only fields title_translated = TranslatedField() subtitle_translated = TranslatedField() # related fields news_type = NewsTypeSerializer(read_only=True) tags = MetaDataContentSerializer(read_only=True, many=True) gallery = NewsImageSerializer(read_only=True, many=True) class Meta: """Meta class.""" model = models.News fields = ( 'id', 'title_translated', 'subtitle_translated', 'is_highlighted', 'news_type', 'tags', 'slug', 'gallery', ) class NewsDetailSerializer(NewsBaseSerializer): """News detail serializer.""" description_translated = TranslatedField() country = CountrySimpleSerializer(read_only=True) # todo: check the data redundancy author = UserSerializer(source='created_by', read_only=True) state_display = serializers.CharField(source='get_state_display', read_only=True) class Meta(NewsBaseSerializer.Meta): """Meta class.""" fields = NewsBaseSerializer.Meta.fields + ( 'description_translated', 'start', 'end', 'playlist', 'is_publish', 'state', 'state_display', 'author', 'country', 'list_also_like_news', ) 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()) template_display = serializers.CharField(source='get_template_display', read_only=True) class Meta(NewsBackOfficeBaseSerializer.Meta, NewsDetailSerializer.Meta): """Meta class.""" fields = NewsBackOfficeBaseSerializer.Meta.fields + \ NewsDetailSerializer.Meta.fields + ( 'description', 'news_type_id', 'country_id', 'template', 'template_display', ) class NewsBackOfficeGallerySerializer(serializers.ModelSerializer): """Serializer class for model NewsGallery.""" class Meta: """Meta class""" model = models.NewsGallery fields = [ 'id', ] def get_request_kwargs(self): """Get url kwargs from request.""" return self.context.get('request').parser_context.get('kwargs') def validate(self, attrs): """Override validate method.""" news_pk = self.get_request_kwargs().get('pk') image_id = self.get_request_kwargs().get('image_id') news_qs = models.News.objects.filter(pk=news_pk) image_qs = Image.objects.filter(id=image_id) if not news_qs.exists(): raise serializers.ValidationError({'detail': _('News not found')}) if not image_qs.exists(): raise serializers.ValidationError({'detail': _('Image not found')}) news = news_qs.first() image = image_qs.first() if news.news_gallery.filter(image=image).exists(): raise serializers.ValidationError({'detail': _('Image is already added')}) attrs['news'] = news attrs['image'] = image return attrs