155 lines
4.6 KiB
Python
155 lines
4.6 KiB
Python
"""News app common serializers."""
|
|
from django.utils.translation import gettext_lazy as _
|
|
from rest_framework import serializers
|
|
|
|
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
|
|
from account.serializers.common import UserSerializer
|
|
|
|
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."""
|
|
|
|
# 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 = ImageSerializer(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)
|
|
author = UserSerializer(source='created_by')
|
|
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."""
|
|
image = ImageSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
"""Meta class"""
|
|
model = models.NewsGallery
|
|
fields = [
|
|
'id',
|
|
'image',
|
|
]
|
|
|
|
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
|