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 news.models import NewsType
from tag.models import TagCategory
from transfer.models import PageTexts
from transfer.serializers.news import NewsSerializer
@ -23,16 +24,21 @@ 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', public=True)
news_type.tag_categories.add(tag_cat)
news_type.save()
queryset = PageTexts.objects.filter(
page__type='News',
).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'),
news_title=F('page__root_title'),
image=F('page__attachment_suffix_url'),
template=F('page__template'),
tags=GroupConcat('page__tags__id'),
)[:100]
)
serialized_data = NewsSerializer(data=list(queryset.values()), many=True)
if serialized_data.is_valid():

View File

@ -1,15 +1,18 @@
from rest_framework import serializers
from gallery.models import Image
from location.models import Country
from news.models import News
from tag.models import TagCategory
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):
old_id = serializers.IntegerField()
news_type = serializers.IntegerField()
id = serializers.IntegerField()
tag_cat_id = serializers.IntegerField()
news_type_id = serializers.IntegerField()
news_title = serializers.CharField()
title = serializers.CharField()
body = serializers.CharField(allow_null=True)
@ -25,8 +28,8 @@ class NewsSerializer(serializers.Serializer):
def create(self, validated_data):
payload = {
'old_id': validated_data['old_id'],
'news_type': validated_data['news_type'],
'old_id': validated_data['id'],
'news_type_id': validated_data['news_type_id'],
'title': {validated_data['locale']: validated_data['news_title']},
'subtitle': {validated_data['locale']: validated_data['title']},
'description': self.get_description(validated_data),
@ -39,23 +42,47 @@ class NewsSerializer(serializers.Serializer):
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
# TODO: теги
# TODO: галерея с картинкой
@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 None
tag_cat, _ = TagCategory.objects.get_or_create(
public=True,
label={'en-GB': 'tag'},
index_name='tag',
country='tag',
)
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):

View File

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

View File

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