111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
from os.path import exists
|
|
from importlib.machinery import SourceFileLoader
|
|
from django.apps import apps
|
|
from collections import OrderedDict
|
|
import transfer.models as legacy_models
|
|
|
|
|
|
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:
|
|
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
|
|
|
|
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_model(model, card)
|
|
|
|
|
|
def sort_by_dependencies(data):
|
|
"""Сортировка моделей по зависимостям"""
|
|
|
|
"""Сначала мы сортируем модели по зависимостям в обратном порядке, используя сортировку вставкой"""
|
|
result = []
|
|
for model, card in data.items():
|
|
if "dependencies" in card and isinstance(card['dependencies'], tuple):
|
|
for model_dependency in result:
|
|
if model_dependency in card['dependencies']:
|
|
result.insert(result.index(model_dependency), model)
|
|
break
|
|
|
|
else:
|
|
result.append(model)
|
|
|
|
"""Затем мы создаём сортированный словарь из реверса получившегося результата"""
|
|
|
|
result = OrderedDict(
|
|
[(model, data[model]) for model in reversed(result)]
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
def transfer_model(model, card):
|
|
print(f"=================================================\r\n"
|
|
f"MODEL: {model}\r\n"
|
|
f"=================================================")
|
|
try:
|
|
app_model = apps.get_model(app_label=card['app_label'], model_name=model)
|
|
except LookupError as e:
|
|
print(f"ERROR: model {model} from {card['app_label']} can not be loaded: {e}")
|
|
return
|
|
|
|
card_fields = card['fields']
|
|
relations = card_fields['relations'] if 'relations' in card_fields else None
|
|
|
|
if relations:
|
|
del(card_fields['relations'])
|
|
|
|
if len(card_fields) > 1:
|
|
print("You must set one table to transfer")
|
|
return
|
|
|
|
legacy_table = list(card_fields.keys())[0]
|
|
fields = list(card_fields.values())[0]
|
|
|
|
try:
|
|
legacy_model = apps.get_model(app_label="transfer", model_name=legacy_table)
|
|
except LookupError as e:
|
|
print(f"ERROR: legacy model {model} can not be loaded: {e}")
|
|
return
|
|
|
|
legacy_fields = []
|
|
|
|
for legacy_field in fields.values():
|
|
if isinstance(legacy_field, str):
|
|
legacy_fields.append(legacy_field)
|
|
|
|
elif isinstance(legacy_field, tuple):
|
|
"""Группа полей"""
|
|
if isinstance(legacy_field[0], tuple):
|
|
for legacy_field_group in legacy_field:
|
|
legacy_fields.append(legacy_field_group[1])
|
|
else:
|
|
legacy_fields.append(legacy_field[1])
|
|
|
|
if model != "City":
|
|
return
|
|
|
|
print(legacy_fields)
|
|
|
|
queryset = legacy_model.objects.only(*legacy_fields)
|
|
print(queryset)
|
|
|
|
if relations:
|
|
for relation_table, relation_data in relations.items():
|
|
print(relation_table)
|
|
print(relation_data)
|