diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py new file mode 100644 index 00000000..06b6510d --- /dev/null +++ b/apps/news/transfer_data.py @@ -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] +} diff --git a/apps/transfer/models.py b/apps/transfer/models.py index e661b402..034bcbaa 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..fd36e62e --- /dev/null +++ b/apps/transfer/serializers/news.py @@ -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 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 dba43b17..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 @@ -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): """Сортировка моделей по зависимостям"""