gault-millau/apps/transfer/utils.py
2019-10-07 22:23:01 +03:00

80 lines
2.7 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
querysets = {}
for legacy_table, fields in card['fields'].items():
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
print(f"APP MODEL: {app_model}")
print(f"LEGACY MODEL: {legacy_model}")
print(f"FIELDS: {fields}")