def test_sample_import_all_match(filename): activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 2 for product in products: shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.pk == product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" else: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1,2]
def test_sample_import_no_match(stock_managed): filename = "sample_import_nomatch.xlsx" if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() supplier = get_simple_supplier(stock_managed) sales_unit = get_default_sales_unit() Manufacturer.objects.create(name="manufctr") path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 1 assert "gtiin" in importer.unmatched_fields importer.manually_match("gtiin", "shuup.core.models.Product:gtin") importer.do_remap() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 2 for product in products: assert product.gtin == "1280x720" shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" else: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1,2] # stock was not managed since supplier doesn't like that for msg in importer.other_log_messages: assert "please set Stock Managed on" in msg supplier.stock_managed = True supplier.save() importer.do_import("create,update") assert len(importer.other_log_messages) == 0 for sa in StockAdjustment.objects.all(): assert sa.product.pk assert sa.delta == 20
def test_company_sample(): filename = "company_contact_sample.xlsx" activate("en") shop = get_default_shop() path = os.path.join(os.path.dirname(__file__), "data", "contact", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = CompanyContactImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) contacts = importer.new_objects assert len(contacts) == 2 assert MutableAddress.objects.count() == 2 first_contact = contacts[0] second_contact = contacts[1] first_address = MutableAddress.objects.first() second_address = MutableAddress.objects.last() first_row = { "name": "Test Company", "name_ext": "Packaging Section", "tax_number": "1234567-888", "email": "*****@*****.**", "street": "TestStreet", "city": "Los Angeles", "postal_code": "90000", "country": "US", "region_code": "CA", "phone": "1123555111" } second_row = { "name": "Test Company 2", "name_ext": "", "tax_number": "12333-2232", "email": "*****@*****.**", "street": "Test Company Street", "city": "Los Angeles", "postal_code": "90001", "country": "US", "region_code": "CA", "phone": "1235678900" } assert_contact_address(first_contact, first_address, first_row) assert_contact_address(second_contact, second_address, second_row)
def test_complex_import(): filename = "complex_import.xlsx" activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_supplier() get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 6 assert ShopProduct.objects.count() == 6 assert Category.objects.count() == 11 assert Manufacturer.objects.count() == 4 for idx, product in enumerate(Product.objects.all().order_by("sku")): shop_product = product.get_shop_instance(shop) data = PRODUCT_DATA[idx] assert product.sku == data["sku"] assert product.name == data["name"] assert shop_product.default_price_value == Decimal(data["price"]) assert product.description == data["description"] if data.get("categories"): all_cats = set(data["categories"]) all_cats.add(data["category"]) for cat in shop_product.categories.all(): assert cat.name in all_cats assert shop_product.categories.count() == len(all_cats) # also add primary category if data.get("category"): assert shop_product.primary_category.name == data["category"] assert force_text(shop_product.visibility.label) == data["visibility"].lower() assert product.tax_class.name == data["tax_class"] if data.get("manufacturer"): assert product.manufacturer.name == data["manufacturer"]
def _transform_request_file(self): try: filename = get_import_file_path(self.request.GET.get("n")) if not os.path.isfile(filename): raise ValueError(_("%s is not a file") % self.request.GET.get("n")) except: raise Problem(_("File missing.")) try: mode = "xls" if filename.endswith("xlsx"): mode = "xlsx" if filename.endswith("csv"): mode = "csv" return transform_file(mode, filename) except (Exception, RuntimeError) as e: messages.error(self.request, e)
def test_sample_ignore_column(): activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", "sample_import_ignore.csv") transformed_data = transform_file("csv", path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 2
def test_customer_sample(): filename = "customer_sample.xlsx" activate("en") shop = get_default_shop() path = os.path.join(os.path.dirname(__file__), "data", "contact", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = PersonContactImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) contacts = importer.new_objects assert len(contacts) == 2 assert MutableAddress.objects.count() == 2 first_contact = contacts[0] second_contact = contacts[1] first_address = MutableAddress.objects.first() second_address = MutableAddress.objects.last() first_row = { "first_name": "Test", "last_name": "Tester", "email": "*****@*****.**", "street": "TestStreet", "city": "Los Angeles", "postal_code": "90000", "country": "US", "region_code": "CA", "phone": "1123555111" } second_row = { "first_name": "My", "last_name": "Sample", "email": "*****@*****.**", "street": "my-sample", "city": "Los Angeles", "postal_code": "90001", "country": "US", "region_code": "CA", "phone": "1235678900" } assert_contact_address(first_contact, first_address, first_row) assert_contact_address(second_contact, second_address, second_row)
def _transform_request_file(self): try: filename = get_import_file_path(self.request.GET.get("n")) if not os.path.isfile(filename): raise ValueError( _("%s is not a file") % self.request.GET.get("n")) except: raise Problem(_("File missing.")) try: mode = "xls" if filename.endswith("xlsx"): mode = "xlsx" if filename.endswith("csv"): mode = "csv" return transform_file(mode, filename) except (Exception, RuntimeError) as e: messages.error(self.request, e)
def test_sample_import_all_match_all_shops(filename, rf): activate("en") shop1 = get_shop(identifier="shop1", domain="shop1", enabled=True) shop2 = get_shop(identifier="shop2", domain="shop2", enabled=True) Product.objects.all().delete() tax_class = get_default_tax_class() product_type = get_default_product_type() sales_unit = get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) for shop in [shop1, shop2]: importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects if shop == shop1: # products created assert len(products) == 2 else: # products already exist assert len(products) == 0 assert Product.objects.count() == 2 for product in Product.objects.all(): shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1, 2] assert ShopProduct.objects.count() == 4
def test_complex_import(): filename = "complex_import.xlsx" activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_supplier() get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 5 assert ShopProduct.objects.count() == 5 assert Category.objects.count() == 11 assert Manufacturer.objects.count() == 4 for idx, product in enumerate(Product.objects.all().order_by("sku")): shop_product = product.get_shop_instance(shop) data = PRODUCT_DATA[idx] assert product.sku == data["sku"] assert product.name == data["name"] assert shop_product.default_price_value == Decimal(data["price"]) assert product.description == data["description"] all_cats = set(data["categories"]) all_cats.add(data["category"]) for cat in shop_product.categories.all(): assert cat.name in all_cats assert shop_product.categories.count() == len( all_cats) # also add primary category assert shop_product.primary_category.name == data["category"] assert force_text( shop_product.visibility.label) == data["visibility"].lower() assert product.tax_class.name == data["tax_class"] assert product.manufacturer.name == data["manufacturer"]
def test_sample_import_all_match_all_shops(filename): activate("en") shop1 = get_shop(identifier="shop1", domain="shop1", enabled=True) shop2 = get_shop(identifier="shop2", domain="shop2", enabled=True) Product.objects.all().delete() tax_class = get_default_tax_class() product_type = get_default_product_type() sales_unit = get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) for shop in [shop1, shop2]: importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects if shop == shop1: # products created assert len(products) == 2 else: # products already exist assert len(products) == 0 assert Product.objects.count() == 2 for product in Product.objects.all(): shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1, 2] assert ShopProduct.objects.count() == 4
def test_sample_import_images_errors(rf): activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", "sample_import_images_error.csv") transformed_data = transform_file("csv", path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en") ) importer.process_data() importer.do_import(ImportMode.CREATE_UPDATE) assert len(importer.log_messages) == 2 products = importer.new_objects assert len(products) == 2 for product in products: assert not product.media.exists()
def test_sample_import_shop_relation(): activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", "complex_import.xlsx") transformed_data = transform_file("xlsx", path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects for product in products: shop_product = product.get_shop_instance(shop) for category in shop_product.categories.all(): assert shop in category.shops.all() if product.manufacturer: assert shop in product.manufacturer.shops.all()
def import_categoryfile(filename, expected_category_count, map_from=None, map_to=None): activate("en") shop = get_default_shop() get_default_tax_class() get_default_product_type() get_default_supplier() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() if map_from: assert len(importer.unmatched_fields) == 1 assert map_from in importer.unmatched_fields importer.manually_match(map_from, map_to) importer.do_remap() else: assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert Category.objects.count() == expected_category_count
def _transform_request_file(self): try: filename = get_import_file_path(self.file_name) if not os.path.isfile(filename): raise ImporterError( _("{file_name} is not a valid file.").format( file_name=self.file_name)) except Exception: raise ImporterError(_("The file is missing.")) try: mode = "xls" if filename.endswith("xlsx"): mode = "xlsx" if filename.endswith("csv"): mode = "csv" if self.importer_cls.custom_file_transformer: return self.importer_cls.transform_file(mode, filename) return transform_file(mode, filename) except (Exception, RuntimeError) as e: raise ImporterError(str(e))
def test_sample_import_all_match(filename): activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) if filename == bom_file: import codecs bytes = min(32, os.path.getsize(path)) raw = open(path, 'rb').read(bytes) assert raw.startswith(codecs.BOM_UTF8) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 2 for product in products: shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.pk == product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" else: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1,2]
def test_sample_import_all_match(filename, rf): activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() sales_unit = get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) if filename == bom_file: import codecs bytes = min(32, os.path.getsize(path)) raw = open(path, 'rb').read(bytes) assert raw.startswith(codecs.BOM_UTF8) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() if filename == images_file: _create_random_media_file(shop, "image1.jpeg") _create_random_media_file(shop, "products/images/image2.jpeg") _create_random_media_file(shop, "products/images/image3.jpeg") _create_random_media_file(shop, "image4.jpeg") _create_random_media_file(shop, "products2/images/image5.jpeg") _create_random_media_file(shop, "product1.jpeg") _create_random_media_file(shop, "products/images/product2.jpeg") _create_random_media_file(shop, "products/images2/product2.jpeg") importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(importer.log_messages) == 0 if filename == images_file: assert len(products) == 3 else: assert len(products) == 2 for product in products: shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" if filename == images_file: assert product.media.count() == 3 elif product.pk == 2: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" if filename == images_file: assert product.media.count() == 2 elif product.pk == 3 and filename == images_file: assert product.media.count() == 3 assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1, 2]
def test_sample_import_no_match(rf, stock_managed): filename = "sample_import_nomatch.xlsx" if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() supplier = get_simple_supplier(stock_managed) sales_unit = get_default_sales_unit() Manufacturer.objects.create(name="manufctr") path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() assert len(importer.unmatched_fields) == 1 assert "gtiin" in importer.unmatched_fields importer.manually_match("gtiin", "shuup.core.models.Product:gtin") importer.do_remap() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 2 for product in products: assert product.gtin == "1280x720" shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" else: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1, 2] # stock was not managed since supplier doesn't like that for msg in importer.other_log_messages: assert "please set `Stock Managed` on" in msg supplier.stock_managed = True supplier.save() importer.do_import("create,update") assert len(importer.other_log_messages) == 0 for sa in StockAdjustment.objects.all(): assert sa.product.pk assert sa.delta == 20
def test_sample_import_all_match(filename): activate("en") shop = get_default_shop() tax_class = get_default_tax_class() product_type = get_default_product_type() sales_unit = get_default_sales_unit() path = os.path.join(os.path.dirname(__file__), "data", "product", filename) if filename == bom_file: import codecs bytes = min(32, os.path.getsize(path)) raw = open(path, 'rb').read(bytes) assert raw.startswith(codecs.BOM_UTF8) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter(transformed_data, shop, "en") importer.process_data() if filename == images_file: assert len(importer.unmatched_fields) == 2 _create_random_media_file(shop, "image1.jpeg") _create_random_media_file(shop, "products/images/image2.jpeg") _create_random_media_file(shop, "products/images/image3.jpeg") _create_random_media_file(shop, "image4.jpeg") _create_random_media_file(shop, "products2/images/image5.jpeg") _create_random_media_file(shop, "product1.jpeg") _create_random_media_file(shop, "products/images/product2.jpeg") _create_random_media_file(shop, "products/images2/product2.jpeg") else: assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects if filename == images_file: assert len(products) == 3 else: assert len(products) == 2 for product in products: shop_product = product.get_shop_instance(shop) assert shop_product.pk assert shop_product.default_price_value == 150 assert shop_product.default_price == shop.create_price(150) assert product.type == product_type # product type comes from importer defaults assert product.sales_unit == sales_unit if product.pk == 1: assert product.tax_class.pk == 2 # new was created assert product.name == "Product English" assert product.description == "Description English" if filename == images_file: assert product.media.count() == 3 elif product.pk == 2: assert product.tax_class.pk == tax_class.pk # old was found as should assert product.name == "Product 2 English" assert product.description == "Description English 2" if filename == images_file: assert product.media.count() == 2 elif product.pk == 3 and filename == images_file: assert product.media.count() == 3 assert shop_product.primary_category.pk == 1 assert [c.pk for c in shop_product.categories.all()] == [1,2]
def test_variatins_import(rf): filename = "product_sample_import_with_variations.xlsx" if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier activate("en") shop = get_default_shop() product_type = get_default_product_type() sales_unit = get_default_sales_unit() tax_class = get_default_tax_class() # Create media _create_random_media_file(shop, "shirt1.jpeg") _create_random_media_file(shop, "shirt2.jpeg") _create_random_media_file(shop, "shirt3.jpeg") path = os.path.join(os.path.dirname(__file__), "data", "product", filename) transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 42 # 2 parents 20 variations each supplier = Supplier.objects.first() assert supplier and supplier.stock_managed and supplier.module_identifier == "simple_supplier" assert ShopProduct.objects.filter(suppliers=supplier).count() == 42 parent1 = Product.objects.filter(sku=1).first() assert parent1.mode == ProductMode.VARIABLE_VARIATION_PARENT assert parent1.variation_children.all().count() == 20 # Check product names child1 = Product.objects.filter(sku=10).first() assert child1.name == "T-Shirt - Pink - S" child2 = Product.objects.filter(sku=11).first() assert child2.name == "T-Shirt - Pink - XS" # Check stock counts assert supplier.get_stock_status(child1.pk).logical_count == Decimal(5) assert supplier.get_stock_status(child2.pk).logical_count == Decimal(10) parent2 = Product.objects.filter(sku=22).first() assert parent1.mode == ProductMode.VARIABLE_VARIATION_PARENT assert parent1.variation_children.all().count() == 20 # Check product names child1 = Product.objects.filter(sku=38).first() assert child1.name == "Custom T-Shirt - Black - XL" child2 = Product.objects.filter(sku=39).first() assert child2.name == "Custom T-Shirt - Black - L" # Check stock counts assert supplier.get_stock_status(child1.pk).logical_count == Decimal(5) assert supplier.get_stock_status(child2.pk).logical_count == Decimal(10) path = os.path.join(os.path.dirname(__file__), "data", "product", "product_sample_import_with_variations_update.xlsx") transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 0 updated_products = importer.updated_objects assert len(updated_products) == 4 # Check product names child1 = Product.objects.filter(sku=10).first() assert child1.name == "T-Shirt - Pink - S" child2 = Product.objects.filter(sku=11).first() assert child2.name == "Test" # Check stock counts assert supplier.get_stock_status(child1.pk).logical_count == Decimal(5) assert supplier.get_stock_status(child2.pk).logical_count == Decimal( 20) # Did not add 20 but made the logical to 20 parent2 = Product.objects.filter(sku=22).first() assert parent1.mode == ProductMode.VARIABLE_VARIATION_PARENT assert parent1.variation_children.all().count() == 20 # Check product names child1 = Product.objects.filter(sku=38).first() assert child1.name == "Custom T-Shirt - Black - XL" child2 = Product.objects.filter(sku=39).first() assert child2.name == "Custom T-Shirt - Black - L" # Check stock counts assert supplier.get_stock_status(child1.pk).logical_count == Decimal(15) assert supplier.get_stock_status(child2.pk).logical_count == Decimal(10) # Test file with missing variations path = os.path.join( os.path.dirname(__file__), "data", "product", "product_sample_import_with_variations_missing_variables.xlsx") transformed_data = transform_file(filename.split(".")[1], path) importer = ProductImporter( transformed_data, ProductImporter.get_importer_context(rf.get("/"), shop=shop, language="en")) importer.process_data() assert len(importer.unmatched_fields) == 0 importer.do_import(ImportMode.CREATE_UPDATE) products = importer.new_objects assert len(products) == 0 updated_products = importer.updated_objects assert len(updated_products) == 4 for log_message in importer.log_messages: assert "Parent SKU set for the row, but no variation" in log_message[ "messages"][0] # check that both variation products still looks correct parent1 = Product.objects.filter(sku=1).first() assert parent1.mode == ProductMode.VARIABLE_VARIATION_PARENT assert parent1.variation_children.all().count() == 20 parent2 = Product.objects.filter(sku=22).first() assert parent1.mode == ProductMode.VARIABLE_VARIATION_PARENT assert parent1.variation_children.all().count() == 20