53 lines
1.6 KiB
Python
53 lines
1.6 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, _ = TagCategory.objects.get_or_create(index_name='tag', public=True)
|
|
news_type.tag_categories.add(tag_cat)
|
|
news_type.save()
|
|
|
|
queryset = PageTexts.objects.filter(
|
|
page__type='News',
|
|
).annotate(
|
|
tag_cat_id=Value(tag_cat.id, output_field=IntegerField()),
|
|
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'),
|
|
tags=GroupConcat('page__tags__id'),
|
|
)
|
|
|
|
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]
|
|
}
|