diff --git a/erpnext/e_commerce/doctype/item_review/item_review.json b/erpnext/e_commerce/doctype/item_review/item_review.json index 918f4339356..7b6071b41f9 100644 --- a/erpnext/e_commerce/doctype/item_review/item_review.json +++ b/erpnext/e_commerce/doctype/item_review/item_review.json @@ -79,13 +79,14 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-03-24 22:27:28.094535", + "modified": "2021-04-02 15:56:00.447950", "modified_by": "Administrator", "module": "E-commerce", "name": "Item Review", "owner": "Administrator", "permissions": [ { + "create": 1, "delete": 1, "email": 1, "export": 1, @@ -93,9 +94,11 @@ "read": 1, "report": 1, "role": "System Manager", - "share": 1 + "share": 1, + "write": 1 }, { + "create": 1, "delete": 1, "email": 1, "export": 1, @@ -103,6 +106,17 @@ "read": 1, "report": 1, "role": "Website Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "report": 1, + "role": "Customer", "share": 1 } ], diff --git a/erpnext/e_commerce/doctype/item_review/item_review.py b/erpnext/e_commerce/doctype/item_review/item_review.py index bbb85b3d5d3..84a1274d4ca 100644 --- a/erpnext/e_commerce/doctype/item_review/item_review.py +++ b/erpnext/e_commerce/doctype/item_review/item_review.py @@ -4,14 +4,48 @@ from __future__ import unicode_literals from datetime import datetime +from six import string_types +import json + import frappe from frappe.model.document import Document - from frappe.contacts.doctype.contact.contact import get_contact_name +from frappe.utils import flt, cint +from erpnext.e_commerce.doctype.e_commerce_settings.e_commerce_settings import get_shopping_cart_settings class ItemReview(Document): pass +@frappe.whitelist() +def get_item_reviews(web_item, start, end, data=None): + if not data: + data = frappe._dict() + + settings = get_shopping_cart_settings() + + if settings and settings.get("enable_reviews"): + data.reviews = frappe.db.get_all("Item Review", filters={"website_item": web_item}, + fields=["*"], limit_start=cint(start), limit_page_length=cint(end)) + + rating_data = frappe.db.get_all("Item Review", filters={"website_item": web_item}, + fields=["avg(rating) as average, count(*) as total"])[0] + data.average_rating = flt(rating_data.average, 1) + data.average_whole_rating = flt(data.average_rating, 0) + + # get % of reviews per rating + reviews_per_rating = [] + for i in range(1,6): + count = frappe.db.get_all("Item Review", filters={"website_item": web_item, "rating": i}, + fields=["count(*) as count"])[0].count + + percent = flt((count / rating_data.total or 1) * 100, 0) if count else 0 + reviews_per_rating.append(percent) + + data.reviews_per_rating = reviews_per_rating + data.total_reviews = rating_data.total + + return data + @frappe.whitelist() def add_item_review(web_item, title, rating, comment=None): """ Add an Item Review by a user if non-existent. """ diff --git a/erpnext/e_commerce/doctype/website_item/website_item.py b/erpnext/e_commerce/doctype/website_item/website_item.py index d8ebffcca20..a7c56cf6816 100644 --- a/erpnext/e_commerce/doctype/website_item/website_item.py +++ b/erpnext/e_commerce/doctype/website_item/website_item.py @@ -14,6 +14,7 @@ from frappe.utils import cstr, random_string, cint, flt from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow from erpnext.setup.doctype.item_group.item_group import (get_parent_item_groups, invalidate_cache_for) +from erpnext.e_commerce.doctype.item_review.item_review import get_item_reviews class WebsiteItem(WebsiteGenerator): website = frappe._dict( @@ -176,7 +177,7 @@ class WebsiteItem(WebsiteGenerator): self.set_metatags(context) self.set_shopping_cart_data(context) self.get_product_details_section(context) - self.get_reviews(context) + get_item_reviews(self.name, 0, 4, context) context.wished = False if frappe.db.exists("Wishlist Items", {"item_code": self.item_code, "parent": frappe.session.user}): @@ -362,28 +363,6 @@ class WebsiteItem(WebsiteGenerator): return tab_values - def get_reviews(self, context): - if context.shopping_cart.cart_settings.enable_reviews: - context.reviews = frappe.db.get_all("Item Review", filters={"item": self.item_code}, - fields=["*"], limit=4) - - rating_data = frappe.db.get_all("Item Review", filters={"item": self.item_code}, - fields=["avg(rating) as average, count(*) as total"])[0] - context.average_rating = rating_data.average - context.average_whole_rating = flt(context.average_rating, 0) - - # get % of reviews per rating - reviews_per_rating = [] - for i in range(1,6): - count = frappe.db.get_all("Item Review", filters={"item": self.item_code, "rating": i}, - fields=["count(*) as count"])[0].count - - percent = flt((count / rating_data.total or 1) * 100, 0) if count else 0 - reviews_per_rating.append(percent) - - context.reviews_per_rating = reviews_per_rating - context.total_reviews = rating_data.total - def invalidate_cache_for_web_item(doc): """Invalidate Website Item Group cache and rebuild ItemVariantsCacheManager.""" from erpnext.stock.doctype.item.item import invalidate_item_variants_cache_for_website diff --git a/erpnext/e_commerce/product_query.py b/erpnext/e_commerce/product_query.py index 6ffab562297..37e91a09e96 100644 --- a/erpnext/e_commerce/product_query.py +++ b/erpnext/e_commerce/product_query.py @@ -67,7 +67,7 @@ class ProductQuery: product_info = get_product_info_for_website(item.item_code, skip_quotation_creation=True).get('product_info') if product_info: item.formatted_price = (product_info.get('price') or {}).get('formatted_price') - item.price = product_info['price'].get('price_list_rate') + item.price = (product_info.get('price') or {}).get('price_list_rate') if self.settings.show_stock_availability: if item.get("website_warehouse"): diff --git a/erpnext/public/scss/shopping_cart.scss b/erpnext/public/scss/shopping_cart.scss index 8d7f59de277..905d7e6d498 100644 --- a/erpnext/public/scss/shopping_cart.scss +++ b/erpnext/public/scss/shopping_cart.scss @@ -705,7 +705,6 @@ body.product-page { .ratings-reviews-section { border-top: 1px solid #E2E6E9; - display: flex; } .reviews-header { diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index a9e36799ad8..cdff775f741 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -170,7 +170,7 @@ def get_item_for_list_in_html(context): def get_parent_item_groups(item_group_name, from_item=False): base_nav_page = {"name": frappe._("Shop by Category"), "route":"/shop-by-category"} - if from_item: + if from_item and frappe.request.environ.get("HTTP_REFERER"): # base page after 'Home' will vary on Item page last_page = frappe.request.environ["HTTP_REFERER"].split('/')[-1] if last_page and last_page in ("shop-by-category", "all-products"): diff --git a/erpnext/templates/generators/item/item_reviews.html b/erpnext/templates/generators/item/item_reviews.html index c271fdb808d..f6b1831cda0 100644 --- a/erpnext/templates/generators/item/item_reviews.html +++ b/erpnext/templates/generators/item/item_reviews.html @@ -1,47 +1,16 @@ -{% from "erpnext/templates/includes/macros.html" import ratings_with_title %} +{% from "erpnext/templates/includes/macros.html" import user_review, ratings_summary %} -