From 9541354ec7356a4458c8568311bee2c51319209b Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 27 Jun 2022 13:00:00 +0530 Subject: [PATCH 1/4] chore: Make `image` field obsolete in Website Item (redundant) - Delete Image field and set `website_image` as form's image field for uploads - Remove instances of `image` field access via Website Item - Item -> Web Item via Desk: Map Item's `image` to Web Item's `website_image` - Item -> Web Item via patch: `website_image` will be mapped with thumbnail - Remove magic that auto-sets `website_image` from `image` in Website Item --- .../recommended_items/recommended_items.json | 5 ++-- .../doctype/website_item/website_item.js | 4 --- .../doctype/website_item/website_item.json | 22 +++++++--------- .../doctype/website_item/website_item.py | 26 +++++++------------ .../e_commerce/doctype/wishlist/wishlist.py | 12 +++++++-- erpnext/e_commerce/product_ui/grid.js | 2 +- erpnext/e_commerce/product_ui/list.js | 2 +- erpnext/patches/v13_0/create_website_items.py | 2 +- erpnext/portal/doctype/homepage/homepage.py | 4 +-- .../templates/generators/item/item_image.html | 2 +- erpnext/templates/includes/macros.html | 2 +- 11 files changed, 39 insertions(+), 44 deletions(-) diff --git a/erpnext/e_commerce/doctype/recommended_items/recommended_items.json b/erpnext/e_commerce/doctype/recommended_items/recommended_items.json index 06ac3dc03b..1821532323 100644 --- a/erpnext/e_commerce/doctype/recommended_items/recommended_items.json +++ b/erpnext/e_commerce/doctype/recommended_items/recommended_items.json @@ -48,7 +48,7 @@ "read_only": 1 }, { - "fetch_from": "website_item.image", + "fetch_from": "website_item.website_image", "fieldname": "website_item_image", "fieldtype": "Attach", "label": "Website Item Image", @@ -75,7 +75,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-07-13 21:02:19.031652", + "modified": "2022-06-28 16:44:24.718728", "modified_by": "Administrator", "module": "E-commerce", "name": "Recommended Items", @@ -83,5 +83,6 @@ "permissions": [], "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/e_commerce/doctype/website_item/website_item.js b/erpnext/e_commerce/doctype/website_item/website_item.js index 7295e4b56a..7b7193e833 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item.js +++ b/erpnext/e_commerce/doctype/website_item/website_item.js @@ -30,10 +30,6 @@ frappe.ui.form.on('Website Item', { }, __("View")); }, - image: () => { - refresh_field("image_view"); - }, - copy_from_item_group: (frm) => { return frm.call({ doc: frm.doc, diff --git a/erpnext/e_commerce/doctype/website_item/website_item.json b/erpnext/e_commerce/doctype/website_item/website_item.json index 245042addb..a416aac3a1 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item.json +++ b/erpnext/e_commerce/doctype/website_item/website_item.json @@ -22,7 +22,6 @@ "column_break_11", "description", "brand", - "image", "display_section", "website_image", "website_image_alt", @@ -113,8 +112,11 @@ { "description": "Item Image (if not slideshow)", "fieldname": "website_image", - "fieldtype": "Attach", - "label": "Website Image" + "fieldtype": "Attach Image", + "hidden": 1, + "in_preview": 1, + "label": "Website Image", + "print_hide": 1 }, { "description": "Image Alternative Text", @@ -188,14 +190,6 @@ "options": "Item Group", "read_only": 1 }, - { - "fieldname": "image", - "fieldtype": "Attach Image", - "hidden": 1, - "in_preview": 1, - "label": "Image", - "print_hide": 1 - }, { "default": "1", "fieldname": "published", @@ -348,13 +342,14 @@ } ], "has_web_view": 1, - "image_field": "image", + "image_field": "website_image", "index_web_pages_for_search": 1, "links": [], - "modified": "2021-09-02 13:08:41.942726", + "modified": "2022-06-28 17:10:30.613251", "modified_by": "Administrator", "module": "E-commerce", "name": "Website Item", + "naming_rule": "Expression (old style)", "owner": "Administrator", "permissions": [ { @@ -410,6 +405,7 @@ "show_name_in_global_search": 1, "sort_field": "modified", "sort_order": "DESC", + "states": [], "title_field": "web_item_name", "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/e_commerce/doctype/website_item/website_item.py b/erpnext/e_commerce/doctype/website_item/website_item.py index f6fea72f8a..098de02ca9 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item.py +++ b/erpnext/e_commerce/doctype/website_item/website_item.py @@ -114,11 +114,6 @@ class WebsiteItem(WebsiteGenerator): return """Validate if the website image is a public file""" - auto_set_website_image = False - if not self.website_image and self.image: - auto_set_website_image = True - self.website_image = self.image - if not self.website_image: return @@ -135,18 +130,16 @@ class WebsiteItem(WebsiteGenerator): file_doc = file_doc[0] if not file_doc: - if not auto_set_website_image: - frappe.msgprint( - _("Website Image {0} attached to Item {1} cannot be found").format( - self.website_image, self.name - ) + frappe.msgprint( + _("Website Image {0} attached to Item {1} cannot be found").format( + self.website_image, self.name ) + ) self.website_image = None elif file_doc.is_private: - if not auto_set_website_image: - frappe.msgprint(_("Website Image should be a public file or website URL")) + frappe.msgprint(_("Website Image should be a public file or website URL")) self.website_image = None @@ -157,9 +150,8 @@ class WebsiteItem(WebsiteGenerator): import requests.exceptions - if not self.is_new() and self.website_image != frappe.db.get_value( - self.doctype, self.name, "website_image" - ): + db_website_image = frappe.db.get_value(self.doctype, self.name, "website_image") + if not self.is_new() and self.website_image != db_website_image: self.thumbnail = None if self.website_image and not self.thumbnail: @@ -451,7 +443,6 @@ def make_website_item(doc, save=True): "item_group", "stock_uom", "brand", - "image", "has_variants", "variant_of", "description", @@ -459,6 +450,9 @@ def make_website_item(doc, save=True): for field in fields_to_map: website_item.update({field: doc.get(field)}) + if doc.get("image") and not website_item.website_image: + website_item.website_image = doc.get("image") + if not save: return website_item diff --git a/erpnext/e_commerce/doctype/wishlist/wishlist.py b/erpnext/e_commerce/doctype/wishlist/wishlist.py index 5d6ab41db0..eb74027d77 100644 --- a/erpnext/e_commerce/doctype/wishlist/wishlist.py +++ b/erpnext/e_commerce/doctype/wishlist/wishlist.py @@ -20,7 +20,15 @@ def add_to_wishlist(item_code): web_item_data = frappe.db.get_value( "Website Item", {"item_code": item_code}, - ["image", "website_warehouse", "name", "web_item_name", "item_name", "item_group", "route"], + [ + "website_image", + "website_warehouse", + "name", + "web_item_name", + "item_name", + "item_group", + "route", + ], as_dict=1, ) @@ -30,7 +38,7 @@ def add_to_wishlist(item_code): "item_group": web_item_data.get("item_group"), "website_item": web_item_data.get("name"), "web_item_name": web_item_data.get("web_item_name"), - "image": web_item_data.get("image"), + "image": web_item_data.get("website_image"), "warehouse": web_item_data.get("website_warehouse"), "route": web_item_data.get("route"), } diff --git a/erpnext/e_commerce/product_ui/grid.js b/erpnext/e_commerce/product_ui/grid.js index 9eb1d45d5f..20a6c30b52 100644 --- a/erpnext/e_commerce/product_ui/grid.js +++ b/erpnext/e_commerce/product_ui/grid.js @@ -35,7 +35,7 @@ erpnext.ProductGrid = class { } get_image_html(item, title) { - let image = item.website_image || item.image; + let image = item.website_image; if (image) { return ` diff --git a/erpnext/e_commerce/product_ui/list.js b/erpnext/e_commerce/product_ui/list.js index 691cd4d9de..894a7cb3d8 100644 --- a/erpnext/e_commerce/product_ui/list.js +++ b/erpnext/e_commerce/product_ui/list.js @@ -35,7 +35,7 @@ erpnext.ProductList = class { } get_image_html(item, title, settings) { - let image = item.website_image || item.image; + let image = item.website_image; let wishlist_enabled = !item.has_variants && settings.enable_wishlist; let image_html = ``; diff --git a/erpnext/patches/v13_0/create_website_items.py b/erpnext/patches/v13_0/create_website_items.py index cb7bfc30af..b010f0ecc6 100644 --- a/erpnext/patches/v13_0/create_website_items.py +++ b/erpnext/patches/v13_0/create_website_items.py @@ -17,7 +17,6 @@ def execute(): "item_group", "stock_uom", "brand", - "image", "has_variants", "variant_of", "description", @@ -30,6 +29,7 @@ def execute(): "website_warehouse", "web_long_description", "website_content", + "website_image", "thumbnail", ] diff --git a/erpnext/portal/doctype/homepage/homepage.py b/erpnext/portal/doctype/homepage/homepage.py index 5bb05f0842..0d2e360788 100644 --- a/erpnext/portal/doctype/homepage/homepage.py +++ b/erpnext/portal/doctype/homepage/homepage.py @@ -16,7 +16,7 @@ class Homepage(Document): def setup_items(self): for d in frappe.get_all( "Website Item", - fields=["name", "item_name", "description", "image", "route"], + fields=["name", "item_name", "description", "website_image", "route"], filters={"published": 1}, limit=3, ): @@ -31,7 +31,7 @@ class Homepage(Document): item_code=d.name, item_name=d.item_name, description=d.description, - image=d.image, + image=d.website_image, route=d.route, ), ) diff --git a/erpnext/templates/generators/item/item_image.html b/erpnext/templates/generators/item/item_image.html index 930bb7a67d..e1bb3b9865 100644 --- a/erpnext/templates/generators/item/item_image.html +++ b/erpnext/templates/generators/item/item_image.html @@ -24,7 +24,7 @@ }) {% else %} - {{ product_image(doc.website_image or doc.image, alt=doc.website_image_alt or doc.item_name) }} + {{ product_image(doc.website_image, alt=doc.website_image_alt or doc.item_name) }} {% endif %} diff --git a/erpnext/templates/includes/macros.html b/erpnext/templates/includes/macros.html index fb4cecf826..3e20e50c3d 100644 --- a/erpnext/templates/includes/macros.html +++ b/erpnext/templates/includes/macros.html @@ -74,7 +74,7 @@ {%- set col_size = 3 if is_full_width else 4 -%} {%- set title = item.web_item_name or item.item_name or item.item_code -%} {%- set title = title[:50] + "..." if title|len > 50 else title -%} -{%- set image = item.website_image or item.image -%} +{%- set image = item.website_image -%} {%- set description = item.website_description or item.description-%} {% if is_featured %} From eec07833f4070ae1bdc9b829f83f6589d2591e0c Mon Sep 17 00:00:00 2001 From: marination Date: Tue, 5 Jul 2022 20:30:17 +0530 Subject: [PATCH 2/4] chore: Remove `image` from ProductQuery fields --- erpnext/e_commerce/product_data_engine/query.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/e_commerce/product_data_engine/query.py b/erpnext/e_commerce/product_data_engine/query.py index 5a753822d4..e6a595a034 100644 --- a/erpnext/e_commerce/product_data_engine/query.py +++ b/erpnext/e_commerce/product_data_engine/query.py @@ -35,7 +35,6 @@ class ProductQuery: "variant_of", "has_variants", "item_group", - "image", "web_long_description", "short_description", "route", From 7a6ee8cf2d3ee60f464f85f53890354d58dac4ca Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 7 Jul 2022 14:24:32 +0530 Subject: [PATCH 3/4] chore: Remove `image` use in website item list --- erpnext/e_commerce/doctype/website_item/website_item_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/e_commerce/doctype/website_item/website_item_list.js b/erpnext/e_commerce/doctype/website_item/website_item_list.js index 21be9428eb..b9dd9214a3 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item_list.js +++ b/erpnext/e_commerce/doctype/website_item/website_item_list.js @@ -1,5 +1,5 @@ frappe.listview_settings['Website Item'] = { - add_fields: ["item_name", "web_item_name", "published", "image", "has_variants", "variant_of"], + add_fields: ["item_name", "web_item_name", "published", "website_image", "has_variants", "variant_of"], filters: [["published", "=", "1"]], get_indicator: function(doc) { From af38baeb3ba48d1b9e8eeb7b727c26eea8524945 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 27 Jul 2022 14:09:49 +0530 Subject: [PATCH 4/4] fix: Map `Item` image to `Website Item` website_image only if published via UI (v13) - For v12 Items, `website_image` should be mapped from `Item` to `Website Item` --- .../e_commerce/doctype/website_item/website_item.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/erpnext/e_commerce/doctype/website_item/website_item.py b/erpnext/e_commerce/doctype/website_item/website_item.py index 098de02ca9..c0f8c79283 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item.py +++ b/erpnext/e_commerce/doctype/website_item/website_item.py @@ -1,8 +1,12 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors +# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt import json +from typing import TYPE_CHECKING, List, Union + +if TYPE_CHECKING: + from erpnext.stock.doctype.item.item import Item import frappe from frappe import _ @@ -423,7 +427,9 @@ def check_if_user_is_customer(user=None): @frappe.whitelist() -def make_website_item(doc, save=True): +def make_website_item(doc: "Item", save: bool = True) -> Union["WebsiteItem", List[str]]: + "Make Website Item from Item. Used via Form UI or patch." + if not doc: return @@ -450,7 +456,8 @@ def make_website_item(doc, save=True): for field in fields_to_map: website_item.update({field: doc.get(field)}) - if doc.get("image") and not website_item.website_image: + # Needed for publishing/mapping via Form UI only + if not frappe.flags.in_migrate and (doc.get("image") and not website_item.website_image): website_item.website_image = doc.get("image") if not save: