gault-millau/apps/transfer/serializers/news.py
2019-10-30 18:47:13 +03:00

94 lines
2.8 KiB
Python

from rest_framework import serializers
from location.models import Country
from news.models import News
from utils.legacy_parser import parse_legacy_news_content
from utils.slug_generator import generate_unique_slug
class NewsSerializer(serializers.ModelSerializer):
locale = serializers.CharField()
slug = serializers.CharField()
body = serializers.CharField(allow_null=True)
title = serializers.CharField()
template = serializers.CharField()
state = serializers.CharField()
country_code = serializers.CharField(allow_null=True)
created_at = serializers.DateTimeField(source='start', format='%m-%d-%Y %H:%M:%S')
summary = serializers.CharField(allow_null=True, allow_blank=True)
class Meta:
model = News
fields = (
'old_id',
'created_at',
'state',
'template',
'title',
'body',
'slug',
'news_type',
'locale',
'country_code',
'summary'
)
def validate(self, data):
data.update({
'slug': generate_unique_slug(News, data['slug']),
'state': self.get_state(data),
'template': self.get_template(data),
'title': self.get_title(data),
'description': self.get_description(data),
'subtitle': self.get_subtitle(data),
'country': self.get_country(data),
})
data.pop('country_code')
data.pop('body')
data.pop('locale')
return data
def create(self, validated_data):
return News.objects.create(**validated_data)
@staticmethod
def get_country(data):
return Country.objects.filter(code__iexact=data['country_code']).first()
@staticmethod
def get_template(data):
templates = {
'main': News.MAIN,
'main.pdf.erb': News.MAIN_PDF_ERB,
}
return templates.get(data['template'], News.MAIN)
@staticmethod
def get_state(data):
states = {
'new': News.WAITING,
'published': News.PUBLISHED,
'hidden': News.HIDDEN,
'published_exclusive': News.PUBLISHED_EXCLUSIVE,
'scheduled_exclusively': News.WAITING,
}
return states.get(data['state'], News.WAITING)
@staticmethod
def get_title(data):
return {data['locale']: data['title']}
@staticmethod
def get_description(data):
content = None
if data['body']:
content = parse_legacy_news_content(data['body'])
return {data['locale']: content}
@staticmethod
def get_subtitle(data):
if 'summary' in data:
content = data.pop('summary')
if content:
return {data['locale']: content}