news transfer

This commit is contained in:
alex 2019-10-30 15:48:32 +03:00
parent c521839389
commit 8c3306628e
4 changed files with 54 additions and 21 deletions

View File

@ -4,6 +4,7 @@ from django.db.models import Aggregate, CharField, Value
from django.db.models import IntegerField, F from django.db.models import IntegerField, F
from news.models import NewsType from news.models import NewsType
from tag.models import TagCategory
from transfer.models import PageTexts from transfer.models import PageTexts
from transfer.serializers.news import NewsSerializer from transfer.serializers.news import NewsSerializer
@ -23,16 +24,21 @@ class GroupConcat(Aggregate):
def transfer_news(): def transfer_news():
news_type, _ = NewsType.objects.get_or_create(name='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( queryset = PageTexts.objects.filter(
page__type='News', page__type='News',
).annotate( ).annotate(
news_type=Value(news_type.id, output_field=IntegerField()), 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'), country_code=F('page__site__country_code_2'),
news_title=F('page__root_title'), news_title=F('page__root_title'),
image=F('page__attachment_suffix_url'), image=F('page__attachment_suffix_url'),
template=F('page__template'), template=F('page__template'),
tags=GroupConcat('page__tags__id'), tags=GroupConcat('page__tags__id'),
)[:100] )
serialized_data = NewsSerializer(data=list(queryset.values()), many=True) serialized_data = NewsSerializer(data=list(queryset.values()), many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():

View File

@ -1,15 +1,18 @@
from rest_framework import serializers from rest_framework import serializers
from gallery.models import Image
from location.models import Country from location.models import Country
from news.models import News from news.models import News, NewsGallery
from tag.models import TagCategory from tag.models import Tag
from transfer.models import PageMetadata
from utils.legacy_parser import parse_legacy_news_content from utils.legacy_parser import parse_legacy_news_content
from utils.slug_generator import generate_unique_slug from utils.slug_generator import generate_unique_slug
class NewsSerializer(serializers.Serializer): class NewsSerializer(serializers.Serializer):
old_id = serializers.IntegerField() id = serializers.IntegerField()
news_type = serializers.IntegerField() tag_cat_id = serializers.IntegerField()
news_type_id = serializers.IntegerField()
news_title = serializers.CharField() news_title = serializers.CharField()
title = serializers.CharField() title = serializers.CharField()
body = serializers.CharField(allow_null=True) body = serializers.CharField(allow_null=True)
@ -25,8 +28,8 @@ class NewsSerializer(serializers.Serializer):
def create(self, validated_data): def create(self, validated_data):
payload = { payload = {
'old_id': validated_data['old_id'], 'old_id': validated_data['id'],
'news_type': validated_data['news_type'], 'news_type_id': validated_data['news_type_id'],
'title': {validated_data['locale']: validated_data['news_title']}, 'title': {validated_data['locale']: validated_data['news_title']},
'subtitle': {validated_data['locale']: validated_data['title']}, 'subtitle': {validated_data['locale']: validated_data['title']},
'description': self.get_description(validated_data), 'description': self.get_description(validated_data),
@ -39,23 +42,47 @@ class NewsSerializer(serializers.Serializer):
obj = News.objects.create(**payload) obj = News.objects.create(**payload)
tags = self.get_tags(validated_data) tags = self.get_tags(validated_data)
for tag in tags:
obj.tags.add(tag)
obj.save()
self.make_gallery(validated_data, obj)
return obj return obj
# TODO: теги @staticmethod
# TODO: галерея с картинкой 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 @staticmethod
def get_tags(data): def get_tags(data):
results = []
if not data['tags']: if not data['tags']:
return None return results
tag_cat, _ = TagCategory.objects.get_or_create(
public=True,
label={'en-GB': 'tag'},
index_name='tag',
country='tag',
)
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 @staticmethod
def get_description(data): def get_description(data):

View File

@ -329,8 +329,8 @@ REDOC_SETTINGS = {
# RabbitMQ # RabbitMQ
# BROKER_URL = 'amqp://rabbitmq:5672' # BROKER_URL = 'amqp://rabbitmq:5672'
# Redis # Redis
BROKER_URL = 'redis://localhost:6379/1' # BROKER_URL = 'redis://localhost:6379/1'
# BROKER_URL = 'redis://redis:6379/1' BROKER_URL = 'redis://redis:6379/1'
CELERY_RESULT_BACKEND = BROKER_URL CELERY_RESULT_BACKEND = BROKER_URL
CELERY_BROKER_URL = BROKER_URL CELERY_BROKER_URL = BROKER_URL
CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_ACCEPT_CONTENT = ['application/json']

View File

@ -19,8 +19,8 @@ DOMAIN_URI = 'gm.id-east.ru'
# ELASTICSEARCH SETTINGS # ELASTICSEARCH SETTINGS
ELASTICSEARCH_DSL = { ELASTICSEARCH_DSL = {
'default': { 'default': {
'hosts': 'localhost:9200' # 'hosts': 'localhost:9200'
# 'hosts': 'elasticsearch:9200' 'hosts': 'elasticsearch:9200'
} }
} }