# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
import logging
from django.contrib.auth import get_user_model
from django.db.transaction import atomic
from django.utils.translation import gettext_lazy as _
from typing import TYPE_CHECKING
from shuup.core.models import Shop, Supplier
from shuup.core.tasks import TaskResult
from shuup.importer.exceptions import ImporterError
from shuup.importer.utils.importer import FileImporter, ImportMode
if TYPE_CHECKING:
from shuup.importer.importing import DataImporter
LOGGER = logging.getLogger(__name__)
[docs]def import_file(importer, import_mode, file_name, language, shop_id, supplier_id=None, user_id=None, mapping=None):
shop = Shop.objects.get(pk=shop_id)
supplier = None
user = None
if supplier_id:
supplier = Supplier.objects.filter(pk=supplier_id).first()
if user_id:
user = get_user_model().objects.get(pk=user_id)
# convert to enum
import_mode = ImportMode(import_mode)
file_importer = FileImporter(
importer, import_mode, file_name, language, mapping=mapping, shop=shop, supplier=supplier, user=user
)
try:
file_importer.prepare()
with atomic():
file_importer.import_file()
importer_instance = file_importer.importer # type: DataImporter
result = dict(
other_log_messages=[str(msg) for msg in importer_instance.other_log_messages],
log_messages=[str(msg) for msg in importer_instance.log_messages],
)
new_objects = []
updated_objects = []
for new_object in importer_instance.new_objects:
new_objects.append(
{"model": f"{new_object._meta.app_label}.{new_object._meta.model_name}", "pk": new_object.pk}
)
for updated_object in importer_instance.updated_objects:
updated_objects.append(
{
"model": f"{updated_object._meta.app_label}.{updated_object._meta.model_name}",
"pk": updated_object.pk,
}
)
result["new_objects"] = new_objects
result["updated_objects"] = updated_objects
return TaskResult(result=result)
except ImporterError as error:
error_log = ", ".join(error.messages)
return TaskResult(error_log=error_log)
except Exception:
LOGGER.exception("Failed to import the file.")
return TaskResult(error_log=_("Unexpected error while trying to import the file."))