From e1b031caf3fb425bc7bc461d49290654e6f22672 Mon Sep 17 00:00:00 2001 From: littlewolf Date: Wed, 16 Oct 2019 07:05:05 +0300 Subject: [PATCH 1/3] Tmp commit --- apps/transfer/utils.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/apps/transfer/utils.py b/apps/transfer/utils.py index dba43b17..818a8220 100644 --- a/apps/transfer/utils.py +++ b/apps/transfer/utils.py @@ -67,9 +67,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 +77,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 +177,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): """Сортировка моделей по зависимостям""" From 8965cf0460e9ea83bf1740507ac8b27065fcc9aa Mon Sep 17 00:00:00 2001 From: littlewolf Date: Sun, 20 Oct 2019 17:59:18 +0300 Subject: [PATCH 2/3] Add news serializer --- apps/news/transfer_data.py | 28 ++++++++++++++++ apps/transfer/models.py | 20 ++++++------ apps/transfer/serializers/__init__.py | 0 apps/transfer/serializers/news.py | 37 +++++++++++++++++++++ apps/transfer/tests.py | 15 +++++++-- apps/transfer/utils.py | 46 +++++++++++++++++++-------- 6 files changed, 120 insertions(+), 26 deletions(-) create mode 100644 apps/news/transfer_data.py create mode 100644 apps/transfer/serializers/__init__.py create mode 100644 apps/transfer/serializers/news.py diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py new file mode 100644 index 00000000..ab02ca7f --- /dev/null +++ b/apps/news/transfer_data.py @@ -0,0 +1,28 @@ +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") + print(news_type) + # + 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')) + pprint(vars(queryset.first())) + print("===================================================================================") + # + serialized_data = NewsSerializer(queryset, many=True) + # data = serialized_data.data + # pprint(serialized_data.data) + for serialized_obj in serialized_data.data: + pprint(serialized_obj) + break + + +data_types = { + "news": [transfer_news] +} diff --git a/apps/transfer/models.py b/apps/transfer/models.py index caab0321..346ef6aa 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -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): diff --git a/apps/transfer/serializers/__init__.py b/apps/transfer/serializers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py new file mode 100644 index 00000000..877c8979 --- /dev/null +++ b/apps/transfer/serializers/news.py @@ -0,0 +1,37 @@ +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() + + class Meta: + model = News + fields = ( + "state", + "template", + "image_url", + "preview_image_url", + "title", + "description", + "slug", + "news_type" + ) + + 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 diff --git a/apps/transfer/tests.py b/apps/transfer/tests.py index 7ce503c2..593d2501 100644 --- a/apps/transfer/tests.py +++ b/apps/transfer/tests.py @@ -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) diff --git a/apps/transfer/utils.py b/apps/transfer/utils.py index 818a8220..a045f39e 100644 --- a/apps/transfer/utils.py +++ b/apps/transfer/utils.py @@ -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 From 0a24b80917a383c70077b53fefcba584e22675ca Mon Sep 17 00:00:00 2001 From: littlewolf Date: Sun, 20 Oct 2019 19:08:14 +0300 Subject: [PATCH 3/3] Add title method --- apps/news/transfer_data.py | 19 +++++++------------ apps/transfer/serializers/news.py | 4 ++++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py index ab02ca7f..06b6510d 100644 --- a/apps/news/transfer_data.py +++ b/apps/news/transfer_data.py @@ -4,23 +4,18 @@ 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") - print(news_type) - # + 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')) - pprint(vars(queryset.first())) - print("===================================================================================") - # - serialized_data = NewsSerializer(queryset, many=True) - # data = serialized_data.data - # pprint(serialized_data.data) - for serialized_obj in serialized_data.data: - pprint(serialized_obj) - break + + 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 = { diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index 877c8979..fd36e62e 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -6,6 +6,7 @@ class NewsSerializer(serializers.ModelSerializer): image_url = serializers.SerializerMethodField() preview_image_url = serializers.SerializerMethodField() description = serializers.SerializerMethodField() + title = serializers.SerializerMethodField() class Meta: model = News @@ -20,6 +21,9 @@ class NewsSerializer(serializers.ModelSerializer): "news_type" ) + def get_title(self, obj): + return f'{"en-GB": {obj.title}}' + def get_description(self, obj): if not hasattr(obj, "body"): return ""