def test_add_item_variant_without_web_item_to_cart(self): "Test adding Variants having no Website Items in cart via Template Web Item." from erpnext.controllers.item_variant import create_variant from erpnext.e_commerce.doctype.website_item.website_item import make_website_item from erpnext.stock.doctype.item.test_item import make_item template_item = make_item( "Test-Tshirt-Temp", { "has_variant": 1, "variant_based_on": "Item Attribute", "attributes": [{"attribute": "Test Size"}, {"attribute": "Test Colour"}], }, ) variant = create_variant("Test-Tshirt-Temp", {"Test Size": "Small", "Test Colour": "Red"}) variant.save() make_website_item(template_item) # publish template not variant update_cart("Test-Tshirt-Temp-S-R", 1) cart = get_cart_quotation() # test if cart page gets data without errors doc = cart.get("doc") self.assertEqual(doc.get("items")[0].item_name, "Test-Tshirt-Temp-S-R") # test if items are rendered without error frappe.render_template("templates/includes/cart/cart_items.html", cart)
def setUp(self): item = make_item("Test Mobile Phone") if not frappe.db.exists("Website Item", {"item_code": "Test Mobile Phone"}): make_website_item(item, save=True) setup_e_commerce_settings({"enable_reviews": 1}) frappe.local.shopping_cart_settings = None
def setUp(self): item = make_item("Test Phone Series X") if not frappe.db.exists("Website Item", {"item_code": "Test Phone Series X"}): make_website_item(item, save=True) item = make_item("Test Phone Series Y") if not frappe.db.exists("Website Item", {"item_code": "Test Phone Series Y"}): make_website_item(item, save=True)
def setUp(self): frappe.set_user("Administrator") create_test_contact_and_address() self.enable_shopping_cart() if not frappe.db.exists("Website Item", {"item_code": "_Test Item"}): make_website_item(frappe.get_cached_doc("Item", "_Test Item")) if not frappe.db.exists("Website Item", {"item_code": "_Test Item 2"}): make_website_item(frappe.get_cached_doc("Item", "_Test Item 2"))
def test_website_item_breadcrumbs(self): "Check if breadcrumbs include homepage, product listing navigation page, parent item group(s) and item group." from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups item_code = "Test Breadcrumb Item" item = make_item( item_code, { "item_group": "_Test Item Group B - 1", }, ) if not frappe.db.exists("Website Item", {"item_code": item_code}): web_item = make_website_item(item, save=False) web_item.save() else: web_item = frappe.get_cached_doc("Website Item", {"item_code": item_code}) frappe.db.set_value("Item Group", "_Test Item Group B - 1", "show_in_website", 1) frappe.db.set_value("Item Group", "_Test Item Group B", "show_in_website", 1) breadcrumbs = get_parent_item_groups(item.item_group) self.assertEqual(breadcrumbs[0]["name"], "Home") self.assertEqual(breadcrumbs[1]["name"], "Shop by Category") self.assertEqual(breadcrumbs[2]["name"], "_Test Item Group B") # parent item group self.assertEqual(breadcrumbs[3]["name"], "_Test Item Group B - 1") # tear down web_item.delete() item.delete()
def test_publish_variant_and_template(self): "Check if template is published on publishing variant." # template "Test Web Item" created on setUp variant = create_variant("Test Web Item", {"Test Size": "Large"}) variant.save() # check if template is not published self.assertIsNone( frappe.db.exists("Website Item", {"item_code": variant.variant_of})) variant_web_item = make_website_item(variant, save=False) variant_web_item.save() # check if template is published try: template_web_item = frappe.get_doc( "Website Item", {"item_code": variant.variant_of}) except frappe.DoesNotExistError: self.fail( f"Template of {variant.item_code}, {variant.variant_of} not published" ) # teardown variant_web_item.delete() template_web_item.delete() variant.delete()
def test_impact_on_merging_items(self): "Check if merging items is blocked if old and new items both have website items" first_item = make_item("Test First Item") second_item = make_item("Test Second Item") first_web_item = make_website_item(first_item, save=False) first_web_item.save() second_web_item = make_website_item(second_item, save=False) second_web_item.save() with self.assertRaises(DataValidationError): frappe.rename_doc("Item", "Test First Item", "Test Second Item", merge=True) # tear down second_web_item.delete() first_web_item.delete() second_item.delete() first_item.delete()
def make_new_website_item(item: str) -> Union[str, None]: try: doc = frappe.get_doc("Item", item) web_item = make_website_item( doc) # returns [website_item.name, item_name] return web_item[0] except Exception: doc.log_error("Website Item creation failed") return None
def make_new_website_item(item: str) -> Union[str, None]: try: doc = frappe.get_doc("Item", item) web_item = make_website_item(doc) # returns [website_item.name, item_name] return web_item[0] except Exception: title = f"{item}: Error while converting to Website Item " frappe.log_error( title + "for Item Card Group Template" + "\n\n" + frappe.get_traceback(), title=title ) return None
def create_variant_web_item(): "Create Variant and Template Website Items." from erpnext.controllers.item_variant import create_variant from erpnext.e_commerce.doctype.website_item.website_item import make_website_item from erpnext.stock.doctype.item.test_item import make_item make_item( "Test Web Item", { "has_variant": 1, "variant_based_on": "Item Attribute", "attributes": [{ "attribute": "Test Size" }] }) if not frappe.db.exists("Item", "Test Web Item-L"): variant = create_variant("Test Web Item", {"Test Size": "Large"}) variant.save() if not frappe.db.exists("Website Item", {"variant_of": "Test Web Item"}): make_website_item(variant, save=True)
def setUpClass(cls): super().setUpClass() template_item = make_item( "Test-Tshirt-Temp", { "has_variant": 1, "variant_based_on": "Item Attribute", "attributes": [{ "attribute": "Test Size" }, { "attribute": "Test Colour" }], }, ) # create L-R, L-G, M-R, M-G and S-R for size in ( "Large", "Medium", ): for colour in ( "Red", "Green", ): variant = create_variant("Test-Tshirt-Temp", { "Test Size": size, "Test Colour": colour }) variant.save() variant = create_variant("Test-Tshirt-Temp", { "Test Size": "Small", "Test Colour": "Red" }) variant.save() make_website_item(template_item) # publish template not variants
def create_regular_web_item(item_code=None, item_args=None, web_args=None): "Create Regular Item and Website Item." item_code = item_code or "Test Mobile Phone" item = make_item(item_code, properties=item_args) if not frappe.db.exists("Website Item", {"item_code": item_code}): web_item = make_website_item(item, save=False) if web_args: web_item.update(web_args) web_item.save() else: web_item = frappe.get_cached_doc("Website Item", {"item_code": item_code}) return web_item
def test_website_item_desk_item_sync(self): "Check creation/updation/deletion of Website Item and its impact on Item master." web_item = None item = make_item("Test Web Item") # will return item if exists try: web_item = make_website_item(item, save=False) web_item.save() except Exception: self.fail(f"Error while creating website item for {item}") # check if website item was created self.assertTrue(bool(web_item)) self.assertTrue(bool(web_item.route)) item.reload() self.assertEqual(web_item.published, 1) self.assertEqual(item.published_in_website, 1) # check if item was back updated self.assertEqual(web_item.item_group, item.item_group) # check if changing item data changes it in website item item.item_name = "Test Web Item 1" item.stock_uom = "Unit" item.save() web_item.reload() self.assertEqual(web_item.item_name, item.item_name) self.assertEqual(web_item.stock_uom, item.stock_uom) # check if disabling item unpublished website item item.disabled = 1 item.save() web_item.reload() self.assertEqual(web_item.published, 0) # check if website item deletion, unpublishes desk item web_item.delete() item.reload() self.assertEqual(item.published_in_website, 0) item.delete()
def execute(): frappe.reload_doc("e_commerce", "doctype", "website_item") frappe.reload_doc("e_commerce", "doctype", "website_item_tabbed_section") frappe.reload_doc("e_commerce", "doctype", "website_offer") frappe.reload_doc("e_commerce", "doctype", "recommended_items") frappe.reload_doc("e_commerce", "doctype", "e_commerce_settings") frappe.reload_doc("stock", "doctype", "item") item_fields = [ "item_code", "item_name", "item_group", "stock_uom", "brand", "image", "has_variants", "variant_of", "description", "weightage", ] web_fields_to_map = [ "route", "slideshow", "website_image_alt", "website_warehouse", "web_long_description", "website_content", "thumbnail", ] # get all valid columns (fields) from Item master DB schema item_table_fields = frappe.db.sql("desc `tabItem`", as_dict=1) item_table_fields = [d.get("Field") for d in item_table_fields] # prepare fields to query from Item, check if the web field exists in Item master web_query_fields = [] for web_field in web_fields_to_map: if web_field in item_table_fields: web_query_fields.append(web_field) item_fields.append(web_field) # check if the filter fields exist in Item master or_filters = {} for field in ["show_in_website", "show_variant_in_website"]: if field in item_table_fields: or_filters[field] = 1 if not web_query_fields or not or_filters: # web fields to map are not present in Item master schema # most likely a fresh installation that doesnt need this patch return items = frappe.db.get_all("Item", fields=item_fields, or_filters=or_filters) total_count = len(items) for count, item in enumerate(items, start=1): if frappe.db.exists("Website Item", {"item_code": item.item_code}): continue # make new website item from item (publish item) website_item = make_website_item(item, save=False) website_item.ranking = item.get("weightage") for field in web_fields_to_map: website_item.update({field: item.get(field)}) website_item.save() # move Website Item Group & Website Specification table to Website Item for doctype in ("Website Item Group", "Item Website Specification"): frappe.db.set_value( doctype, { "parenttype": "Item", "parent": item.item_code }, # filters { "parenttype": "Website Item", "parent": website_item.name }, # value dict ) if count % 20 == 0: # commit after every 20 items frappe.db.commit() frappe.utils.update_progress_bar("Creating Website Items", count, total_count)