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}