Merge branch 'feature/migrate-city-objects' of ssh://gl.id-east.ru:222/gm/gm-backend into feature/migrate-city-objects

This commit is contained in:
michail 2019-10-21 11:08:05 +05:00
commit ec55f7915f
6 changed files with 141 additions and 41 deletions

View File

@ -0,0 +1,23 @@
from transfer.serializers.news import NewsSerializer
from transfer.models import PageTexts
from news.models import NewsType
from django.db.models import Value, IntegerField, F
from pprint import pprint
def transfer_news():
news_type, _ = NewsType.objects.get_or_create(name="News")
queryset = PageTexts.objects.all().annotate(news_type=Value(news_type.id, output_field=IntegerField()))
queryset = queryset.annotate(attachment_file_name=F('page__attachment_file_name'))
queryset = queryset.annotate(template=F('page__template'))
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]
}

View File

@ -369,16 +369,16 @@ class GuideFilters(MigrateMixin):
managed = False
db_table = 'guide_filters'
class GuideSections(MigrateMixin):
using = 'legacy'
type = models.CharField(max_length=255)
key_name = models.CharField(max_length=255, blank=True, null=True)
value_name = models.CharField(max_length=255, blank=True, null=True)
right = models.IntegerField(blank=True, null=True)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
#
# class GuideSections(MigrateMixin):
# using = 'legacy'
#
# type = models.CharField(max_length=255)
# key_name = models.CharField(max_length=255, blank=True, null=True)
# value_name = models.CharField(max_length=255, blank=True, null=True)
# right = models.IntegerField(blank=True, null=True)
# created_at = models.DateTimeField()
# updated_at = models.DateTimeField()
# class GuideElements(MigrateMixin):

View File

View File

@ -0,0 +1,41 @@
from rest_framework import serializers
from news.models import News
class NewsSerializer(serializers.ModelSerializer):
image_url = serializers.SerializerMethodField()
preview_image_url = serializers.SerializerMethodField()
description = serializers.SerializerMethodField()
title = serializers.SerializerMethodField()
class Meta:
model = News
fields = (
"state",
"template",
"image_url",
"preview_image_url",
"title",
"description",
"slug",
"news_type"
)
def get_title(self, obj):
return f'{"en-GB": {obj.title}}'
def get_description(self, obj):
if not hasattr(obj, "body"):
return ""
else:
return obj.body
def get_image_url(self, obj):
if not hasattr(obj, "attachment_file_name") or obj.attachment_file_name is None:
return ""
return obj.attachment_file_name
def get_preview_image_url(self, obj):
if not hasattr(obj, "attachment_file_name") or obj.attachment_file_name is None:
return ""
return obj.attachment_file_name

View File

@ -1,3 +1,14 @@
from django.test import TestCase
# Create your tests here.
# from django.core.management import call_command
#
#
# class NewsTransferTestCase(TestCase):
# command = "-n"
#
# databases = {'default', 'legacy'}
#
# def test_transfer(self):
# args = [self.command]
# kwargs = {}
#
# call_command('transfer', *args, **kwargs)

View File

@ -7,27 +7,45 @@ from pprint import pprint
def transfer_objects(data_type):
models_list = {}
for app in apps.get_app_configs():
if exists(f"{app.path}/transfer.py"):
card_module = SourceFileLoader("transfer", f"{app.path}/transfer.py").load_module()
if not hasattr(card_module, "card") or len(card_module.card) < 1:
if exists(f"{app.path}/transfer_data.py"):
card_module = SourceFileLoader("transfer", f"{app.path}/transfer_data.py").load_module()
if not hasattr(card_module, "data_types") or not isinstance(card_module.data_types, dict) or len(card_module.data_types) < 1:
continue
for model, card in card_module.card.items():
if "data_type" in card and data_type == card["data_type"]:
card['app_label'] = app.label
models_list[model] = card
for module_data_type, transfer_funcs in card_module.data_types.items():
if data_type == module_data_type:
# card['app_label'] = app.label
# models_list[model] = card
for transfer_func in transfer_funcs:
print(f"========================== FUNCTION {transfer_func.__name__} ================================")
transfer_func()
# if len(models_list) < 1:
# print(f"Models with data type {data_type} not found in structure")
# exit(1)
# models_list = sort_by_dependencies(models_list)
#
# for model, card in models_list.items():
# transfer_data(model, card)
if len(models_list) < 1:
print(f"Models with data type {data_type} not found in structure")
exit(1)
models_list = sort_by_dependencies(models_list)
for model, card in models_list.items():
transfer_data(model, card)
# TRANSFER DATA FUNCTION
@ -67,9 +85,9 @@ def get_fields_map(card, queryset):
fields_list = list(card['fields'].values())[0]
app_queryset_list = []
print("==============================================================================")
pprint(card)
print("==============================================================================")
# print("==============================================================================")
# pprint(card)
# print("==============================================================================")
for legacy_object in queryset.iterator():
app_queryset_dict = {}
@ -77,19 +95,18 @@ def get_fields_map(card, queryset):
app_value = convert_field_from_legacy_to_app(legacy_object, legacy_field)
if app_value is not None:
app_queryset_dict[app_field] = app_value
if relations is not None:
for relation_table, relation_data in relations.items():
# print(f"{relation_table.lower()}_set")
print(legacy_object.pagetext)
# relation_object = getattr(legacy_object, f"{relation_table.lower()}_set")
# print(relation_object)
print("==============================")
pprint(app_queryset_dict)
app_queryset_list.append(app_queryset_dict)
# pprint(card)
# print("*************************************")
# pprint(fields_list)
# print("*************************************")
# pprint(relations)
# print("*************************************")
# pprint(len(queryset))
return app_queryset_list
@ -178,15 +195,23 @@ def get_legacy_data(card):
"""Одиночное поле"""
legacy_fields.append(legacy_field[0])
queryset = legacy_model.objects.only(*legacy_fields)[:50]# TODO: remove after debug
queryset = legacy_model.objects.all()[:50]# TODO: remove after debug
# Возвращаем зависимости на место
if relations:
if relations is not None:
queryset = add_legacy_relation_data(queryset, relations)
card['fields']['relations'] = relations
return queryset
# Add relation data to queryset
def add_legacy_relation_data(queryset, relations):
for relation_table in relations.keys():
queryset = queryset.prefetch_related(relation_table.lower())
return queryset
# Models sort
def sort_by_dependencies(data):
"""Сортировка моделей по зависимостям"""