diff --git a/apps/news/management/commands/add_news_tags.py b/apps/news/management/commands/add_news_tags.py index 0ca2cb88..b4c5f8eb 100644 --- a/apps/news/management/commands/add_news_tags.py +++ b/apps/news/management/commands/add_news_tags.py @@ -6,7 +6,8 @@ from transfer.models import PageMetadata, Pages, PageTexts class Command(BaseCommand): - help = 'Remove old news from new bd' + help = 'Remove old news from new bd'\ + # TODO: изменить перенос тэгов по old_id новостей (они теперь от page) def handle(self, *args, **kwargs): count = 0 diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py index 33aeedfd..8596bcf7 100644 --- a/apps/news/transfer_data.py +++ b/apps/news/transfer_data.py @@ -24,21 +24,29 @@ class GroupConcat(Aggregate): def transfer_news(): news_type, _ = NewsType.objects.get_or_create(name='News') - tag_cat, _ = TagCategory.objects.get_or_create(index_name='tag') - news_type.tag_categories.add(tag_cat) + tag_cat_tag, _ = TagCategory.objects.get_or_create(index_name='tag') + tag_cat_category, _ = TagCategory.objects.get_or_create(index_name='category') + news_type.tag_categories.add(tag_cat_tag) + news_type.tag_categories.add(tag_cat_category) news_type.save() queryset = PageTexts.objects.filter( page__type='News', ).annotate( - tag_cat_id=Value(tag_cat.id, output_field=IntegerField()), + page__id=F('page__id'), news_type_id=Value(news_type.id, output_field=IntegerField()), - country_code=F('page__site__country_code_2'), - news_title=F('page__root_title'), - image=F('page__attachment_suffix_url'), - template=F('page__template'), + page__created_at=F('page__created_at'), + page__account_id=F('page__account_id'), + page__state=F('page__state'), + page__template=F('page__template'), + page__site__country_code_2=F('page__site__country_code_2'), + page__root_title=F('page__root_title'), + page__attachment_suffix_url=F('page__attachment_suffix_url'), + page__published_at=F('page__published_at'), + tags=GroupConcat('page__tags__id'), - account_id=F('page__account_id'), + tag_cat_tag_id=Value(tag_cat_tag.id, output_field=IntegerField()), + tag_cat_category_id=Value(tag_cat_category.id, output_field=IntegerField()), ) serialized_data = NewsSerializer(data=list(queryset.values()), many=True) diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index 4ef03184..15634ae7 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -11,63 +11,133 @@ from account.models import User class NewsSerializer(serializers.Serializer): - id = serializers.IntegerField() - account_id = serializers.IntegerField(allow_null=True) - tag_cat_id = serializers.IntegerField() - news_type_id = serializers.IntegerField() - news_title = serializers.CharField() - title = serializers.CharField() - summary = serializers.CharField(allow_null=True, allow_blank=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) + # old_id = page__id id -done + # news_type = 'News' создали или получили в трансфере -done + # title = {"en-GB":"some text"} из locale и title -done + # backoffice_title = page__root_title -done + # subtitle = {"en-GB":"some text"} из locale и summary -done + # description = {"en-GB":"some text"} из locale и body -done + # locale_to_description_is_active = {"en-GB": true, "fr-FR": false} из locale и true -done + # publication_date = DateField из page published_at -done ??? проверить + # publication_time = DateField из page published_at -done ??? проверить + # slugs = {"en-GB":"some slug"} из locale и slug -done + # state = page__state -done + # template = page__template -done + # country = по page__site__country_code_2 -done + # tags = по page__tags__id -progress -!!! + # gallery = в методе make_gallery из page__attachment_suffix_url -done + # created_by = page__account_id -done + # modified_by = page__account_id -done + # created = page created_at -done + locale = serializers.CharField() - image = serializers.CharField() + page__id = serializers.IntegerField() + news_type_id = serializers.IntegerField() + page__created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') + page__account_id = serializers.IntegerField(allow_null=True) + page__state = serializers.CharField() + page__template = serializers.CharField() + page__site__country_code_2 = serializers.CharField(allow_null=True) + slug = serializers.CharField() + body = serializers.CharField(allow_null=True) + title = serializers.CharField() + page__root_title = serializers.CharField() + summary = serializers.CharField(allow_null=True, allow_blank=True) + page__attachment_suffix_url = serializers.CharField() + page__published_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S', allow_null=True) + tags = serializers.CharField(allow_null=True) + tag_cat_tag_id = serializers.IntegerField() + tag_cat_category_id = serializers.IntegerField() - def create(self, validated_data): - + def create(self, data): + account = self.get_account(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), - 'created_by': self.get_account(validated_data), - 'modified_by': self.get_account(validated_data), + 'old_id': data['page__id'], + 'news_type_id': data['news_type_id'], + 'created': data['page__created_at'], + 'created_by': account, + 'modified_by': account, + 'state': self.get_state(data), + 'template': self.get_template(data), + 'country': self.get_country(data), + 'slug': {data['locale']: data['slug']}, + 'description': self.get_description(data), + 'title': {data['locale']: data['title']}, + 'backoffice_title': data['page__root_title'], + 'subtitle': self.get_subtitle(data), + 'locale_to_description_is_active': {data['locale']: True}, + 'publication_date': self.get_publication_date(data), + 'publication_time': self.get_publication_time(data), } - obj = News.objects.create(**payload) - tags = self.get_tags(validated_data) + obj, _ = News.objects.update_or_create( + old_id=data['old_id'], + defaults=payload, + ) + + tags = self.get_tags(data) for tag in tags: obj.tags.add(tag) obj.save() - self.make_gallery(validated_data, obj) + self.make_gallery(data, obj) return obj @staticmethod - def make_gallery(data, obj): - if not data['image'] or data['image'] == 'default/missing.png': - return + def get_publication_date(data): + published_at = data.get('page__published_at') + if published_at: + return published_at.date() + return None - img = Image.objects.create( - image=data['image'], - title=data['news_title'], - ) - NewsGallery.objects.create( - news=obj, - image=img, - is_main=True, - ) + @staticmethod + def get_publication_time(data): + published_at = data.get('page__published_at') + if published_at: + return published_at.time() + return None + + @staticmethod + def get_account(data): + return User.objects.filter(old_id=data['page__account_id']).first() + + @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['page__state'], News.WAITING) + + @staticmethod + def get_template(data): + templates = { + 'main': News.MAIN, + 'main.pdf.erb': News.MAIN_PDF_ERB, + 'newspaper': News.NEWSPAPER, + } + return templates.get(data['page__template'], News.MAIN) + + @staticmethod + def get_country(data): + return Country.objects.filter(code__iexact=data['page__site__country_code_2']).first() + + @staticmethod + def get_description(data): + if data['body']: + content = parse_legacy_news_content(data['body']) + return {data['locale']: content} + return None + + @staticmethod + def get_subtitle(data): + if data.get('summary'): + return {data['locale']: data['summary']} + return None @staticmethod def get_tags(data): @@ -78,7 +148,6 @@ class NewsSerializer(serializers.Serializer): 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: @@ -90,48 +159,18 @@ class NewsSerializer(serializers.Serializer): return results @staticmethod - def get_description(data): - if data['body']: - content = parse_legacy_news_content(data['body']) - return {data['locale']: content} - return None + def make_gallery(data, obj): + if not data['page__attachment_suffix_url'] or data['page__attachment_suffix_url'] == 'default/missing.png': + return - @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) + img, _ = Image.objects.get_or_create( + image=data['page__attachment_suffix_url'], + title=data['page__root_title'], + created=data['page__created_at'] + ) - @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 data.get('summary'): - content = {data['locale']: data['summary']} - else: - content = {data['locale']: data['title']} - return content - - @staticmethod - def get_account(data): - """Get account""" - return User.objects.filter(old_id=data['account_id']).first() + gal, _ = NewsGallery.objects.get_or_create( + news=obj, + image=img, + is_main=True, + )