gault-millau/apps/news/transfer_data.py
2019-12-20 16:19:04 +03:00

62 lines
2.1 KiB
Python

from pprint import pprint
from django.db.models import Aggregate, CharField, Value
from django.db.models import IntegerField, F
from news.models import NewsType
from tag.models import TagCategory
from transfer.models import PageTexts
from transfer.serializers.news import NewsSerializer
class GroupConcat(Aggregate):
function = 'GROUP_CONCAT'
template = '%(function)s(%(expressions)s)'
def __init__(self, expression, **extra):
output_field = extra.pop('output_field', CharField())
super().__init__(expression, output_field=output_field, **extra)
def as_postgresql(self, compiler, connection):
self.function = 'STRING_AGG'
return super().as_sql(compiler, connection)
def transfer_news():
news_type, _ = NewsType.objects.get_or_create(name='News')
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(
page__id=F('page__id'),
news_type_id=Value(news_type.id, output_field=IntegerField()),
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'),
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)
if serialized_data.is_valid():
serialized_data.save()
else:
pprint(f'News serializer errors: {serialized_data.errors}')
data_types = {
'news': [transfer_news]
}