Fixes for Manage Variants
diff --git a/erpnext/patches/v5_0/item_variants.py b/erpnext/patches/v5_0/item_variants.py
index 6e4db19..62e9ac9 100644
--- a/erpnext/patches/v5_0/item_variants.py
+++ b/erpnext/patches/v5_0/item_variants.py
@@ -2,11 +2,15 @@
def execute():
frappe.reload_doctype("Item")
+ for dt in ["manage_variants", "manage_variants_item", "variant_attribute"]:
+ frappe.reload_doc("stock", "doctype", dt)
+
for d in frappe.get_list("Item", filters={"has_variants":1}):
manage_variant = frappe.new_doc("Manage Variants")
- manage_variant.item = d.name
+ manage_variant.item_code = d.name
manage_variant.attributes = frappe.db.sql("select item_attribute as attribute, item_attribute_value as attribute_value \
from `tabItem Variant` where parent = %s", d.name, as_dict=1)
- manage_variant.generate_combinations()
- manage_variant.create_variants()
- frappe.delete_doc("doctype", "Item Variant")
\ No newline at end of file
+ if manage_variant.attributes:
+ manage_variant.generate_combinations()
+ manage_variant.create_variants()
+ frappe.delete_doc("DocType", "Item Variant")
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index d2f1d75..58b1adb 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -86,7 +86,7 @@
},
manage_variants: function(frm) {
- frappe.route_options = {"item": frm.doc.name };
+ frappe.route_options = {"item_code": frm.doc.name };
frappe.set_route("List", "Manage Variants");
}
});
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 22e6b21..a24fc04 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -332,14 +332,14 @@
updated = []
variants = frappe.db.get_all("Item", fields=["item_code"], filters={"variant_of": self.name })
for d in variants:
- update_variant(self.item_code, d)
+ update_variant(self.name, d)
updated.append(d.item_code)
frappe.msgprint(_("Item Variants {0} updated").format(", ".join(updated)))
def validate_has_variants(self):
if not self.has_variants and frappe.db.get_value("Item", self.name, "has_variants"):
if frappe.db.exists("Item", {"variant_of": self.name}):
- frappe.throw("Item has variants.")
+ frappe.throw(_("Item has variants."))
def validate_stock_for_template_must_be_zero(self):
if self.has_variants:
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.js b/erpnext/stock/doctype/manage_variants/manage_variants.js
index 82a3da7..ba5c46e 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.js
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.js
@@ -43,7 +43,7 @@
});
},
- item:function(frm) {
+ item_code:function(frm) {
return frappe.call({
method: "get_item_details",
doc:frm.doc,
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.json b/erpnext/stock/doctype/manage_variants/manage_variants.json
index 055fc27..7c61620 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.json
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.json
@@ -9,9 +9,9 @@
"document_type": "",
"fields": [
{
- "fieldname": "item",
+ "fieldname": "item_code",
"fieldtype": "Link",
- "label": "Item",
+ "label": "Item Code",
"options": "Item",
"permlevel": 0,
"precision": "",
@@ -75,7 +75,7 @@
"is_submittable": 0,
"issingle": 1,
"istable": 0,
- "modified": "2015-06-30 03:18:13.787883",
+ "modified": "2015-06-30 13:40:59.946655",
"modified_by": "Administrator",
"module": "Stock",
"name": "Manage Variants",
diff --git a/erpnext/stock/doctype/manage_variants/manage_variants.py b/erpnext/stock/doctype/manage_variants/manage_variants.py
index 8b1a13b..0131deb 100644
--- a/erpnext/stock/doctype/manage_variants/manage_variants.py
+++ b/erpnext/stock/doctype/manage_variants/manage_variants.py
@@ -15,7 +15,7 @@
def get_item_details(self):
self.clear_tables()
- if self.item:
+ if self.item_code:
self.get_attributes()
self.get_variants()
@@ -37,7 +37,7 @@
attributes = {}
self.set('attributes', [])
for d in frappe.db.sql("""select attribute, attribute_value from `tabVariant Attribute` as attribute,
- `tabItem` as item where attribute.parent= item.name and item.variant_of = %s""", self.item, as_dict=1):
+ `tabItem` as item where attribute.parent= item.name and item.variant_of = %s""", self.item_code, as_dict=1):
attributes.setdefault(d.attribute, []).append(d.attribute_value)
for d in attributes:
attribute_values = set(attributes[d])
@@ -46,24 +46,25 @@
def get_variants(self):
variants = [d.name for d in frappe.get_all("Item",
- filters={"variant_of":self.item})]
+ filters={"variant_of":self.item_code})]
+ data = frappe.db.sql("""select parent, attribute, attribute_value from `tabVariant Attribute`""", as_dict=1)
for d in variants:
variant_attributes, attributes = "", []
- for attribute in frappe.db.sql("""select attribute, attribute_value from `tabVariant Attribute` where parent = %s""", d):
- variant_attributes += attribute[1] + " | "
- attributes.append([attribute[0], attribute[1]])
+ for attribute in data:
+ if attribute.parent == d:
+ variant_attributes += attribute.attribute_value + " | "
+ attributes.append([attribute.attribute, attribute.attribute_value])
self.append('variants',{"variant": d, "variant_attributes": variant_attributes[: -3], "attributes": json.dumps(attributes)})
def validate_attributes(self):
if not self.attributes:
- frappe.throw("Enter atleast one Attribute & its Value in Attribute table.")
+ frappe.throw(_("Enter atleast one Attribute & its Value in Attribute table."))
def validate_template_item(self):
- template_item = frappe.get_doc("Item", self.item)
- if not template_item.has_variants:
+ if not frappe.db.get_value("Item", self.item_code, "has_variants"):
frappe.throw(_("Selected Item cannot have Variants."))
- if template_item.variant_of:
+ if frappe.db.get_value("Item", self.item_code, "variant_of"):
frappe.throw(_("Item cannot be a variant of a variant"))
def validate_attribute_values(self):
@@ -111,7 +112,7 @@
variant_attributes += d[1] + " | "
self.append('variants', {"variant": item_code + "-" + value.abbr,
"attributes": json.dumps(_my_attributes), "variant_attributes": variant_attributes[: -3]})
- add_attribute_suffixes(self.item, [], attributes)
+ add_attribute_suffixes(self.item_code, [], attributes)
def sync_variants(self):
variant_item_codes = []
@@ -122,7 +123,7 @@
variant_item_codes.append(v.variant)
existing_variants = [d.name for d in frappe.get_all("Item",
- filters={"variant_of":self.item})]
+ filters={"variant_of":self.item_code})]
for d in existing_variants:
attributes = []
@@ -147,10 +148,10 @@
for item_code in variant_item_codes:
if item_code not in existing_variants:
if item_code not in new_variant_name:
- make_variant(self.item, item_code, self.variants)
+ make_variant(self.item_code, item_code, self.variants)
inserted.append(item_code)
else:
- update_variant(self.item, item_code, self.variants)
+ update_variant(self.item_code, item_code, self.variants)
updated.append(item_code)
if inserted:
@@ -168,14 +169,12 @@
def make_variant(item, variant_code, variant_attribute):
variant = frappe.new_doc("Item")
variant.item_code = variant_code
- template = frappe.get_doc("Item", item)
- copy_attributes_to_variant(template, variant, variant_attribute, insert=True)
+ copy_attributes_to_variant(item, variant, variant_attribute, insert=True)
variant.insert()
def update_variant(item, variant_code, variant_attribute=None):
variant = frappe.get_doc("Item", variant_code)
- template = frappe.get_doc("Item", item)
- copy_attributes_to_variant(template, variant, variant_attribute, insert=True)
+ copy_attributes_to_variant(item, variant, variant_attribute, insert=True)
variant.save()
def rename_variant(old_variant_code, new_variant_code):
@@ -184,7 +183,8 @@
def delete_variant(variant_code):
frappe.delete_doc("Item", variant_code)
-def copy_attributes_to_variant(template, variant, variant_attribute=None, insert=False):
+def copy_attributes_to_variant(item, variant, variant_attribute=None, insert=False):
+ template = frappe.get_doc("Item", item)
from frappe.model import no_value_fields
for field in template.meta.fields:
if field.fieldtype not in no_value_fields and (insert or not field.no_copy)\