from rest_framework import serializers from gallery.models import Image from location.models import Country from news.models import News, NewsGallery from tag.models import Tag from transfer.models import PageMetadata from utils.legacy_parser import parse_legacy_news_content from utils.slug_generator import generate_unique_slug class NewsSerializer(serializers.Serializer): id = serializers.IntegerField() tag_cat_id = serializers.IntegerField() news_type_id = serializers.IntegerField() news_title = serializers.CharField() title = serializers.CharField() summary = serializers.CharField(allow_null=True) 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['id'], 'news_type_id': validated_data['news_type_id'], 'title': {validated_data['locale']: validated_data['news_title']}, 'subtitle': self.get_subtitle(validated_data), '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) for tag in tags: obj.tags.add(tag) obj.save() self.make_gallery(validated_data, obj) return obj @staticmethod def make_gallery(data, obj): if not data['image'] or data['image'] == 'default/missing.png': return img = Image.objects.create( image=data['image'], title=data['news_title'], ) NewsGallery.objects.create( news=obj, image=img, is_main=True, ) @staticmethod def get_tags(data): results = [] if not data['tags']: return results meta_ids = (int(_id) for _id in data['tags'].split(',')) tags = PageMetadata.objects.filter( id__in=meta_ids, key='tag', value__isnull=False, ) for old_tag in tags: tag, _ = Tag.objects.get_or_create( category_id=data['tag_cat_id'], label={data['locale']: old_tag.value}, ) results.append(tag) return results @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']} @staticmethod def get_subtitle(data): if 'summary' in data: content = data.pop('summary') if not content: content = {data['locale']: data['title']} return {data['locale']: content}