from rest_framework import serializers from location.models import Country from news.models import News from tag.models import TagCategory from utils.legacy_parser import parse_legacy_news_content from utils.slug_generator import generate_unique_slug class NewsSerializer(serializers.Serializer): old_id = serializers.IntegerField() news_type = serializers.IntegerField() news_title = serializers.CharField() title = serializers.CharField() body = serializers.CharField(allow_null=True) created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') slug = serializers.CharField() state = serializers.CharField() template = serializers.CharField() country_code = serializers.CharField(allow_null=True) locale = serializers.CharField() image = serializers.CharField() tags = serializers.CharField(allow_null=True) def create(self, validated_data): payload = { 'old_id': validated_data['old_id'], 'news_type': validated_data['news_type'], 'title': {validated_data['locale']: validated_data['news_title']}, 'subtitle': {validated_data['locale']: validated_data['title']}, 'description': self.get_description(validated_data), 'start': validated_data['created_at'], 'slug': generate_unique_slug(News, validated_data['slug']), 'state': self.get_state(validated_data), 'template': self.get_template(validated_data), 'country': self.get_country(validated_data), } obj = News.objects.create(**payload) tags = self.get_tags(validated_data) return obj # TODO: теги # TODO: галерея с картинкой @staticmethod def get_tags(data): if not data['tags']: return None tag_cat, _ = TagCategory.objects.get_or_create( public=True, label={'en-GB': 'tag'}, index_name='tag', country='tag', ) @staticmethod def get_description(data): if data['body']: content = parse_legacy_news_content(data['body']) return {data['locale']: content} return None @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_template(data): templates = { 'main': News.MAIN, 'main.pdf.erb': News.MAIN_PDF_ERB, } return templates.get(data['template'], News.MAIN) @staticmethod def get_country(data): return Country.objects.filter(code__iexact=data['country_code']).first() @staticmethod def get_title(data): return {data['locale']: data['title']}