diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json index 1d75bb5d99..0923a5b617 100644 --- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json +++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -4,6 +4,7 @@ "doctype": "DocType", "document_type": "Document", "editable_grid": 1, + "engine": "InnoDB", "field_order": [ "item_code", "col_break1", @@ -15,6 +16,10 @@ "image_section", "image", "image_view", + "manufacture_details", + "manufacturer", + "column_break_13", + "manufacturer_part_no", "quantity_and_rate", "received_qty", "qty", @@ -728,11 +733,32 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "fieldname": "manufacture_details", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "column_break_13", + "fieldtype": "Column Break" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number", + "read_only": 1 } ], "idx": 1, "istable": 1, - "modified": "2019-05-25 22:04:48.435730", + "modified": "2019-06-02 06:36:17.078419", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Item", diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index e8b19b4024..5d3253a552 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -102,7 +102,9 @@ def get_conditions(filters): ("customer", " and `tabSales Invoice`.customer = %(customer)s"), ("item_code", " and `tabSales Invoice Item`.item_code = %(item_code)s"), ("from_date", " and `tabSales Invoice`.posting_date>=%(from_date)s"), - ("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s")): + ("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s"), + ("company_gstin", " and `tabSales Invoice`.company_gstin = %(company_gstin)s"), + ("invoice_type", " and `tabSales Invoice`.invoice_type = %(invoice_type)s")): if filters.get(opts[0]): conditions += opts[1] diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json index c0338fd2d4..1b63f8f857 100644 --- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json +++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -17,6 +17,10 @@ "col_break1", "image", "image_view", + "manufacture_details", + "manufacturer", + "column_break_14", + "manufacturer_part_no", "quantity_and_rate", "qty", "stock_uom", @@ -672,11 +676,32 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "fieldname": "manufacture_details", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "column_break_14", + "fieldtype": "Column Break" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number", + "read_only": 1 } ], "idx": 1, "istable": 1, - "modified": "2019-05-25 22:10:32.518941", + "modified": "2019-06-02 06:34:47.495730", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Item", diff --git a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json index b37e0ba075..7d7d6f4d3d 100644 --- a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json +++ b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -18,6 +18,10 @@ "col_break1", "image", "image_view", + "manufacture_details", + "manufacturer", + "column_break_15", + "manufacturer_part_no", "quantity_and_rate", "qty", "stock_uom", @@ -285,6 +289,7 @@ "read_only": 1 }, { + "default": "0", "fieldname": "is_free_item", "fieldtype": "Check", "label": "Is Free Item", @@ -493,6 +498,7 @@ }, { "allow_on_submit": 1, + "default": "0", "fieldname": "page_break", "fieldtype": "Check", "label": "Page Break", @@ -500,11 +506,33 @@ "oldfieldname": "page_break", "oldfieldtype": "Check", "print_hide": 1 + }, + { + "collapsible": 1, + "fieldname": "manufacture_details", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number", + "read_only": 1 + }, + { + "fieldname": "column_break_15", + "fieldtype": "Column Break" } ], "idx": 1, "istable": 1, - "modified": "2019-05-01 17:35:05.078030", + "modified": "2019-06-02 05:32:46.019237", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation Item", diff --git a/erpnext/config/quality_management.py b/erpnext/config/quality_management.py index 1256b2d957..35acdfab24 100644 --- a/erpnext/config/quality_management.py +++ b/erpnext/config/quality_management.py @@ -59,14 +59,14 @@ def get_data(): "items": [ { "type": "doctype", - "name": "Customer Feedback", - "description":_("Customer Feedback"), + "name": "Quality Feedback", + "description":_("Quality Feedback"), "onboard": 1, }, { "type": "doctype", - "name": "Customer Feedback Template", - "description":_("Customer Feedback Template"), + "name": "Quality Feedback Template", + "description":_("Quality Feedback Template"), } ] }, diff --git a/erpnext/config/stock.py b/erpnext/config/stock.py index 4fc824fcf1..84aa8474d3 100644 --- a/erpnext/config/stock.py +++ b/erpnext/config/stock.py @@ -161,6 +161,10 @@ def get_data(): "type": "doctype", "name": "Item Alternative", }, + { + "type": "doctype", + "name": "Item Manufacturer", + }, { "type": "doctype", "name": "Item Variant Settings", diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 22846693d1..ccd334ffba 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -437,3 +437,20 @@ def get_batch_numbers(doctype, txt, searchfield, start, page_len, filters): query += " and item = {item}".format(item = frappe.db.escape(filters.get('item'))) return frappe.db.sql(query, filters) + +@frappe.whitelist() +def item_manufacturer_query(doctype, txt, searchfield, start, page_len, filters): + search_txt = "{0}%".format(txt) + + item_filters = { + 'manufacturer': ('like', search_txt), + 'item_code': filters.get("item_code") + } + + return frappe.get_all("Item Manufacturer", + fields = "manufacturer", + filters = item_filters, + limit_start=start, + limit_page_length=page_len, + as_list=1 + ) diff --git a/erpnext/demo/data/drug_list.json b/erpnext/demo/data/drug_list.json index 9b101cb1c8..e91c30d199 100644 --- a/erpnext/demo/data/drug_list.json +++ b/erpnext/demo/data/drug_list.json @@ -39,8 +39,8 @@ "item_name": "Atocopherol", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, + + "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.577151", @@ -123,8 +123,8 @@ "item_name": "Abacavir", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, + + "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.678257", @@ -207,8 +207,6 @@ "item_name": "Abciximab", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.695413", @@ -291,8 +289,6 @@ "item_name": "Acacia", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.797774", @@ -375,8 +371,6 @@ "item_name": "Acamprosate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.826952", @@ -459,8 +453,6 @@ "item_name": "Acarbose", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.843890", @@ -543,8 +535,6 @@ "item_name": "Acebrofylline", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.969984", @@ -627,8 +617,6 @@ "item_name": "Acebrofylline (SR)", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:16.987354", @@ -711,8 +699,6 @@ "item_name": "Aceclofenac", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.004369", @@ -795,8 +781,6 @@ "item_name": "Ash", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.021192", @@ -879,8 +863,6 @@ "item_name": "Asparaginase", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.038058", @@ -963,8 +945,6 @@ "item_name": "Aspartame", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.054463", @@ -1047,8 +1027,6 @@ "item_name": "Aspartic Acid", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.071001", @@ -1131,8 +1109,6 @@ "item_name": "Bleomycin", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.087170", @@ -1215,8 +1191,6 @@ "item_name": "Bleomycin Sulphate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.103691", @@ -1299,8 +1273,6 @@ "item_name": "Blue cap contains", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.120040", @@ -1383,8 +1355,6 @@ "item_name": "Boran", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.135964", @@ -1467,8 +1437,6 @@ "item_name": "Borax", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.152575", @@ -1551,8 +1519,6 @@ "item_name": "Chlorbutanol", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.168998", @@ -1635,8 +1601,6 @@ "item_name": "Chlorbutol", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.185316", @@ -1719,8 +1683,6 @@ "item_name": "Chlordiazepoxide", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.208361", @@ -1803,8 +1765,6 @@ "item_name": "Chlordiazepoxide and Clidinium Bromide", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.224341", @@ -1887,8 +1847,6 @@ "item_name": "Chlorhexidine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.240634", @@ -1971,8 +1929,6 @@ "item_name": "Chlorhexidine 40%", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.256922", @@ -2055,8 +2011,6 @@ "item_name": "Chlorhexidine Acetate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.274789", @@ -2139,8 +2093,6 @@ "item_name": "Chlorhexidine Gluconate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.295371", @@ -2223,8 +2175,6 @@ "item_name": "Chlorhexidine HCL", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.312916", @@ -2307,8 +2257,6 @@ "item_name": "Chlorhexidine Hydrochloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.329570", @@ -2391,8 +2339,6 @@ "item_name": "Chloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.346088", @@ -2475,8 +2421,6 @@ "item_name": "Fosfomycin Tromethamine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.362777", @@ -2559,8 +2503,6 @@ "item_name": "Fosinopril", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.379465", @@ -2643,8 +2585,6 @@ "item_name": "Iodochlorhydroxyquinoline", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.396068", @@ -2727,8 +2667,6 @@ "item_name": "Iodochlorohydroxyquinoline", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.412734", @@ -2811,8 +2749,6 @@ "item_name": "Ipratropium", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.429333", @@ -2895,8 +2831,6 @@ "item_name": "Mebeverine hydrochloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.445814", @@ -2979,8 +2913,6 @@ "item_name": "Mecetronium ethylsulphate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.461696", @@ -3063,8 +2995,6 @@ "item_name": "Meclizine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.478020", @@ -3147,8 +3077,8 @@ "item_name": "Oxaprozin", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, + + "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.496221", @@ -3231,8 +3161,6 @@ "item_name": "Oxazepam", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.511933", @@ -3315,8 +3243,6 @@ "item_name": "Oxcarbazepine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.528472", @@ -3399,8 +3325,6 @@ "item_name": "Oxetacaine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.544177", @@ -3483,8 +3407,6 @@ "item_name": "Oxethazaine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.560193", @@ -3567,8 +3489,6 @@ "item_name": "Suxamethonium Chloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.576447", @@ -3651,8 +3571,6 @@ "item_name": "Tacrolimus", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.593481", @@ -3735,8 +3653,6 @@ "item_name": "Ubiquinol", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.609930", @@ -3819,8 +3735,6 @@ "item_name": "Vitamin B12", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.626225", @@ -3903,8 +3817,6 @@ "item_name": "Vitamin B1Hydrochloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.642423", @@ -3987,8 +3899,6 @@ "item_name": "Vitamin B1Monohydrate", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.658946", @@ -4071,8 +3981,6 @@ "item_name": "Vitamin B2", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.675234", @@ -4155,8 +4063,6 @@ "item_name": "Vitamin B3", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.691598", @@ -4239,8 +4145,6 @@ "item_name": "Vitamin D4", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.707840", @@ -4323,8 +4227,6 @@ "item_name": "Vitamin E", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.723859", @@ -4407,8 +4309,6 @@ "item_name": "Wheat Germ Oil", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.739829", @@ -4491,8 +4391,6 @@ "item_name": "Wheatgrass extr", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.757695", @@ -4575,8 +4473,6 @@ "item_name": "Whey Protein", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.774098", @@ -4659,8 +4555,6 @@ "item_name": "Xylometazoline", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.790224", @@ -4743,8 +4637,6 @@ "item_name": "Xylometazoline Hydrochloride", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.806359", @@ -4827,8 +4719,6 @@ "item_name": "Yeast", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.823305", @@ -4911,8 +4801,6 @@ "item_name": "Yellow Fever Vaccine", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.840250", @@ -4995,8 +4883,6 @@ "item_name": "Zafirlukast", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.856856", @@ -5079,8 +4965,6 @@ "item_name": "Zaleplon", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.873287", @@ -5163,8 +5047,6 @@ "item_name": "Zaltoprofen", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.889263", @@ -5247,8 +5129,6 @@ "item_name": "Zanamivir", "last_purchase_rate": 0.0, "lead_time_days": 0, - "manufacturer": null, - "manufacturer_part_no": null, "max_discount": 0.0, "min_order_qty": 0.0, "modified": "2017-07-06 12:53:17.905022", diff --git a/erpnext/domains/education.py b/erpnext/domains/education.py index 55e4eed801..bbaa6e55d9 100644 --- a/erpnext/domains/education.py +++ b/erpnext/domains/education.py @@ -14,7 +14,7 @@ data = { 'Student Attendance Tool', 'Student Applicant' ], - 'default_portal_role': 'LMS User', + 'default_portal_role': 'Student', 'restricted_roles': [ 'Student', 'Instructor', diff --git a/erpnext/education/doctype/course/course.json b/erpnext/education/doctype/course/course.json index 072e8b4afb..7d8b07397e 100644 --- a/erpnext/education/doctype/course/course.json +++ b/erpnext/education/doctype/course/course.json @@ -1,514 +1,135 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "field:course_code", - "beta": 0, - "creation": "2015-09-07 12:39:55.181893", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 0, - "engine": "InnoDB", + "allow_import": 1, + "allow_rename": 1, + "autoname": "field:course_code", + "creation": "2015-09-07 12:39:55.181893", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "course_name", + "department", + "parent_course", + "column_break_3", + "course_code", + "course_abbreviation", + "section_break_6", + "topics", + "description", + "hero_image", + "assessment", + "default_grading_scale", + "assessment_criteria" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "course_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Course Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "course_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Course Name", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 1, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "department", + "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Department", + "options": "Department" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "parent_course", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Parent Course (Leave blank, if this isn't part of Parent Course)", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "parent_course", + "fieldtype": "Data", + "label": "Parent Course (Leave blank, if this isn't part of Parent Course)" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "course_code", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Course Code", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "course_code", + "fieldtype": "Data", + "label": "Course Code", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "course_abbreviation", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Course Abbreviation", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "course_abbreviation", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Course Abbreviation" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "section_break_6", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "topics", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Topics", - "length": 0, - "no_copy": 0, - "options": "Course Topic", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "topics", + "fieldtype": "Table", + "label": "Topics", + "options": "Course Topic" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "course_intro", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Course Intro", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "hero_image", + "fieldtype": "Attach Image", + "label": "Hero Image" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "hero_image", - "fieldtype": "Attach Image", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Hero Image", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "assessment", + "fieldtype": "Section Break", + "label": "Assessment" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "assessment", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Assessment", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "default_grading_scale", + "fieldtype": "Link", + "label": "Default Grading Scale", + "options": "Grading Scale" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "default_grading_scale", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Grading Scale", - "length": 0, - "no_copy": 0, - "options": "Grading Scale", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "assessment_criteria", + "fieldtype": "Table", + "label": "Assessment Criteria", + "options": "Course Assessment Criteria" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "assessment_criteria", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Assessment Criteria", - "length": 0, - "no_copy": 0, - "options": "Course Assessment Criteria", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description" } - ], - "has_web_view": 0, - "hide_toolbar": 0, - "idx": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2019-04-09 11:35:27.354877", - "modified_by": "Administrator", - "module": "Education", - "name": "Course", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-06-05 18:39:11.870605", + "modified_by": "Administrator", + "module": "Education", + "name": "Course", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "restrict_to_domain": "Education", - "search_fields": "course_name", - "show_name_in_global_search": 1, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + ], + "restrict_to_domain": "Education", + "search_fields": "course_name", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.py b/erpnext/education/doctype/course_enrollment/course_enrollment.py index 6f2bb0db1f..b082be2aa2 100644 --- a/erpnext/education/doctype/course_enrollment/course_enrollment.py +++ b/erpnext/education/doctype/course_enrollment/course_enrollment.py @@ -35,7 +35,7 @@ class CourseEnrollment(Document): if enrollment: frappe.throw(_("Student is already enrolled.")) - def add_quiz_activity(self, quiz_name, quiz_response,answers, score, status): + def add_quiz_activity(self, quiz_name, quiz_response, answers, score, status): result = {k: ('Correct' if v else 'Wrong') for k,v in answers.items()} result_data = [] for key in answers: @@ -43,7 +43,9 @@ class CourseEnrollment(Document): item['question'] = key item['quiz_result'] = result[key] try: - if isinstance(quiz_response[key], list): + if not quiz_response[key]: + item['selected_option'] = "Unattempted" + elif isinstance(quiz_response[key], list): item['selected_option'] = ', '.join(frappe.get_value('Options', res, 'option') for res in quiz_response[key]) else: item['selected_option'] = frappe.get_value('Options', quiz_response[key], 'option') @@ -59,11 +61,12 @@ class CourseEnrollment(Document): "result": result_data, "score": score, "status": status - }).insert() + }).insert(ignore_permissions = True) def add_activity(self, content_type, content): - if check_activity_exists(self.name, content_type, content): - pass + activity = check_activity_exists(self.name, content_type, content) + if activity: + return activity else: activity = frappe.get_doc({ "doctype": "Course Activity", @@ -71,9 +74,14 @@ class CourseEnrollment(Document): "content_type": content_type, "content": content, "activity_date": frappe.utils.datetime.datetime.now() - }) - activity.insert() + }) + + activity.insert(ignore_permissions=True) + return activity.name def check_activity_exists(enrollment, content_type, content): activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content}) - return bool(activity) \ No newline at end of file + if activity: + return activity[0].name + else: + return None \ No newline at end of file diff --git a/erpnext/education/doctype/program/program.json b/erpnext/education/doctype/program/program.json index cb8d7786e1..a0a2aa2e2b 100644 --- a/erpnext/education/doctype/program/program.json +++ b/erpnext/education/doctype/program/program.json @@ -1,627 +1,181 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 1, "autoname": "field:program_code", - "beta": 0, "creation": "2015-09-07 12:54:03.609282", - "custom": 0, - "docstatus": 0, "doctype": "DocType", - "document_type": "", - "editable_grid": 0, "engine": "InnoDB", + "field_order": [ + "program_name", + "department", + "column_break_3", + "program_code", + "program_abbreviation", + "section_break_5", + "courses", + "section_break_9", + "description", + "intro_video", + "hero_image", + "column_break_11", + "is_published", + "is_featured", + "allow_self_enroll" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "program_name", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Program Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "department", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 1, "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Department" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "program_code", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Program Code", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "program_abbreviation", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, - "label": "Program Abbreviation", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Program Abbreviation" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fetch_if_empty": 0, "fieldname": "section_break_5", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Portal Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Portal Settings" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "courses", "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Courses", - "length": 0, - "no_copy": 0, - "options": "Program Course", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Program Course" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "section_break_9", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "LMS Settings" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "description", "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Description" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "intro_video", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Intro Video", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Intro Video" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "hero_image", "fieldtype": "Attach Image", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Hero Image", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Hero Image" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "column_break_11", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "0", - "fetch_if_empty": 0, "fieldname": "is_published", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Published", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Is Published" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "0", - "fetch_if_empty": 0, + "depends_on": "eval: doc.is_published == 1", "fieldname": "is_featured", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Featured", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Is Featured" + }, + { + "default": "0", + "depends_on": "eval: doc.is_published == 1", + "description": "Allow students to enroll themselves from the portal", + "fieldname": "allow_self_enroll", + "fieldtype": "Check", + "label": "Allow Self Enroll" } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2019-03-18 15:26:56.737903", + "modified": "2019-06-05 17:47:26.877296", "modified_by": "Administrator", "module": "Education", "name": "Program", - "name_case": "", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Guest", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "LMS User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Student", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 - }, - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "System Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "share": 1, + "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Guest", + "share": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Student", + "share": 1 } ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, "restrict_to_domain": "Education", - "route": "", "search_fields": "program_name", "show_name_in_global_search": 1, "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py index 22cca86fcf..d232e47245 100644 --- a/erpnext/education/doctype/program_enrollment/program_enrollment.py +++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py @@ -96,29 +96,6 @@ class ProgramEnrollment(Document): quiz_progress.program = self.program return quiz_progress - def get_program_progress(self): - import math - program = frappe.get_doc("Program", self.program) - program_progress = {} - progress = [] - for course in program.get_all_children(): - course_progress = lms.get_student_course_details(course.course, self.program) - is_complete = False - if course_progress['flag'] == "Completed": - is_complete = True - progress.append({'course_name': course.course_name, 'name': course.course, 'is_complete': is_complete}) - - program_progress['progress'] = progress - program_progress['name'] = self.program - program_progress['program'] = frappe.get_value("Program", self.program, 'program_name') - - try: - program_progress['percentage'] = math.ceil((sum([item['is_complete'] for item in progress] * 100)/len(progress))) - except ZeroDivisionError: - program_progress['percentage'] = 0 - - return program_progress - @frappe.whitelist() def get_program_courses(doctype, txt, searchfield, start, page_len, filters): if filters.get('program'): diff --git a/erpnext/education/doctype/question/question.json b/erpnext/education/doctype/question/question.json index 14a9f3ce92..b3a161daa0 100644 --- a/erpnext/education/doctype/question/question.json +++ b/erpnext/education/doctype/question/question.json @@ -1,167 +1,80 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "format:QUESTION-{#####}", - "beta": 0, - "creation": "2018-10-01 15:58:00.696815", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "allow_import": 1, + "autoname": "format:QUESTION-{#####}", + "creation": "2018-10-01 15:58:00.696815", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "question", + "options", + "question_type" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "question", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Question", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "question", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Question", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fetch_if_empty": 0, - "fieldname": "options", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Options", - "length": 0, - "no_copy": 0, - "options": "Options", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "options", + "fieldtype": "Table", + "label": "Options", + "options": "Options", + "reqd": 1 + }, + { + "fieldname": "question_type", + "fieldtype": "Select", + "in_standard_filter": 1, + "label": "Type", + "options": "\nSingle Correct Answer\nMultiple Correct Answer", + "read_only": 1 } - ], - "has_web_view": 0, - "hide_toolbar": 0, - "idx": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-04-22 14:02:08.140652", - "modified_by": "Administrator", - "module": "Education", - "name": "Question", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-30 18:39:21.880974", + "modified_by": "Administrator", + "module": "Education", + "name": "Question", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Academics User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "LMS User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "LMS User", + "share": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/education/doctype/question/question.py b/erpnext/education/doctype/question/question.py index 8cd23983ce..b8221081fa 100644 --- a/erpnext/education/doctype/question/question.py +++ b/erpnext/education/doctype/question/question.py @@ -12,6 +12,7 @@ class Question(Document): def validate(self): self.check_at_least_one_option() self.check_minimum_one_correct_answer() + self.set_question_type() def check_at_least_one_option(self): if len(self.options) <= 1: @@ -26,6 +27,13 @@ class Question(Document): else: frappe.throw(_("A qustion must have at least one correct options")) + def set_question_type(self): + correct_options = [option for option in self.options if option.is_correct] + if len(correct_options) > 1: + self.question_type = "Multiple Correct Answer" + else: + self.question_type = "Single Correct Answer" + def get_answer(self): options = self.options answers = [item.name for item in options if item.is_correct == True] diff --git a/erpnext/education/doctype/quiz/quiz.json b/erpnext/education/doctype/quiz/quiz.json index f91bc0f021..b4903fc285 100644 --- a/erpnext/education/doctype/quiz/quiz.json +++ b/erpnext/education/doctype/quiz/quiz.json @@ -1,299 +1,105 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, "autoname": "field:title", - "beta": 0, "creation": "2018-10-17 05:52:50.149904", - "custom": 0, - "docstatus": 0, "doctype": "DocType", - "document_type": "", "editable_grid": 1, "engine": "InnoDB", + "field_order": [ + "title", + "question", + "quiz_configuration_section", + "passing_score", + "max_attempts", + "grading_basis" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "title", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Title", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "question", "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Question", - "length": 0, - "no_copy": 0, "options": "Quiz Question", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "quiz_configuration_section", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Quiz Configuration", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Quiz Configuration" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, + "default": "75", + "description": "Score out of 100", "fieldname": "passing_score", "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Passing Score", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "1", "description": "Enter 0 to waive limit", "fieldname": "max_attempts", "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Max Attempts", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Last Highest Score", + "default": "Latest Highest Score", "fieldname": "grading_basis", "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Grading Basis", - "length": 0, - "no_copy": 0, - "options": "\nLast Attempt\nLast Highest Score", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Latest Highest Score\nLatest Attempt" } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-25 19:07:36.190116", + "modified": "2019-05-30 18:50:54.218571", "modified_by": "Administrator", "module": "Education", "name": "Quiz", - "name_case": "", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Academics User", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "LMS User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 + "share": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Instructor", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 } ], "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/education/doctype/quiz/quiz.py b/erpnext/education/doctype/quiz/quiz.py index 6da50a6e25..8e54745464 100644 --- a/erpnext/education/doctype/quiz/quiz.py +++ b/erpnext/education/doctype/quiz/quiz.py @@ -7,51 +7,47 @@ import frappe from frappe.model.document import Document class Quiz(Document): + def validate(self): + if self.passing_score > 100: + frappe.throw("Passing Score value should be between 0 and 100") - def validate_quiz_attempts(self, enrollment, quiz_name): - if self.max_attempts > 0: - try: - if len(frappe.get_all("Quiz Activity", {'enrollment': enrollment.name, 'quiz': quiz_name})) >= self.max_attempts: - frappe.throw('Maximum attempts reached!') - except Exception as e: - pass + def allowed_attempt(self, enrollment, quiz_name): + if self.max_attempts == 0: + return True + + try: + if len(frappe.get_all("Quiz Activity", {'enrollment': enrollment.name, 'quiz': quiz_name})) >= self.max_attempts: + frappe.msgprint("Maximum attempts for this quiz reached!") + return False + else: + return True + except Exception as e: + return False def evaluate(self, response_dict, quiz_name): - # self.validate_quiz_attempts(enrollment, quiz_name) questions = [frappe.get_doc('Question', question.question_link) for question in self.question] answers = {q.name:q.get_answer() for q in questions} - correct_answers = {} + result = {} for key in answers: try: if isinstance(response_dict[key], list): - result = compare_list_elementwise(response_dict[key], answers[key]) + is_correct = compare_list_elementwise(response_dict[key], answers[key]) else: - result = (response_dict[key] == answers[key]) - except: - result = False - correct_answers[key] = result - score = (sum(correct_answers.values()) * 100 ) / len(answers) + is_correct = (response_dict[key] == answers[key]) + except Exception as e: + is_correct = False + result[key] = is_correct + score = (sum(result.values()) * 100 ) / len(answers) if score >= self.passing_score: status = "Pass" else: status = "Fail" - return correct_answers, score, status + return result, score, status def get_questions(self): - quiz_question = self.get_all_children() - if quiz_question: - questions = [frappe.get_doc('Question', question.question_link).as_dict() for question in quiz_question] - for question in questions: - correct_options = [option.is_correct for option in question.options] - if sum(correct_options) > 1: - question['type'] = "MultipleChoice" - else: - question['type'] = "SingleChoice" - return questions - else: - return None + return [frappe.get_doc('Question', question.question_link) for question in self.question] def compare_list_elementwise(*args): try: diff --git a/erpnext/education/doctype/quiz_result/quiz_result.json b/erpnext/education/doctype/quiz_result/quiz_result.json index 86505ac756..67c7e2d449 100644 --- a/erpnext/education/doctype/quiz_result/quiz_result.json +++ b/erpnext/education/doctype/quiz_result/quiz_result.json @@ -1,145 +1,52 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-15 15:52:25.766374", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "creation": "2018-10-15 15:52:25.766374", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "question", + "selected_option", + "quiz_result" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "question", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Question", - "length": 0, - "no_copy": 0, - "options": "Question", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "fieldname": "question", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Question", + "options": "Question", + "read_only": 1, + "reqd": 1, + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "selected_option", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Selected Option", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 - }, + "fieldname": "selected_option", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Selected Option", + "read_only": 1, + "set_only_once": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "quiz_result", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Result", - "length": 0, - "no_copy": 0, - "options": "\nCorrect\nWrong", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 1, - "translatable": 0, - "unique": 0 + "fieldname": "quiz_result", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Result", + "options": "\nCorrect\nWrong", + "read_only": 1, + "reqd": 1, + "set_only_once": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2019-03-27 17:58:54.388848", - "modified_by": "Administrator", - "module": "Education", - "name": "Quiz Result", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "istable": 1, + "modified": "2019-06-03 12:52:32.267392", + "modified_by": "Administrator", + "module": "Education", + "name": "Quiz Result", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/education/doctype/student/student.py b/erpnext/education/doctype/student/student.py index 529f78d4f5..da25880c81 100644 --- a/erpnext/education/doctype/student/student.py +++ b/erpnext/education/doctype/student/student.py @@ -54,7 +54,7 @@ class Student(Document): 'send_welcome_email': 1, 'user_type': 'Website User' }) - student_user.add_roles("Student", "LMS User") + student_user.add_roles("Student") student_user.save() update_password_link = student_user.reset_password() diff --git a/erpnext/education/doctype/topic/topic.json b/erpnext/education/doctype/topic/topic.json index f47b10d780..6e748fddce 100644 --- a/erpnext/education/doctype/topic/topic.json +++ b/erpnext/education/doctype/topic/topic.json @@ -1,297 +1,104 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "field:topic_code", - "beta": 0, - "creation": "2018-12-12 11:37:39.917760", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "field:topic_code", + "creation": "2018-12-12 11:37:39.917760", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "topic_name", + "column_break_2", + "topic_code", + "section_break_4", + "topic_content", + "description", + "hero_image" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "topic_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "topic_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Name", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_2", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "topic_code", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Code", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "topic_code", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Code", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "section_break_4", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "section_break_4", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "topic_content", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Topic Content", - "length": 0, - "no_copy": 0, - "options": "Topic Content", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "topic_content", + "fieldtype": "Table", + "label": "Topic Content", + "options": "Topic Content" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "hero_image", - "fieldtype": "Attach Image", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Hero Image", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "hero_image", + "fieldtype": "Attach Image", + "label": "Hero Image" + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description" } - ], - "has_web_view": 0, - "hide_toolbar": 0, - "idx": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2019-04-09 11:35:34.137040", - "modified_by": "Administrator", - "module": "Education", - "name": "Topic", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-06-05 18:38:44.029711", + "modified_by": "Administrator", + "module": "Education", + "name": "Topic", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Administrator", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Administrator", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "share": 1, "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/education/doctype/video/video.json b/erpnext/education/doctype/video/video.json index cc8f718ba4..3d11bd256f 100644 --- a/erpnext/education/doctype/video/video.json +++ b/erpnext/education/doctype/video/video.json @@ -1,262 +1,102 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, "allow_import": 1, - "allow_rename": 0, "autoname": "field:title", - "beta": 0, "creation": "2018-10-17 05:47:13.087395", - "custom": 0, - "docstatus": 0, "doctype": "DocType", - "document_type": "", "editable_grid": 1, "engine": "InnoDB", + "field_order": [ + "title", + "description", + "duration", + "provider", + "url", + "publish_date" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "title", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, + "in_list_view": 1, "label": "Title", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "reqd": 1, "unique": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "description", "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, + "in_list_view": 1, "label": "Description", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "duration", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Duration", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Duration" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "url", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, + "in_list_view": 1, "label": "URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "publish_date", "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Publish Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Publish Date" + }, + { + "fieldname": "provider", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Provider", + "options": "YouTube\nVimeo", + "reqd": 1 } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-25 19:07:17.134288", + "modified": "2019-05-20 15:11:53.075093", "modified_by": "Administrator", "module": "Education", "name": "Video", - "name_case": "", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Academics User", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Instructor", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "LMS User", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 0 + "share": 1 } ], "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/education/setup.py b/erpnext/education/setup.py index ed1d69e80d..5c4092849a 100644 --- a/erpnext/education/setup.py +++ b/erpnext/education/setup.py @@ -9,7 +9,8 @@ from erpnext.setup.utils import insert_record def setup_education(): - if frappe.db.exists('Academic Year', '2015-16'): + disable_desk_access_for_student_role() + if frappe.db.exists("Academic Year", "2015-16"): # already setup return create_academic_sessions() @@ -26,3 +27,22 @@ def create_academic_sessions(): {"doctype": "Academic Term", "academic_year": "2017-18", "term_name": "Semester 2"} ] insert_record(data) + +def disable_desk_access_for_student_role(): + try: + student_role = frappe.get_doc("Role", "Student") + except frappe.DoesNotExistError: + create_student_role() + return + + student_role.desk_access = 0 + student_role.save() + +def create_student_role(): + student_role = frappe.get_doc({ + "doctype": "Role", + "role_name": "Student", + "desk_access": 0, + "restrict_to_domain": "Education" + }) + student_role.insert() diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py index bf766adc09..8cd5bbb95b 100644 --- a/erpnext/education/utils.py +++ b/erpnext/education/utils.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Copyright (c) 2015, Frappe Technologies and contributors -# For lice from __future__ import unicode_literals, division import frappe @@ -57,9 +56,10 @@ def validate_duplicate_student(students): # LMS Utils def get_current_student(): - """ - Returns student user name, example EDU-STU-2018-00001 (Based on the naming series). - Takes email from from frappe.session.user + """Returns current student from frappe.session.user + + Returns: + object: Student Document """ email = frappe.session.user if email in ('Administrator', 'Guest'): @@ -70,44 +70,266 @@ def get_current_student(): except (IndexError, frappe.DoesNotExistError): return None -def check_super_access(): +def get_portal_programs(): + """Returns a list of all program to be displayed on the portal + Programs are returned based on the following logic + is_published and (student_is_enrolled or student_can_self_enroll) + + Returns: + list of dictionary: List of all programs and to be displayed on the portal along with access rights + """ + published_programs = frappe.get_all("Program", filters={"is_published": True}) + if not published_programs: + return None + + program_list = [frappe.get_doc("Program", program) for program in published_programs] + portal_programs = [{'program': program, 'has_access': allowed_program_access(program.name)} for program in program_list if allowed_program_access(program.name) or program.allow_self_enroll] + + return portal_programs + +def allowed_program_access(program, student=None): + """Returns enrollment status for current student + + Args: + program (string): Name of the program + student (object): instance of Student document + + Returns: + bool: Is current user enrolled or not + """ + if has_super_access(): + return True + if not student: + student = get_current_student() + if student and get_enrollment('program', program, student.name): + return True + else: + return False + +def get_enrollment(master, document, student): + """Gets enrollment for course or program + + Args: + master (string): can either be program or course + document (string): program or course name + student (string): Student ID + + Returns: + string: Enrollment Name if exists else returns empty string + """ + if master == 'program': + enrollments = frappe.get_all("Program Enrollment", filters={'student':student, 'program': document, 'docstatus': 1}) + if master == 'course': + enrollments = frappe.get_all("Course Enrollment", filters={'student':student, 'course': document}) + + if enrollments: + return enrollments[0].name + else: + return None + +@frappe.whitelist() +def enroll_in_program(program_name, student=None): + """Enroll student in program + + Args: + program_name (string): Name of the program to be enrolled into + student (string, optional): name of student who has to be enrolled, if not + provided, a student will be created from the current user + + Returns: + string: name of the program enrollment document + """ + if has_super_access(): + return + + if not student == None: + student = frappe.get_doc("Student", student) + else: + # Check if self enrollment in allowed + program = frappe.get_doc('Program', program_name) + if not program.allow_self_enroll: + return frappe.throw("You are not allowed to enroll for this course") + + student = get_current_student() + if not student: + student = create_student_from_current_user() + + # Check if student is already enrolled in program + enrollment = get_enrollment('program', program_name, student.name) + if enrollment: + return enrollment + + # Check if self enrollment in allowed + program = frappe.get_doc('Program', program_name) + if not program.allow_self_enroll: + return frappe.throw("You are not allowed to enroll for this course") + + # Enroll in program + program_enrollment = student.enroll_in_program(program_name) + return program_enrollment.name + +def has_super_access(): + """Check if user has a role that allows full access to LMS + + Returns: + bool: true if user has access to all lms content + """ current_user = frappe.get_doc('User', frappe.session.user) roles = set([role.role for role in current_user.roles]) return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'}) -def get_program_enrollment(program_name): - """ - Function to get program enrollments for a particular student for a program - """ +@frappe.whitelist() +def add_activity(course, content_type, content, program): + if has_super_access(): + return None + student = get_current_student() if not student: - return None + return frappe.throw("Student with email {0} does not exist".format(frappe.session.user), frappe.DoesNotExistError) + + enrollment = get_or_create_course_enrollment(course, program) + if content_type == 'Quiz': + return else: - enrollment = frappe.get_all("Program Enrollment", filters={'student':student.name, 'program': program_name}) - if enrollment: - return enrollment[0].name + return enrollment.add_activity(content_type, content) + +@frappe.whitelist() +def evaluate_quiz(quiz_response, quiz_name, course, program): + import json + + student = get_current_student() + + quiz_response = json.loads(quiz_response) + quiz = frappe.get_doc("Quiz", quiz_name) + result, score, status = quiz.evaluate(quiz_response, quiz_name) + + if has_super_access(): + return {'result': result, 'score': score, 'status': status} + + if student: + enrollment = get_or_create_course_enrollment(course, program) + if quiz.allowed_attempt(enrollment, quiz_name): + enrollment.add_quiz_activity(quiz_name, quiz_response, result, score, status) + return {'result': result, 'score': score, 'status': status} else: return None -def get_program_and_enrollment_status(program_name): - program = frappe.get_doc('Program', program_name) - is_enrolled = bool(get_program_enrollment(program_name)) or check_super_access() - return {'program': program, 'is_enrolled': is_enrolled} +@frappe.whitelist() +def get_quiz(quiz_name, course): + try: + quiz = frappe.get_doc("Quiz", quiz_name) + questions = quiz.get_questions() + except: + frappe.throw("Quiz {0} does not exist".format(quiz_name)) + return None -def get_course_enrollment(course_name): + questions = [{ + 'name': question.name, + 'question': question.question, + 'type': question.question_type, + 'options': [{'name': option.name, 'option': option.option} + for option in question.options], + } for question in questions] + + if has_super_access(): + return {'questions': questions, 'activity': None} + + student = get_current_student() + course_enrollment = get_enrollment("course", course, student.name) + status, score, result = check_quiz_completion(quiz, course_enrollment) + return {'questions': questions, 'activity': {'is_complete': status, 'score': score, 'result': result}} + +def get_topic_progress(topic, course_name, program): + """ + Return the porgress of a course in a program as well as the content to continue from. + :param topic_name: + :param course_name: + """ student = get_current_student() if not student: return None - enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student.name, 'course':course_name}) - try: - name = enrollment_name[0].name - enrollment = frappe.get_doc("Course Enrollment", name) - return enrollment - except: + course_enrollment = get_or_create_course_enrollment(course_name, program) + progress = student.get_topic_progress(course_enrollment.name, topic) + if not progress: return None + count = sum([activity['is_complete'] for activity in progress]) + if count == 0: + return {'completed': False, 'started': False} + elif count == len(progress): + return {'completed': True, 'started': True} + elif count < len(progress): + return {'completed': False, 'started': True} + +def get_course_progress(course, program): + """ + Return the porgress of a course in a program as well as the content to continue from. + :param topic_name: + :param course_name: + """ + course_progress = [] + for course_topic in course.topics: + topic = frappe.get_doc("Topic", course_topic.topic) + progress = get_topic_progress(topic, course.name, program) + if progress: + course_progress.append(progress) + if course_progress: + number_of_completed_topics = sum([activity['completed'] for activity in course_progress]) + total_topics = len(course_progress) + if total_topics == 1: + return course_progress[0] + if number_of_completed_topics == 0: + return {'completed': False, 'started': False} + if number_of_completed_topics == total_topics: + return {'completed': True, 'started': True} + if number_of_completed_topics < total_topics: + return {'completed': False, 'started': True} + + return None + +def get_program_progress(program): + program_progress = [] + if not program.courses: + return None + for program_course in program.courses: + course = frappe.get_doc("Course", program_course.course) + progress = get_course_progress(course, program.name) + if progress: + progress['name'] = course.name + progress['course'] = course.course_name + program_progress.append(progress) + + if program_progress: + return program_progress + + return None + +def get_program_completion(program): + topics = frappe.db.sql("""select `tabCourse Topic`.topic, `tabCourse Topic`.parent + from `tabCourse Topic`, + `tabProgram Course` + where `tabCourse Topic`.parent = `tabProgram Course`.course + and `tabProgram Course`.parent = %s""", program.name) + + progress = [] + for topic in topics: + topic_doc = frappe.get_doc('Topic', topic[0]) + topic_progress = get_topic_progress(topic_doc, topic[1], program.name) + if topic_progress: + progress.append(topic_progress) + + if progress: + number_of_completed_topics = sum([activity['completed'] for activity in progress if activity]) + total_topics = len(progress) + try: + return int((float(number_of_completed_topics)/total_topics)*100) + except ZeroDivisionError: + return 0 + + return 0 def create_student_from_current_user(): user = frappe.get_doc("User", frappe.session.user) + student = frappe.get_doc({ "doctype": "Student", "first_name": user.first_name, @@ -115,12 +337,21 @@ def create_student_from_current_user(): "student_email_id": user.email, "user": frappe.session.user }) + student.save(ignore_permissions=True) return student -def enroll_in_course(course_name, program_name): +def get_or_create_course_enrollment(course, program): student = get_current_student() - return student.enroll_in_course(course_name=course_name, program_enrollment=get_program_enrollment(program_name)) + course_enrollment = get_enrollment("course", course, student.name) + if not course_enrollment: + program_enrollment = get_enrollment('program', program, student.name) + if not program_enrollment: + frappe.throw("You are not enrolled in program {0}".format(program)) + return + return student.enroll_in_course(course_name=course, program_enrollment=get_enrollment('program', program, student.name)) + else: + return frappe.get_doc('Course Enrollment', course_enrollment) def check_content_completion(content_name, content_type, enrollment_name): activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name}) @@ -131,7 +362,7 @@ def check_content_completion(content_name, content_type, enrollment_name): def check_quiz_completion(quiz, enrollment_name): attempts = frappe.get_all("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"]) - status = False if quiz.max_attempts == 0 else bool(len(attempts) == quiz.max_attempts) + status = False if quiz.max_attempts == 0 else bool(len(attempts) >= quiz.max_attempts) score = None result = None if attempts: diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index bdb2080e39..70ac6febcf 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -446,7 +446,7 @@ class SalarySlip(TransactionBase): else: component_row.additional_amount = amount - if not overwrite: + if not overwrite and component_row.default_amount: amount += component_row.default_amount component_row.amount = amount diff --git a/erpnext/manufacturing/report/bom_items_and_scraps/__init__.py b/erpnext/manufacturing/report/bom_explorer/__init__.py similarity index 100% rename from erpnext/manufacturing/report/bom_items_and_scraps/__init__.py rename to erpnext/manufacturing/report/bom_explorer/__init__.py diff --git a/erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.js b/erpnext/manufacturing/report/bom_explorer/bom_explorer.js similarity index 84% rename from erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.js rename to erpnext/manufacturing/report/bom_explorer/bom_explorer.js index ebff39f3ea..b94d3f3770 100644 --- a/erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.js +++ b/erpnext/manufacturing/report/bom_explorer/bom_explorer.js @@ -2,7 +2,7 @@ // For license information, please see license.txt /* eslint-disable */ -frappe.query_reports["BOM Items and Scraps"] = { +frappe.query_reports["BOM Explorer"] = { "filters": [ { fieldname: "bom", diff --git a/erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.json b/erpnext/manufacturing/report/bom_explorer/bom_explorer.json similarity index 71% rename from erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.json rename to erpnext/manufacturing/report/bom_explorer/bom_explorer.json index bebe85d2b6..93cba17adc 100644 --- a/erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.json +++ b/erpnext/manufacturing/report/bom_explorer/bom_explorer.json @@ -1,20 +1,20 @@ { "add_total_row": 0, - "creation": "2019-05-14 12:06:14.998746", + "creation": "2019-06-06 15:42:53.021714", "disable_prepared_report": 0, "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2019-05-14 12:06:14.998746", + "modified": "2019-06-06 15:42:53.021714", "modified_by": "Administrator", "module": "Manufacturing", - "name": "BOM Items and Scraps", + "name": "BOM Explorer", "owner": "Administrator", "prepared_report": 0, "ref_doctype": "BOM", - "report_name": "BOM Items and Scraps ", + "report_name": "BOM Explorer", "report_type": "Script Report", "roles": [ { diff --git a/erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.py b/erpnext/manufacturing/report/bom_explorer/bom_explorer.py similarity index 100% rename from erpnext/manufacturing/report/bom_items_and_scraps/bom_items_and_scraps.py rename to erpnext/manufacturing/report/bom_explorer/bom_explorer.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index b94f0b23a9..334e2ca68a 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -604,4 +604,5 @@ execute:frappe.delete_doc("Report", "Inactive Items") erpnext.patches.v11_1.delete_scheduling_tool erpnext.patches.v12_0.make_custom_fields_for_bank_remittance execute:frappe.delete_doc_if_exists("Page", "support-analytics") +erpnext.patches.v12_0.make_item_manufacturer erpnext.patches.v12_0.set_priority_for_support diff --git a/erpnext/patches/v12_0/make_item_manufacturer.py b/erpnext/patches/v12_0/make_item_manufacturer.py new file mode 100644 index 0000000000..ebc28320ae --- /dev/null +++ b/erpnext/patches/v12_0/make_item_manufacturer.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc("stock", "doctype", "item_manufacturer") + + item_manufacturer = [] + for d in frappe.db.sql(""" SELECT name, manufacturer, manufacturer_part_no, creation, owner + FROM `tabItem` WHERE manufacturer is not null and manufacturer != ''""", as_dict=1): + item_manufacturer.append(( + frappe.generate_hash("", 10), + d.name, + d.manufacturer, + d.manufacturer_part_no, + d.creation, + d.owner + )) + + if item_manufacturer: + frappe.db.sql(''' + INSERT INTO `tabItem Manufacturer` + (`name`, `item_code`, `manufacturer`, `manufacturer_part_no`, `creation`, `owner`) + VALUES {}'''.format(', '.join(['%s'] * len(item_manufacturer))), tuple(item_manufacturer) + ) diff --git a/erpnext/public/build.json b/erpnext/public/build.json index bb1980321b..be7189bb96 100644 --- a/erpnext/public/build.json +++ b/erpnext/public/build.json @@ -55,8 +55,5 @@ "stock/dashboard/item_dashboard.html", "stock/dashboard/item_dashboard_list.html", "stock/dashboard/item_dashboard.js" - ], - "js/lms.min.js": [ - "public/js/education/lms/lms.js" ] } diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js index f2fe3fe72b..7e61f03af9 100644 --- a/erpnext/public/js/controllers/buying.js +++ b/erpnext/public/js/controllers/buying.js @@ -14,8 +14,8 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ this._super(); }, - onload: function() { - this.setup_queries(); + onload: function(doc, cdt, cdn) { + this.setup_queries(doc, cdt, cdn); this._super(); this.frm.set_query('shipping_rule', function() { @@ -50,7 +50,7 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ /* eslint-enable */ }, - setup_queries: function() { + setup_queries: function(doc, cdt, cdn) { var me = this; if(this.frm.fields_dict.buying_price_list) { @@ -90,6 +90,15 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ } } }); + + + this.frm.set_query("manufacturer", "items", function(doc, cdt, cdn) { + const row = locals[cdt][cdn]; + return { + query: "erpnext.controllers.queries.item_manufacturer_query", + filters:{ 'item_code': row.item_code } + } + }); }, refresh: function(doc) { @@ -338,6 +347,25 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ } }) } + }, + + manufacturer: function(doc, cdt, cdn) { + const row = locals[cdt][cdn]; + + if(row.manufacturer) { + frappe.call({ + method: "erpnext.stock.doctype.item_manufacturer.item_manufacturer.get_item_manufacturer_part_no", + args: { + 'item_code': row.item_code, + 'manufacturer': row.manufacturer + }, + callback: function(r) { + if (r.message) { + frappe.model.set_value(cdt, cdn, 'manufacturer_part_no', r.message); + } + } + }); + } } }); diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 329695eb39..bbd1f1c17b 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -460,6 +460,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ weight_per_unit: item.weight_per_unit, weight_uom: item.weight_uom, uom : item.uom, + manufacturer: item.manufacturer, stock_uom: item.stock_uom, pos_profile: me.frm.doc.doctype == 'Sales Invoice' ? me.frm.doc.pos_profile : '', cost_center: item.cost_center, diff --git a/erpnext/public/js/education/lms/call.js b/erpnext/public/js/education/lms/call.js deleted file mode 100644 index e35acbdd75..0000000000 --- a/erpnext/public/js/education/lms/call.js +++ /dev/null @@ -1,15 +0,0 @@ -frappe.ready(() => { - frappe.provide('lms'); - - lms.call = (method, args) => { - const method_path = 'erpnext.www.lms.' + method; - return new Promise((resolve, reject) => { - return frappe.call({ - method: method_path, - args, - }) - .then(r => resolve(r.message)) - .fail(reject); - }); - }; -}); \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/Article.vue b/erpnext/public/js/education/lms/components/Article.vue deleted file mode 100644 index eab1424455..0000000000 --- a/erpnext/public/js/education/lms/components/Article.vue +++ /dev/null @@ -1,44 +0,0 @@ - - diff --git a/erpnext/public/js/education/lms/components/Breadcrumb.vue b/erpnext/public/js/education/lms/components/Breadcrumb.vue deleted file mode 100644 index 1b617a3751..0000000000 --- a/erpnext/public/js/education/lms/components/Breadcrumb.vue +++ /dev/null @@ -1,56 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/Button.vue b/erpnext/public/js/education/lms/components/Button.vue deleted file mode 100644 index 4d8df4b314..0000000000 --- a/erpnext/public/js/education/lms/components/Button.vue +++ /dev/null @@ -1,25 +0,0 @@ - - diff --git a/erpnext/public/js/education/lms/components/CardList.vue b/erpnext/public/js/education/lms/components/CardList.vue deleted file mode 100644 index 10f6af096c..0000000000 --- a/erpnext/public/js/education/lms/components/CardList.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/erpnext/public/js/education/lms/components/ContentNavigation.vue b/erpnext/public/js/education/lms/components/ContentNavigation.vue deleted file mode 100644 index a07c0f85f4..0000000000 --- a/erpnext/public/js/education/lms/components/ContentNavigation.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/erpnext/public/js/education/lms/components/ContentTitle.vue b/erpnext/public/js/education/lms/components/ContentTitle.vue deleted file mode 100644 index a488ab85c3..0000000000 --- a/erpnext/public/js/education/lms/components/ContentTitle.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/erpnext/public/js/education/lms/components/CourseCard.vue b/erpnext/public/js/education/lms/components/CourseCard.vue deleted file mode 100644 index 48a9f591c7..0000000000 --- a/erpnext/public/js/education/lms/components/CourseCard.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/Navbar.vue b/erpnext/public/js/education/lms/components/Navbar.vue deleted file mode 100644 index f3f3ce4cbb..0000000000 --- a/erpnext/public/js/education/lms/components/Navbar.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/ProfileInfo.vue b/erpnext/public/js/education/lms/components/ProfileInfo.vue deleted file mode 100644 index 5bad713997..0000000000 --- a/erpnext/public/js/education/lms/components/ProfileInfo.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/ProgramCard.vue b/erpnext/public/js/education/lms/components/ProgramCard.vue deleted file mode 100644 index 15a9fcdcd2..0000000000 --- a/erpnext/public/js/education/lms/components/ProgramCard.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/ProgressCard.vue b/erpnext/public/js/education/lms/components/ProgressCard.vue deleted file mode 100644 index 66b61f694e..0000000000 --- a/erpnext/public/js/education/lms/components/ProgressCard.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - diff --git a/erpnext/public/js/education/lms/components/Quiz.vue b/erpnext/public/js/education/lms/components/Quiz.vue deleted file mode 100644 index 0a6199a756..0000000000 --- a/erpnext/public/js/education/lms/components/Quiz.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - - - diff --git a/erpnext/public/js/education/lms/components/Quiz/QuizMultipleChoice.vue b/erpnext/public/js/education/lms/components/Quiz/QuizMultipleChoice.vue deleted file mode 100644 index 338b1ac0c5..0000000000 --- a/erpnext/public/js/education/lms/components/Quiz/QuizMultipleChoice.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/erpnext/public/js/education/lms/components/Quiz/QuizSingleChoice.vue b/erpnext/public/js/education/lms/components/Quiz/QuizSingleChoice.vue deleted file mode 100644 index 235cbce4ae..0000000000 --- a/erpnext/public/js/education/lms/components/Quiz/QuizSingleChoice.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/erpnext/public/js/education/lms/components/ScoreCard.vue b/erpnext/public/js/education/lms/components/ScoreCard.vue deleted file mode 100644 index 80b12cb6f6..0000000000 --- a/erpnext/public/js/education/lms/components/ScoreCard.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/erpnext/public/js/education/lms/components/TopSection.vue b/erpnext/public/js/education/lms/components/TopSection.vue deleted file mode 100644 index c27d0031ef..0000000000 --- a/erpnext/public/js/education/lms/components/TopSection.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/erpnext/public/js/education/lms/components/TopSectionButton.vue b/erpnext/public/js/education/lms/components/TopSectionButton.vue deleted file mode 100644 index 0fa49d4da5..0000000000 --- a/erpnext/public/js/education/lms/components/TopSectionButton.vue +++ /dev/null @@ -1,49 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/TopicCard.vue b/erpnext/public/js/education/lms/components/TopicCard.vue deleted file mode 100644 index 4cb8e85c3b..0000000000 --- a/erpnext/public/js/education/lms/components/TopicCard.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/Video.vue b/erpnext/public/js/education/lms/components/Video.vue deleted file mode 100644 index 50b4dd460d..0000000000 --- a/erpnext/public/js/education/lms/components/Video.vue +++ /dev/null @@ -1,63 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/VideoModal.vue b/erpnext/public/js/education/lms/components/VideoModal.vue deleted file mode 100644 index 71227ade2c..0000000000 --- a/erpnext/public/js/education/lms/components/VideoModal.vue +++ /dev/null @@ -1,35 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/components/YoutubePlayer.vue b/erpnext/public/js/education/lms/components/YoutubePlayer.vue deleted file mode 100644 index 9377b57d3b..0000000000 --- a/erpnext/public/js/education/lms/components/YoutubePlayer.vue +++ /dev/null @@ -1,36 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/lms.js b/erpnext/public/js/education/lms/lms.js deleted file mode 100644 index 4665b144c2..0000000000 --- a/erpnext/public/js/education/lms/lms.js +++ /dev/null @@ -1,81 +0,0 @@ -import Vue from 'vue/dist/vue.js'; -import VueRouter from 'vue-router/dist/vue-router.js'; -import moment from 'moment/min/moment.min.js'; - -import lmsRoot from "./lmsRoot.vue"; -import routes from './routes'; -import './call'; - -Vue.use(VueRouter); - -var store = { - enrolledPrograms: [], - enrolledCourses: [] -}; - -// let profile_page = ` LMS Profile ` -// document.querySelector('#website-post-login > ul').innerHTML += profile_page - -frappe.ready(() => { - frappe.provide('lms'); - - lms.moment = moment; - - lms.store = new Vue({ - data: store, - methods: { - updateEnrolledPrograms() { - if(this.checkLogin()) { - lms.call("get_program_enrollments").then(data => { - this.enrolledPrograms = data; - }); - } - }, - updateEnrolledCourses() { - if(this.checkLogin()) { - lms.call("get_all_course_enrollments").then(data => { - this.enrolledCourses = data; - }); - } - }, - checkLogin() { - return frappe.is_user_logged_in(); - }, - updateState() { - this.checkLogin(); - this.updateEnrolledPrograms(); - this.updateEnrolledCourses(); - }, - checkProgramEnrollment(programName) { - if(this.checkLogin()){ - if(this.enrolledPrograms) { - if(this.enrolledPrograms.includes(programName)) { - return true; - } - else { - return false; - } - } - else { - return false; - } - } - else { - return false; - } - } - } - }); - lms.view = new Vue({ - el: "#lms-app", - router: new VueRouter({ routes }), - template: "", - components: { lmsRoot }, - mounted() { - lms.store.updateState(); - } - }); - lms.view.$router.afterEach((to, from) => { - window.scrollTo(0,0); - }); -}); \ No newline at end of file diff --git a/erpnext/public/js/education/lms/lmsRoot.vue b/erpnext/public/js/education/lms/lmsRoot.vue deleted file mode 100644 index d359265c58..0000000000 --- a/erpnext/public/js/education/lms/lmsRoot.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/erpnext/public/js/education/lms/pages/ContentPage.vue b/erpnext/public/js/education/lms/pages/ContentPage.vue deleted file mode 100644 index 224ee03a4a..0000000000 --- a/erpnext/public/js/education/lms/pages/ContentPage.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/pages/CoursePage.vue b/erpnext/public/js/education/lms/pages/CoursePage.vue deleted file mode 100644 index dc3d13052b..0000000000 --- a/erpnext/public/js/education/lms/pages/CoursePage.vue +++ /dev/null @@ -1,49 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/pages/Home.vue b/erpnext/public/js/education/lms/pages/Home.vue deleted file mode 100644 index 6554a76587..0000000000 --- a/erpnext/public/js/education/lms/pages/Home.vue +++ /dev/null @@ -1,48 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/pages/ListPage.vue b/erpnext/public/js/education/lms/pages/ListPage.vue deleted file mode 100644 index cf5cecce9c..0000000000 --- a/erpnext/public/js/education/lms/pages/ListPage.vue +++ /dev/null @@ -1,53 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/pages/ProfilePage.vue b/erpnext/public/js/education/lms/pages/ProfilePage.vue deleted file mode 100644 index beff5eb34e..0000000000 --- a/erpnext/public/js/education/lms/pages/ProfilePage.vue +++ /dev/null @@ -1,50 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/pages/ProgramPage.vue b/erpnext/public/js/education/lms/pages/ProgramPage.vue deleted file mode 100644 index 415c861e81..0000000000 --- a/erpnext/public/js/education/lms/pages/ProgramPage.vue +++ /dev/null @@ -1,49 +0,0 @@ - - \ No newline at end of file diff --git a/erpnext/public/js/education/lms/quiz.js b/erpnext/public/js/education/lms/quiz.js new file mode 100644 index 0000000000..1b520eb9f5 --- /dev/null +++ b/erpnext/public/js/education/lms/quiz.js @@ -0,0 +1,186 @@ +class Quiz { + constructor(wrapper, options) { + this.wrapper = wrapper; + Object.assign(this, options); + this.questions = [] + this.refresh(); + } + + refresh() { + this.get_quiz(); + } + + get_quiz() { + frappe.call('erpnext.education.utils.get_quiz', { + quiz_name: this.name, + course: this.course + }).then(res => { + this.make(res.message) + }); + } + + make(data) { + data.questions.forEach(question_data => { + let question_wrapper = document.createElement('div'); + let question = new Question({ + wrapper: question_wrapper, + ...question_data + }); + this.questions.push(question) + this.wrapper.appendChild(question_wrapper); + }) + if (data.activity.is_complete) { + this.disable() + let indicator = 'red' + let message = 'Your are not allowed to attempt the quiz again.' + if (data.activity.result == 'Pass') { + indicator = 'green' + message = 'You have already cleared the quiz.' + } + + this.set_quiz_footer(message, indicator, data.activity.score) + } + else { + this.make_actions(); + } + } + + make_actions() { + const button = document.createElement("button"); + button.classList.add("btn", "btn-primary", "mt-5", "mr-2"); + + button.id = 'submit-button'; + button.innerText = 'Submit'; + button.onclick = () => this.submit(); + this.submit_btn = button + this.wrapper.appendChild(button); + } + + submit() { + this.submit_btn.innerText = 'Evaluating..' + this.submit_btn.disabled = true + this.disable() + frappe.call('erpnext.education.utils.evaluate_quiz', { + quiz_name: this.name, + quiz_response: this.get_selected(), + course: this.course, + program: this.program + }).then(res => { + this.submit_btn.remove() + if (!res.message) { + frappe.throw("Something went wrong while evaluating the quiz.") + } + + let indicator = 'red' + let message = 'Fail' + if (res.message.status == 'Pass') { + indicator = 'green' + message = 'Congratulations, you cleared the quiz.' + } + + this.set_quiz_footer(message, indicator, res.message.score) + }); + } + + set_quiz_footer(message, indicator, score) { + const div = document.createElement("div"); + div.classList.add("mt-5"); + div.innerHTML = `
+
+

${message}

+
Score: ${score}/100
+
+ +
` + + this.wrapper.appendChild(div) + } + + disable() { + this.questions.forEach(que => que.disable()) + } + + get_selected() { + let que = {} + this.questions.forEach(question => { + que[question.name] = question.get_selected() + }) + return que + } +} + +class Question { + constructor(opts) { + Object.assign(this, opts); + this.make(); + } + + make() { + this.make_question() + this.make_options() + } + + get_selected() { + let selected = this.options.filter(opt => opt.input.checked) + if (this.type == 'Single Correct Answer') { + if (selected[0]) return selected[0].name + } + if (this.type == 'Multiple Correct Answer') { + return selected.map(opt => opt.name) + } + return null + } + + disable() { + let selected = this.options.forEach(opt => opt.input.disabled = true) + } + + make_question() { + let question_wrapper = document.createElement('h5'); + question_wrapper.classList.add('mt-3'); + question_wrapper.innerText = this.question; + this.wrapper.appendChild(question_wrapper); + } + + make_options() { + let make_input = (name, value) => { + let input = document.createElement('input'); + input.id = name; + input.name = this.name; + input.value = value; + input.type = 'radio'; + if (this.type == 'Multiple Correct Answer') + input.type = 'checkbox'; + input.classList.add('form-check-input'); + return input; + } + + let make_label = function(name, value) { + let label = document.createElement('label'); + label.classList.add('form-check-label'); + label.htmlFor = name; + label.innerText = value; + return label + } + + let make_option = function (wrapper, option) { + let option_div = document.createElement('div') + option_div.classList.add('form-check', 'pb-1') + let input = make_input(option.name, option.option); + let label = make_label(option.name, option.option); + option_div.appendChild(input) + option_div.appendChild(label) + wrapper.appendChild(option_div) + return {input: input, ...option} + } + + let options_wrapper = document.createElement('div') + options_wrapper.classList.add('ml-2') + let option_list = [] + this.options.forEach(opt => option_list.push(make_option(options_wrapper, opt))) + this.options = option_list + this.wrapper.appendChild(options_wrapper) + } +} \ No newline at end of file diff --git a/erpnext/public/js/education/lms/routes.js b/erpnext/public/js/education/lms/routes.js deleted file mode 100644 index 483f2220c3..0000000000 --- a/erpnext/public/js/education/lms/routes.js +++ /dev/null @@ -1,92 +0,0 @@ -import Home from "./pages/Home.vue"; -import ProgramPage from "./pages/ProgramPage.vue"; -import CoursePage from "./pages/CoursePage.vue"; -import ContentPage from "./pages/ContentPage.vue"; -import ListPage from "./pages/ListPage.vue"; -import ProfilePage from "./pages/ProfilePage.vue"; - -const routes = [{ - name: 'home', - path: '', - component: Home -}, -{ - name: 'program', - path: '/Program/:program_name', - component: ProgramPage, - props: true -}, -{ - name: 'course', - path: '/Program/:program_name/:course_name/', - component: CoursePage, - props: true, -}, -{ - name: 'content', - path: '/Program/:program_name/:course_name/:topic/:type/:content', - component: ContentPage, - props: true, - beforeRouteUpdate (to, from, next) { - if (lms.store.checkProgramEnrollment(to.params.program_name)) { - next(); - } else { - next({ - name: 'program', - params: { - program_name: to.params.program_name - } - }); - } - } -}, -{ - name: 'list', - path: '/List/:master', - component: ListPage, - props: true -}, -{ - name: 'signup', - path: '/Signup', - beforeEnter(to, from, next) { - window.location = window.location.origin.toString() + '/login#signup'; - }, - component: Home, - props: true -}, -{ - name: 'login', - path: '/Login', - beforeEnter(to, from, next) { - window.location = window.location.origin.toString() + '/login#login'; - }, - component: Home, - props: true -}, -{ - name: 'logout', - path: '/Logout', - beforeEnter(to, from, next) { - window.location = window.location.origin.toString() + '/?cmd=web_logout'; - }, - component: Home, - props: true -}, -{ - name: 'profile', - path: '/Profile', - component: ProfilePage, - props: true, - beforeEnter: (to, from, next) => { - if (!lms.store.checkLogin()) { - next({ - name: 'home' - }); - } else { - next(); - } - } -}]; - -export default routes; \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.js b/erpnext/quality_management/doctype/customer_feedback/customer_feedback.js deleted file mode 100644 index 16ae9a1e82..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2018, Frappe and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Customer Feedback', { - onload: function(frm){ - frm.set_value("date", frappe.datetime.get_today()); - $(".grid-add-row").hide(); - frm.refresh(); - }, - template: function(frm){ // Used to fetch the parameters of the selected feedback template - frm.fields_dict.feedback.grid.remove_all(); - if(frm.doc.template){ - frappe.call({ - "method": "frappe.client.get", - args: { - doctype: "Customer Feedback Template", - name: frm.doc.template - }, - callback: function (data) { - for (var i = 0; i < data.message.feedback_parameter.length; i++ ){ - frm.add_child("feedback"); - frm.fields_dict.feedback.get_value()[i].parameter = data.message.feedback_parameter[i].parameter; - } - frm.refresh(); - } - }); - } - } -}); diff --git a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.json b/erpnext/quality_management/doctype/customer_feedback/customer_feedback.json deleted file mode 100644 index ffa7e4d924..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "QMS-FDBK-.#####", - "beta": 0, - "creation": "2018-10-02 12:23:38.437696", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "customer", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Customer", - "length": 0, - "no_copy": 0, - "options": "Customer", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "template", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Template", - "length": 0, - "no_copy": 0, - "options": "Customer Feedback Template", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "feedback_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Feedback", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "template.feedback_values", - "fieldname": "feedback", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "feedback", - "length": 0, - "no_copy": 0, - "options": "Customer Feedback Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-12 14:39:18.044191", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Customer Feedback", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.py b/erpnext/quality_management/doctype/customer_feedback/customer_feedback.py deleted file mode 100644 index 6211c42c66..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/customer_feedback.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -from frappe.model.document import Document - -class CustomerFeedback(Document): - pass \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/customer_feedback_dashboard.py b/erpnext/quality_management/doctype/customer_feedback/customer_feedback_dashboard.py deleted file mode 100644 index 44ae12347d..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/customer_feedback_dashboard.py +++ /dev/null @@ -1,12 +0,0 @@ -from frappe import _ - -def get_data(): - return { - 'fieldname': 'feedback', - 'transactions': [ - { - 'label': _('Action'), - 'items': ['Quality Action'] - } - ], - } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/customer_feedback_list.js b/erpnext/quality_management/doctype/customer_feedback/customer_feedback_list.js deleted file mode 100644 index 7c5f767841..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/customer_feedback_list.js +++ /dev/null @@ -1,11 +0,0 @@ -frappe.listview_settings['Customer Feedback'] = { - add_fields: ["action"], - get_indicator: function(doc) { - if(doc.action == "No Action") { - return [__("No Action"), "green", "action,=,No Action"]; - } - else if(doc.action == "Action Initialised") { - return [__("Action Initialised"), "red", "action,=,Action Initialised"]; - } - } -}; \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.js b/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.js deleted file mode 100644 index 1003ee54f4..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Customer Feedback", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Customer Survey - () => frappe.tests.make('Customer Feedback', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.py b/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.py deleted file mode 100644 index b5d6141938..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback/test_customer_feedback.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest -from erpnext.quality_management.doctype.customer_feedback_template.test_customer_feedback_template import create_template -class TestCustomerFeedback(unittest.TestCase): - def test_customer_feedback(self): - create_template() - test_create_feedback = create_feedback() - test_get_feedback = get_feedback() - self.assertEquals(test_create_feedback.name, test_get_feedback.name) - -def create_feedback(): - feedback = frappe.get_doc({ - "doctype": "Customer Feedback", - "template": "FDBK-TMPL-_Test Customer Feedback Template", - "date": ""+ frappe.utils.nowdate() +"" - }) - feedback_exist = frappe.get_list("Customer Feedback", filters={"date": ""+ feedback.date +""}, limit=1) - if len(feedback_exist) == 0: - feedback.insert() - return feedback - else: - return feedback_exist[0] - -def get_feedback(): - feedback = frappe.get_list("Customer Feedback", limit=1) - return feedback[0] \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.json b/erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.json deleted file mode 100644 index b9516b2f3d..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-15 15:36:27.193355", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Parameter", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "rating", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Rating", - "length": 0, - "no_copy": 0, - "options": "1\n2\n3\n4\n5", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "fieldname": "qualitative_feedback", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Qualitative Feedback", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-01 14:29:03.273927", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Customer Feedback Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.js b/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.js deleted file mode 100644 index e318bf7281..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.js +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) 2018, Frappe and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Customer Feedback Template', { -}); diff --git a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.json b/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.json deleted file mode 100644 index 1d1e34447b..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.json +++ /dev/null @@ -1,259 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:FDBK-TMPL-{template}", - "beta": 0, - "creation": "2018-10-18 15:11:26.215480", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "template", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Template", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "scope", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Scope", - "length": 0, - "no_copy": 0, - "options": "Company\nDepartment", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.scope == 'Department'", - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "feedback_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Feedback", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "feedback_parameter", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Feedback", - "length": 0, - "no_copy": 0, - "options": "Customer Feedback Template Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-01 14:27:07.935761", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Customer Feedback Template", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, - "write": 1 - } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.js b/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.js deleted file mode 100644 index 77168e0377..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Customer Feedback Template", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Customer Feedback Template - () => frappe.tests.make('Customer Feedback Template', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.py b/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.py deleted file mode 100644 index 2bc4334c70..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_template/test_customer_feedback_template.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -class TestCustomerFeedbackTemplate(unittest.TestCase): - def test_customer_feedback_template(self): - test_create_template = create_template() - test_get_template = get_template() - self.assertEquals(test_get_template.name, test_create_template.name) - -def create_template(): - template = frappe.get_doc({ - "doctype": "Customer Feedback Template", - "template": "_Test Customer Feedback Template", - "scope": "Company", - "feedback_parameter": [ - { - "parameter": "_Test Customer Feedback Template Parameter", - } - ] - }) - template_exist = frappe.get_list("Customer Feedback Template", filters={"template": ""+ template.template +""}, fields=["name"], limit=1) - if len(template_exist) == 0: - template.insert() - return template - else: - return template_exist[0] - -def get_template(): - template = frappe.get_list("Customer Feedback Template", filters={"template": "_Test Customer Feedback Template"}, limit=1) - return template[0] \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.json b/erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.json deleted file mode 100644 index d28bb5d93a..0000000000 --- a/erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-18 15:23:03.854925", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Parameter", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-01 14:28:50.626709", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Customer Feedback Template Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action/quality_action.js b/erpnext/quality_management/doctype/quality_action/quality_action.js index 8cf8aa9136..70782477f0 100644 --- a/erpnext/quality_management/doctype/quality_action/quality_action.js +++ b/erpnext/quality_management/doctype/quality_action/quality_action.js @@ -5,83 +5,29 @@ frappe.ui.form.on('Quality Action', { onload: function(frm) { frm.set_value("date", frappe.datetime.get_today()); frm.refresh(); - $(".grid-add-row").hide(); - if (frm.doc.review){ - frm.set_value("type", "Quality Review"); - } - else{ - frm.set_value("type", "Customer Feedback"); - } }, - review: function(frm){ - frm.fields_dict.description.grid.remove_all(); - if(frm.doc.review){ - var problems = ""; - frappe.call({ - "method": "frappe.client.get", - args: { - doctype: "Quality Review", - name: frm.doc.review - }, - callback: function (data) { - for (var i = 0; i < data.message.values.length; i++){ - if (data.message.values[i].achieved < data.message.values[i].target){ - problems += data.message.values[i].objective +"-"+ data.message.values[i].achieved + " " + data.message.values[i].unit + "\n"; - } - } - problems= problems.replace(/\n$/, "").split("\n"); - for (i = 0; i < problems.length; i++){ - frm.add_child("description"); - frm.fields_dict.description.get_value()[i].problem = problems[i]; - } - frm.refresh(); + document_name: function(frm){ + frappe.call({ + "method": "frappe.client.get", + args: { + doctype: frm.doc.document_type, + name: frm.doc.document_name + }, + callback: function(data){ + frm.fields_dict.resolutions.grid.remove_all(); + let objectives = []; + + if(frm.doc.document_type === "Quality Review"){ + for(let i in data.message.reviews) objectives.push(data.message.reviews[i].review); + } else { + for(let j in data.message.parameters) objectives.push(data.message.parameters[j].feedback); } - }); - frappe.call({ - "method": "frappe.client.get", - args: { - doctype: "Quality Goal", - name: frm.doc.goal - }, - callback: function (data) { - frm.doc.procedure = data.message.procedure; - frm.refresh(); + for (var objective in objectives){ + frm.add_child("resolutions"); + frm.fields_dict.resolutions.get_value()[objective].problem = objectives[objective]; } - }); - } - else{ - frm.doc.goal = ''; - frm.doc.procedure = ''; - frm.refresh(); - } + frm.refresh(); + } + }); }, - feedback: function(frm) { - frm.fields_dict.description.grid.remove_all(); - if(frm.doc.feedback){ - frappe.call({ - "method": "frappe.client.get", - args: { - doctype: "Customer Feedback", - name: frm.doc.feedback - }, - callback: function(data){ - for (var i = 0; i < data.message.feedback.length; i++ ){ - frm.add_child("description"); - frm.fields_dict.description.get_value()[i].problem = data.message.feedback[i].parameter +"-"+ data.message.feedback[i].qualitative_feedback; - } - frm.refresh(); - } - }); - } - }, - type: function(frm){ - if(frm.doc.description){ - frm.fields_dict.description.grid.remove_all(); - frm.doc.review = ''; - frm.doc.feedback = ''; - frm.doc.goal = ''; - frm.doc.procedure = ''; - frm.refresh(); - } - } }); \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action/quality_action.json b/erpnext/quality_management/doctype/quality_action/quality_action.json index e564a56ed5..8835b479cc 100644 --- a/erpnext/quality_management/doctype/quality_action/quality_action.json +++ b/erpnext/quality_management/doctype/quality_action/quality_action.json @@ -1,493 +1,125 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:QMS-ACTN-{#####}", - "beta": 0, - "creation": "2018-10-02 11:40:43.666100", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "format:ACTN-{#####}", + "creation": "2018-10-02 11:40:43.666100", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "corrective_preventive", + "document_type", + "goal", + "cb_00", + "date", + "document_name", + "procedure", + "status", + "sb_00", + "resolutions" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "action", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Corrective/Preventive", - "length": 0, - "no_copy": 0, - "options": "Corrective\nPreventive", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.type == 'Quality Review'", + "fetch_from": "review.goal", + "fieldname": "goal", + "fieldtype": "Link", + "label": "Goal", + "options": "Quality Goal", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.type == 'Quality Review'", - "fieldname": "review", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Review", - "length": 0, - "no_copy": 0, - "options": "Quality Review", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.type == 'Customer Feedback'", - "fieldname": "feedback", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Feedback", - "length": 0, - "no_copy": 0, - "options": "Customer Feedback", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:doc.type == 'Quality Review'", + "fieldname": "procedure", + "fieldtype": "Link", + "label": "Procedure", + "options": "Quality Procedure", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.type == 'Quality Review'", - "fetch_from": "review.goal", - "fieldname": "goal", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Quality Goal", - "length": 0, - "no_copy": 0, - "options": "Quality Goal", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Status", + "options": "Open\nClosed" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_3", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "document_name", + "fieldtype": "Dynamic Link", + "label": "Document Name", + "options": "document_type" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Type", - "length": 0, - "no_copy": 0, - "options": "Quality Review\nCustomer Feedback", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "document_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Document Type", + "options": "Quality Review\nQuality Feedback", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "Corrective", + "fieldname": "corrective_preventive", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Corrective/Preventive", + "options": "Corrective\nPreventive", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.type == 'Quality Review'", - "fetch_from": "", - "fieldname": "procedure", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Resolution" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Under Review", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Under Review\nClose", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "problem_resolution", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "description", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Action Description", - "length": 0, - "no_copy": 0, - "options": "Quality Action Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "resolutions", + "fieldtype": "Table", + "label": "Resolutions", + "options": "Quality Action Resolution" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-12 14:27:07.724362", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Action", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-28 13:10:44.092497", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Action", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action/quality_action.py b/erpnext/quality_management/doctype/quality_action/quality_action.py index 620252e299..88d4bd844a 100644 --- a/erpnext/quality_management/doctype/quality_action/quality_action.py +++ b/erpnext/quality_management/doctype/quality_action/quality_action.py @@ -3,18 +3,8 @@ # For license information, please see license.txt from __future__ import unicode_literals +import frappe from frappe.model.document import Document class QualityAction(Document): - def validate(self): - status_flag = '' - for value in self.description: - if value.resolution == None: - value.status = 'Open' - status_flag = 'Under Review' - else: - value.status = 'Close' - if status_flag == 'Under Review': - self.status = 'Under Review' - else: - self.status = 'Close' \ No newline at end of file + pass \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action/quality_action_list.js b/erpnext/quality_management/doctype/quality_action/quality_action_list.js deleted file mode 100644 index da6b65d907..0000000000 --- a/erpnext/quality_management/doctype/quality_action/quality_action_list.js +++ /dev/null @@ -1,11 +0,0 @@ -frappe.listview_settings['Quality Action'] = { - add_fields: ["status"], - get_indicator: function(doc) { - if(doc.status == "Planned") { - return [__("Planned"), "green", "status,=,Planned"]; - } - else{ - return [__("Under Review"), "red", "status,=,Under Review"]; - } - } -}; \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action/test_quality_action.py b/erpnext/quality_management/doctype/quality_action/test_quality_action.py index c47955cb52..51178d6225 100644 --- a/erpnext/quality_management/doctype/quality_action/test_quality_action.py +++ b/erpnext/quality_management/doctype/quality_action/test_quality_action.py @@ -19,28 +19,28 @@ class TestQualityAction(unittest.TestCase): create_review() test_create_action = create_action() test_get_action = get_action() - self.assertEquals(test_create_action.name, test_get_action.name) - self.assertEquals(test_create_action.goal, test_get_action.goal) + + self.assertEquals(test_create_action, test_get_action) def create_action(): - review = frappe.get_list("Quality Review", limit=1) + review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}) action = frappe.get_doc({ - 'doctype': 'Quality Action', - 'action': 'Corrective', - 'type': 'Quality Review', - 'review': ''+ review[0].name +'', - 'date': ''+ frappe.utils.nowdate() +'', - 'goal': '_Test Quality Goal', - 'procedure': '_Test Quality Procedure' + "doctype": "Quality Action", + "action": "Corrective", + "document_type": "Quality Review", + "document_name": review, + "date": frappe.utils.nowdate(), + "goal": "GOAL-_Test Quality Goal", + "procedure": "PRC-_Test Quality Procedure" }) - action_exist = frappe.get_list("Quality Action", filters={"review": ""+ review[0].name +""}, fields=["name", "goal"], limit=1) - if len(action_exist) == 0: + action_exist = frappe.db.exists("Quality Action", {"review": review}) + + if not action_exist: action.insert() - return action + return action.name else: - return action_exist[0] + return action_exist def get_action(): - review = frappe.get_list("Quality Review", limit=1) - action = frappe.get_list("Quality Action", filters={"review": ""+ review[0].name +""}, fields=["name", "goal"], limit=1) - return action[0] \ No newline at end of file + review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}) + return frappe.db.exists("Quality Action", {"document_name": review}) \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback/__init__.py b/erpnext/quality_management/doctype/quality_action_resolution/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/customer_feedback/__init__.py rename to erpnext/quality_management/doctype/quality_action_resolution/__init__.py diff --git a/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.json b/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.json new file mode 100644 index 0000000000..74370cc3ef --- /dev/null +++ b/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.json @@ -0,0 +1,40 @@ +{ + "creation": "2019-05-26 20:36:44.337186", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "problem", + "sb_00", + "resolution" + ], + "fields": [ + { + "fieldname": "problem", + "fieldtype": "Long Text", + "in_list_view": 1, + "label": "Problem" + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break" + }, + { + "fieldname": "resolution", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Resolution" + } + ], + "istable": 1, + "modified": "2019-05-28 13:09:50.435323", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Action Resolution", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.py b/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.py new file mode 100644 index 0000000000..de8873feb0 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_action_resolution/quality_action_resolution.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class QualityActionResolution(Document): + pass diff --git a/erpnext/quality_management/doctype/quality_action_table/quality_action_table.json b/erpnext/quality_management/doctype/quality_action_table/quality_action_table.json deleted file mode 100644 index a5f7fb6702..0000000000 --- a/erpnext/quality_management/doctype/quality_action_table/quality_action_table.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-15 15:36:53.624990", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "problem", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Problem", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "resolution", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Resolution", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Open\nClose", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "responsible", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Responsible", - "length": 0, - "no_copy": 0, - "options": "Role", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "completion_date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Completion Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-12 14:33:46.260600", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Action Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_table/__init__.py b/erpnext/quality_management/doctype/quality_feedback/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/customer_feedback_table/__init__.py rename to erpnext/quality_management/doctype/quality_feedback/__init__.py diff --git a/erpnext/quality_management/doctype/quality_feedback/quality_feedback.js b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.js new file mode 100644 index 0000000000..63747afb3f --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.js @@ -0,0 +1,25 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Quality Feedback', { + refresh: function(frm) { + frm.set_value("date", frappe.datetime.get_today()); + }, + template: function(frm){ + frappe.call({ + "method": "frappe.client.get", + args: { + doctype: "Quality Feedback Template", + name: frm.doc.template + }, + callback: function(data){ + frm.fields_dict.parameters.grid.remove_all(); + for (var i in data.message.parameters){ + frm.add_child("parameters"); + frm.fields_dict.parameters.get_value()[i].parameter = data.message.parameters[i].parameter; + } + frm.refresh(); + } + }); + } +}); diff --git a/erpnext/quality_management/doctype/quality_feedback/quality_feedback.json b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.json new file mode 100644 index 0000000000..460438af62 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.json @@ -0,0 +1,95 @@ +{ + "autoname": "format:FDBK-{#####}", + "creation": "2019-05-26 21:23:05.308379", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "document_type", + "template", + "cb_00", + "document_name", + "date", + "sb_00", + "parameters" + ], + "fields": [ + { + "fieldname": "template", + "fieldtype": "Link", + "label": "Template", + "options": "Quality Feedback Template", + "reqd": 1 + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date", + "read_only": 1 + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break" + }, + { + "fetch_from": "template.feedback_values", + "fieldname": "parameters", + "fieldtype": "Table", + "label": "Parameters", + "options": "Quality Feedback Parameter" + }, + { + "fieldname": "document_type", + "fieldtype": "Select", + "label": "Type", + "options": "User\nCustomer", + "reqd": 1 + }, + { + "fieldname": "document_name", + "fieldtype": "Dynamic Link", + "label": "Name", + "options": "document_type", + "reqd": 1 + } + ], + "modified": "2019-05-28 15:16:01.161662", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Feedback", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.py b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py similarity index 58% rename from erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.py rename to erpnext/quality_management/doctype/quality_feedback/quality_feedback.py index 7f2eb3d29c..9894181004 100644 --- a/erpnext/quality_management/doctype/customer_feedback_template/customer_feedback_template.py +++ b/erpnext/quality_management/doctype/quality_feedback/quality_feedback.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals +import frappe from frappe.model.document import Document -class CustomerFeedbackTemplate(Document): +class QualityFeedback(Document): pass \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py new file mode 100644 index 0000000000..3be1eb2791 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from erpnext.quality_management.doctype.quality_feedback_template.test_quality_feedback_template import create_template + +class TestQualityFeedback(unittest.TestCase): + + def test_quality_feedback(self): + create_template() + test_create_feedback = create_feedback() + test_get_feedback = get_feedback() + + self.assertEqual(test_create_feedback, test_get_feedback) + +def create_feedback(): + create_customer() + + feedabck = frappe.get_doc({ + "doctype": "Quality Feedback", + "template": "TMPL-_Test Feedback Template", + "document_type": "Customer", + "document_name": "Quality Feedback Customer", + "date": frappe.utils.nowdate(), + "parameters": [ + { + "parameter": "Test Parameter", + "rating": 3, + "feedback": "Test Feedback" + } + ] + }) + + feedback_exists = frappe.db.exists("Quality Feedback", {"template": "TMPL-_Test Feedback Template"}) + + if not feedback_exists: + feedabck.insert() + return feedabck.name + else: + return feedback_exists + +def get_feedback(): + return frappe.db.exists("Quality Feedback", {"template": "TMPL-_Test Feedback Template"}) + +def create_customer(): + if not frappe.db.exists("Customer", {"customer_name": "Quality Feedback Customer"}): + customer = frappe.get_doc({ + "doctype": "Customer", + "customer_name": "Quality Feedback Customer" + }).insert(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template/__init__.py b/erpnext/quality_management/doctype/quality_feedback_parameter/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/customer_feedback_template/__init__.py rename to erpnext/quality_management/doctype/quality_feedback_parameter/__init__.py diff --git a/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.json b/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.json new file mode 100644 index 0000000000..d0b368f293 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.json @@ -0,0 +1,57 @@ +{ + "creation": "2019-05-26 21:25:01.715807", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "parameter", + "cb_00", + "rating", + "sb_00", + "feedback" + ], + "fields": [ + { + "fieldname": "parameter", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Parameter", + "read_only": 1 + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "default": "1", + "fieldname": "rating", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Rating", + "options": "1\n2\n3\n4\n5", + "reqd": 1 + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break" + }, + { + "fieldname": "feedback", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Feedback", + "reqd": 1 + } + ], + "istable": 1, + "modified": "2019-05-26 21:50:48.951264", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Feedback Parameter", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.py b/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.py new file mode 100644 index 0000000000..d652e8a57b --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_parameter/quality_feedback_parameter.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class QualityFeedbackParameter(Document): + pass diff --git a/erpnext/quality_management/doctype/customer_feedback_template_table/__init__.py b/erpnext/quality_management/doctype/quality_feedback_template/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/customer_feedback_template_table/__init__.py rename to erpnext/quality_management/doctype/quality_feedback_template/__init__.py diff --git a/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.js b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.js new file mode 100644 index 0000000000..490eed9706 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Quality Feedback Template', { + // refresh: function(frm) { + + // } +}); diff --git a/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.json b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.json new file mode 100644 index 0000000000..31efd04682 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.json @@ -0,0 +1,59 @@ +{ + "autoname": "format:TMPL-{template}", + "creation": "2019-05-26 21:17:24.283061", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "template", + "cb_00", + "sb_00", + "parameters" + ], + "fields": [ + { + "fieldname": "template", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Template", + "reqd": 1 + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break" + }, + { + "fieldname": "parameters", + "fieldtype": "Table", + "label": "Parameters", + "options": "Quality Feedback Template Parameter" + } + ], + "modified": "2019-05-26 21:48:47.770610", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Feedback Template", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.py b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.py new file mode 100644 index 0000000000..0c6dfc0780 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template/quality_feedback_template.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class QualityFeedbackTemplate(Document): + pass diff --git a/erpnext/quality_management/doctype/quality_feedback_template/test_quality_feedback_template.py b/erpnext/quality_management/doctype/quality_feedback_template/test_quality_feedback_template.py new file mode 100644 index 0000000000..36dbe137a5 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template/test_quality_feedback_template.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestQualityFeedbackTemplate(unittest.TestCase): + + def test_quality_feedback_template(self): + test_create_template = create_template() + test_get_template = get_template() + + self.assertEqual(test_create_template, test_get_template) + +def create_template(): + template = frappe.get_doc({ + "doctype": "Quality Feedback Template", + "template": "_Test Feedback Template", + "parameters": [ + { + "parameter": "Test Parameter" + } + ] + }) + + template_exists = frappe.db.exists("Quality Feedback Template", {"template": "_Test Feedback Template"}) + + if not template_exists: + template.insert() + return template.name + else: + return template_exists + +def get_template(): + return frappe.db.exists("Quality Feedback Template", {"template": "_Test Feedback Template"}) \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action_table/__init__.py b/erpnext/quality_management/doctype/quality_feedback_template_parameter/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/quality_action_table/__init__.py rename to erpnext/quality_management/doctype/quality_feedback_template_parameter/__init__.py diff --git a/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.json b/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.json new file mode 100644 index 0000000000..02a9b03b50 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.json @@ -0,0 +1,28 @@ +{ + "creation": "2019-05-26 21:20:40.520197", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "parameter" + ], + "fields": [ + { + "fieldname": "parameter", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Parameter" + } + ], + "istable": 1, + "modified": "2019-05-26 21:23:53.574743", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Feedback Template Parameter", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.py b/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.py new file mode 100644 index 0000000000..3f3348fd7f --- /dev/null +++ b/erpnext/quality_management/doctype/quality_feedback_template_parameter/quality_feedback_template_parameter.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class QualityFeedbackTemplateParameter(Document): + pass diff --git a/erpnext/quality_management/doctype/quality_goal/quality_goal.js b/erpnext/quality_management/doctype/quality_goal/quality_goal.js index 3bb6e12e3a..ff58c5ad21 100644 --- a/erpnext/quality_management/doctype/quality_goal/quality_goal.js +++ b/erpnext/quality_management/doctype/quality_goal/quality_goal.js @@ -2,40 +2,7 @@ // For license information, please see license.txt frappe.ui.form.on('Quality Goal', { - onload: function(frm){ - if(frm.doc.measurable == "No"){ - hide_target_unit(frm); - } - else{ - show_target_unit(frm); - } - }, - revision: function(frm) { - if(!frm.doc.revised_on){ - frm.set_value("revised_on", frappe.datetime.get_today()); - } - }, - measurable: function(frm) { - frm.fields_dict.objective.grid.remove_all(); - if(frm.doc.measurable == "No"){ - hide_target_unit(frm); - } - else{ - show_target_unit(frm); - } + refresh: function(frm) { + frm.doc.created_by = frappe.session.user; } }); - -function hide_target_unit(frm){ - // hides target and unit columns as the goal cannot be measured in numeric values - frm.fields_dict.objective.grid.docfields[1].hidden = 1; - frm.fields_dict.objective.grid.docfields[2].hidden = 1; - frm.refresh(); -} - -function show_target_unit(frm){ - // shows target and unit columns as the goal can be measured in numeric values - frm.fields_dict.objective.grid.docfields[1].hidden = 0; - frm.fields_dict.objective.grid.docfields[2].hidden = 0; - frm.refresh(); -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_goal/quality_goal.json b/erpnext/quality_management/doctype/quality_goal/quality_goal.json index 93f1bd142c..c32610948e 100644 --- a/erpnext/quality_management/doctype/quality_goal/quality_goal.json +++ b/erpnext/quality_management/doctype/quality_goal/quality_goal.json @@ -1,824 +1,149 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:{goal}", - "beta": 0, - "creation": "2018-10-02 12:17:41.727541", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "format:GOAL-{goal}", + "creation": "2018-10-02 12:17:41.727541", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "goal", + "frequency", + "created_by", + "cb_00", + "procedure", + "weekday", + "quarter", + "date", + "sb_00", + "revision", + "cb_01", + "revised_on", + "sb_01", + "objectives" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "goal", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "created_by", + "fieldtype": "Link", + "label": "Created By", + "options": "User", + "read_only": 1 + }, + { + "default": "None", + "fieldname": "frequency", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Monitoring Frequency", + "options": "None\nDaily\nWeekly\nMonthly\nQuarterly" + }, + { + "fieldname": "procedure", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Procedure", + "options": "Quality Procedure" + }, + { + "depends_on": "eval:doc.frequency == 'Monthly' || doc.frequency == 'Quarterly';", + "fieldname": "date", + "fieldtype": "Select", + "label": "Date", + "options": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30" + }, + { + "default": "0", + "fieldname": "revision", + "fieldtype": "Int", + "label": "Revision", + "read_only": 1 + }, + { + "fieldname": "revised_on", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Revised On", + "read_only": 1 + }, + { + "depends_on": "eval:doc.frequency == 'Weekly';", + "fieldname": "weekday", + "fieldtype": "Select", + "label": "Weekday", + "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday" + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Revision and Revised On" + }, + { + "fieldname": "cb_01", + "fieldtype": "Column Break" + }, + { + "fieldname": "sb_01", + "fieldtype": "Section Break", + "label": "Objectives" + }, + { + "fieldname": "objectives", + "fieldtype": "Table", + "label": "Objectives", + "options": "Quality Goal Objective" + }, + { + "fieldname": "goal", + "fieldtype": "Data", + "label": "Goal", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "created_by", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Created By", - "length": 0, - "no_copy": 0, - "options": "User", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "None", - "fieldname": "frequency", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Monitoring Frequency", - "length": 0, - "no_copy": 0, - "options": "None\nDaily\nWeekly\nMonthly\nQuarterly\nHalf Yearly\nYearly", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "January-April-July-October", - "depends_on": "eval:doc.frequency == 'Quarterly'", - "fieldname": "quarterly", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Day", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "January-July", - "depends_on": "eval:doc.frequency == 'Half Yearly'", - "fieldname": "half", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Day", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "January", - "depends_on": "eval:doc.frequency == 'Yearly'", - "fieldname": "yearly", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Day", - "length": 0, - "no_copy": 0, - "options": "January\nFebruary\nMarch\nApril\nMay\nJune\nJuly\nAugust\nSeptember\nOctober\nNovember\nDecember", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "procedure", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "scope", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Scope", - "length": 0, - "no_copy": 0, - "options": "Company\nDepartment", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.frequency == 'Daily'", - "fieldname": "daily", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Day", - "length": 0, - "no_copy": 0, - "options": "Everyday", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.frequency == 'Weekly'", - "fieldname": "weekly", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Day", - "length": 0, - "no_copy": 0, - "options": "Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.frequency == 'Quarterly' || doc.frequency == 'Half Yearly' || doc.frequency == 'Yearly' || doc.frequency == 'Monthly'", - "fieldname": "date", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Date", - "length": 0, - "no_copy": 0, - "options": "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.scope == 'Department'", - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_8", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Revision and Revised On", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "revision", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Revision", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "revised_on", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Revised On", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "measurable_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Measurable Goal", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Yes", - "fieldname": "measurable", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Measurable Goal", - "length": 0, - "no_copy": 0, - "options": "Yes\nNo", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_20", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Target and Unit are disabled", - "depends_on": "eval:doc.measurable == 'No'", - "fieldname": "measurable_display", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Measurable", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_11", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Goal Objectives", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "objective", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Objective", - "length": 0, - "no_copy": 0, - "options": "Quality Objective", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "default": "January-April-July-October", + "depends_on": "eval:doc.frequency == 'Quarterly';", + "fieldname": "quarter", + "fieldtype": "Select", + "label": "Quarter", + "options": "January-April-July-October", + "read_only": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-12 14:35:18.498549", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Goal", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-28 14:49:12.768863", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Goal", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_goal/quality_goal.py b/erpnext/quality_management/doctype/quality_goal/quality_goal.py index 236c72ae87..4ae015e4a1 100644 --- a/erpnext/quality_management/doctype/quality_goal/quality_goal.py +++ b/erpnext/quality_management/doctype/quality_goal/quality_goal.py @@ -3,8 +3,12 @@ # For license information, please see license.txt from __future__ import unicode_literals +import frappe + from frappe.model.document import Document class QualityGoal(Document): - pass + def validate(self): + self.revision += 1 + self.revised_on = frappe.utils.today() diff --git a/erpnext/quality_management/doctype/quality_goal/quality_goal_dashboard.py b/erpnext/quality_management/doctype/quality_goal/quality_goal_dashboard.py index 0acc1daf89..22af3c0f74 100644 --- a/erpnext/quality_management/doctype/quality_goal/quality_goal_dashboard.py +++ b/erpnext/quality_management/doctype/quality_goal/quality_goal_dashboard.py @@ -1,16 +1,12 @@ from frappe import _ def get_data(): - return { - 'fieldname': 'goal', - 'transactions': [ - { - 'label': _('Review'), - 'items': ['Quality Review'] - }, - { - 'label': _('Action'), - 'items': ['Quality Action'] - } - ] - } \ No newline at end of file + return { + 'fieldname': 'goal', + 'transactions': [ + { + 'label': _('Review'), + 'items': ['Quality Review'] + } + ] + } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py index 19512d9d09..d77187aaa1 100644 --- a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py +++ b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py @@ -14,33 +14,31 @@ class TestQualityGoal(unittest.TestCase): create_unit() test_create_goal = create_goal() test_get_goal = get_goal() + self.assertEquals(test_create_goal, test_get_goal) def create_goal(): goal = frappe.get_doc({ "doctype": "Quality Goal", "goal": "_Test Quality Goal", - "revision": "1", - "procedure": "_Test Quality Procedure", - "frequency": "Daily", - "measureable": "Yes", - "objective": [ + "procedure": "PRC-_Test Quality Procedure", + "objectives": [ { "objective": "_Test Quality Objective", "target": "4", - "unit": "_Test UOM" + "uom": "_Test UOM" } ] }) - goal_exist = frappe.db.exists("Quality Goal", ""+ goal.goal +"") + goal_exist = frappe.db.exists("Quality Goal", {"goal": goal.goal}) if not goal_exist: goal.insert() - return goal.goal + return goal.name else: return goal_exist def get_goal(): - goal = frappe.db.exists("Quality Goal", "_Test Quality Goal") + goal = frappe.db.exists("Quality Goal", "GOAL-_Test Quality Goal") return goal def create_unit(): @@ -48,6 +46,6 @@ def create_unit(): "doctype": "UOM", "uom_name": "_Test UOM", }) - unit_exist = frappe.db.exists("UOM", ""+ unit.uom_name +"") + unit_exist = frappe.db.exists("UOM", unit.uom_name) if not unit_exist: unit.insert() diff --git a/erpnext/quality_management/doctype/quality_meeting_table/__init__.py b/erpnext/quality_management/doctype/quality_goal_objective/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/quality_meeting_table/__init__.py rename to erpnext/quality_management/doctype/quality_goal_objective/__init__.py diff --git a/erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json b/erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json new file mode 100644 index 0000000000..e3dbd660b5 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json @@ -0,0 +1,51 @@ +{ + "autoname": "format:{####}", + "creation": "2019-05-26 15:03:43.996455", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "objective", + "cb_00", + "target", + "uom" + ], + "fields": [ + { + "fetch_from": "goal.objective", + "fieldname": "objective", + "fieldtype": "Text", + "in_list_view": 1, + "label": "Objective", + "reqd": 1 + }, + { + "fieldname": "target", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Target" + }, + { + "fieldname": "uom", + "fieldtype": "Link", + "in_list_view": 1, + "label": "UOM", + "options": "UOM" + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + } + ], + "istable": 1, + "modified": "2019-05-26 16:12:54.832058", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Goal Objective", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.py b/erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.py similarity index 57% rename from erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.py rename to erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.py index ef1b1838b0..f4bd357f1b 100644 --- a/erpnext/quality_management/doctype/customer_feedback_table/customer_feedback_table.py +++ b/erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals +# import frappe from frappe.model.document import Document -class CustomerFeedbackTable(Document): +class QualityGoalObjective(Document): pass diff --git a/erpnext/quality_management/doctype/quality_meeting/quality_meeting.json b/erpnext/quality_management/doctype/quality_meeting/quality_meeting.json index 45183c53d5..6985632e49 100644 --- a/erpnext/quality_management/doctype/quality_meeting/quality_meeting.json +++ b/erpnext/quality_management/doctype/quality_meeting/quality_meeting.json @@ -1,225 +1,93 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:QMS-MTN-{date}", - "beta": 0, - "creation": "2018-10-15 16:25:41.548432", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "format:MTNG-{date}", + "creation": "2018-10-15 16:25:41.548432", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "date", + "cb_00", + "status", + "sb_00", + "agenda", + "sb_01", + "minutes" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Meeting Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "Open\nClose" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "Open", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Open\nClose", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "minutes", + "fieldtype": "Table", + "label": "Minutes", + "options": "Quality Meeting Minutes" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "minutes_break", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Minutes", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "minutes", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Minutes", - "length": 0, - "no_copy": 0, - "options": "Quality Meeting Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Agenda" + }, + { + "fieldname": "agenda", + "fieldtype": "Table", + "label": "Agenda", + "options": "Quality Meeting Agenda" + }, + { + "fieldname": "sb_01", + "fieldtype": "Section Break", + "label": "Minutes" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-10-18 14:44:04.494395", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Meeting", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-26 23:12:23.364357", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Meeting", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_meeting/quality_meeting.py b/erpnext/quality_management/doctype/quality_meeting/quality_meeting.py index 88653a95b9..f8de22958b 100644 --- a/erpnext/quality_management/doctype/quality_meeting/quality_meeting.py +++ b/erpnext/quality_management/doctype/quality_meeting/quality_meeting.py @@ -6,13 +6,4 @@ from __future__ import unicode_literals from frappe.model.document import Document class QualityMeeting(Document): - def validate(self): - problem = '' - for data in self.minutes: - if data.status == 'Open': - problem = 'set' - - if problem == 'set': - self.status = 'Open' - else: - self.status = 'Close' \ No newline at end of file + pass \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_meeting/test_quality_meeting.py b/erpnext/quality_management/doctype/quality_meeting/test_quality_meeting.py index b680a1bdc2..e61b5dfc57 100644 --- a/erpnext/quality_management/doctype/quality_meeting/test_quality_meeting.py +++ b/erpnext/quality_management/doctype/quality_meeting/test_quality_meeting.py @@ -5,27 +5,41 @@ from __future__ import unicode_literals import frappe import unittest +from erpnext.quality_management.doctype.quality_review.test_quality_review import create_review class TestQualityMeeting(unittest.TestCase): def test_quality_meeting(self): + create_review() test_create_meeting = create_meeting() test_get_meeting = get_meeting() - self.assertEquals(test_create_meeting.name, test_get_meeting.name) + self.assertEquals(test_create_meeting, test_get_meeting) def create_meeting(): meeting = frappe.get_doc({ "doctype": "Quality Meeting", - "scope": "Company", - "status": "Close", - "date": ""+ frappe.as_unicode(frappe.utils.nowdate()) +"" + "status": "Open", + "date": frappe.utils.nowdate(), + "agenda": [ + { + "agenda": "Test Agenda" + } + ], + "minutes": [ + { + "document_type": "Quality Review", + "document_name": frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}), + "minute": "Test Minute" + } + ] }) - meeting_exist = frappe.get_list("Quality Meeting", filters={"date": ""+ meeting.date +""}, fields=["name"], limit=1) - if len(meeting_exist) == 0: + meeting_exist = frappe.db.exists("Quality Meeting", {"date": frappe.utils.nowdate(), "status": "Open"}) + + if not meeting_exist: meeting.insert() - return meeting + return meeting.name else: - return meeting_exist[0] + return meeting_exist def get_meeting(): - meeting = frappe.get_list("Quality Meeting", limit=1) - return meeting[0] \ No newline at end of file + meeting = frappe.db.exists("Quality Meeting", {"date": frappe.utils.nowdate(), "status": "Open"}) + return meeting \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_objective/__init__.py b/erpnext/quality_management/doctype/quality_meeting_agenda/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/quality_objective/__init__.py rename to erpnext/quality_management/doctype/quality_meeting_agenda/__init__.py diff --git a/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.js b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.js new file mode 100644 index 0000000000..09989dc643 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Quality Meeting Agenda', { + // refresh: function(frm) { + + // } +}); diff --git a/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.json b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.json new file mode 100644 index 0000000000..e53d18650c --- /dev/null +++ b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.json @@ -0,0 +1,28 @@ +{ + "creation": "2019-05-26 20:46:57.999300", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "agenda" + ], + "fields": [ + { + "fieldname": "agenda", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Agenda" + } + ], + "istable": 1, + "modified": "2019-05-26 20:49:01.328146", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Meeting Agenda", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "ASC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.py b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.py similarity index 57% rename from erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.py rename to erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.py index 082046df46..5d77975d74 100644 --- a/erpnext/quality_management/doctype/customer_feedback_template_table/customer_feedback_template_table.py +++ b/erpnext/quality_management/doctype/quality_meeting_agenda/quality_meeting_agenda.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals +# import frappe from frappe.model.document import Document -class CustomerFeedbackTemplateTable(Document): +class QualityMeetingAgenda(Document): pass diff --git a/erpnext/quality_management/doctype/quality_meeting_agenda/test_quality_meeting_agenda.py b/erpnext/quality_management/doctype/quality_meeting_agenda/test_quality_meeting_agenda.py new file mode 100644 index 0000000000..4750cc1f7a --- /dev/null +++ b/erpnext/quality_management/doctype/quality_meeting_agenda/test_quality_meeting_agenda.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestQualityMeetingAgenda(unittest.TestCase): + pass diff --git a/erpnext/quality_management/doctype/quality_procedure_table/__init__.py b/erpnext/quality_management/doctype/quality_meeting_minutes/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/quality_procedure_table/__init__.py rename to erpnext/quality_management/doctype/quality_meeting_minutes/__init__.py diff --git a/erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json b/erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json new file mode 100644 index 0000000000..3b9133ac70 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json @@ -0,0 +1,55 @@ +{ + "creation": "2019-05-26 20:45:26.226428", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "document_type", + "cb_00", + "document_name", + "sb_00", + "minute" + ], + "fields": [ + { + "fieldname": "sb_00", + "fieldtype": "Section Break" + }, + { + "fieldname": "minute", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Minute" + }, + { + "fieldname": "document_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Document Type", + "options": "Quality Review\nQuality Action\nQuality Feedback", + "reqd": 1 + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, + { + "fieldname": "document_name", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Document Name", + "options": "document_type" + } + ], + "istable": 1, + "modified": "2019-05-26 22:00:24.833920", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Meeting Minutes", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_action_table/quality_action_table.py b/erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.py similarity index 57% rename from erpnext/quality_management/doctype/quality_action_table/quality_action_table.py rename to erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.py index 9beb148ac1..47b2c95bd9 100644 --- a/erpnext/quality_management/doctype/quality_action_table/quality_action_table.py +++ b/erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals +# import frappe from frappe.model.document import Document -class QualityActionTable(Document): +class QualityMeetingMinutes(Document): pass diff --git a/erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.json b/erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.json deleted file mode 100644 index 8e34a62b9a..0000000000 --- a/erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-15 16:28:59.840039", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "review", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Review", - "length": 0, - "no_copy": 0, - "options": "Quality Review", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "action", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Action", - "length": 0, - "no_copy": 0, - "options": "Under Review\nPlanned", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "responsible", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Responsible", - "length": 0, - "no_copy": 0, - "options": "Role", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Open\nClose", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-01 14:34:53.964306", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Meeting Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_objective/quality_objective.json b/erpnext/quality_management/doctype/quality_objective/quality_objective.json deleted file mode 100644 index 49ffde9c35..0000000000 --- a/erpnext/quality_management/doctype/quality_objective/quality_objective.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:{####}", - "beta": 0, - "creation": "2018-10-02 16:47:59.600155", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "goal.objective", - "fieldname": "objective", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Objective", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "target", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Target", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "unit", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Unit", - "length": 0, - "no_copy": 0, - "options": "UOM", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-11 13:31:16.044780", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Objective", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_objective/quality_objective.py b/erpnext/quality_management/doctype/quality_objective/quality_objective.py deleted file mode 100644 index 9e6a8fd044..0000000000 --- a/erpnext/quality_management/doctype/quality_objective/quality_objective.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -from frappe.model.document import Document - -class QualityObjective(Document): - pass diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json index 8733c7c255..7b241ef787 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.json @@ -1,386 +1,106 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "format:{procedure}", - "beta": 0, - "creation": "2018-10-06 00:06:29.756804", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "format:PRC-{procedure}", + "creation": "2018-10-06 00:06:29.756804", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "procedure", + "parent_quality_procedure", + "is_group", + "sb_00", + "processes", + "lft", + "rgt", + "old_parent" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "procedure", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "parent_quality_procedure", + "fieldtype": "Link", + "label": "Parent Procedure", + "options": "Quality Procedure", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "parent_quality_procedure", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Parent Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "is_group", + "fieldtype": "Check", + "label": "Is Group", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_group", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "Lft", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_2", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "Rgt", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "department", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "label": "old_parent", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "procedure_steps_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Procedure Steps", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Processes" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "procedure_step", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "processes", + "fieldtype": "Table", + "label": "Processes", + "options": "Quality Procedure Process" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Lft", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Rgt", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "old_parent", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "procedure", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Procedure", + "reqd": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-12 14:30:19.803693", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Procedure", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-26 22:11:53.771428", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Procedure", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py index 126b8c7b2a..52c3320840 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py @@ -11,12 +11,11 @@ class QualityProcedure(NestedSet): nsm_parent_field = 'parent_quality_procedure' def before_save(self): - for data in self.procedure_step: - if data.procedure == 'Procedure' and data.procedure_name: - data.step = data.procedure_name - doc = frappe.get_doc("Quality Procedure", data.procedure_name) - if(doc.parent_quality_procedure): - frappe.throw(_("'"+ data.procedure_name +"' already has a Parent Procedure '"+ doc.parent_quality_procedure +"'")) + for process in self.processes: + if process.procedure: + doc = frappe.get_doc("Quality Procedure", process.procedure) + if doc.parent_quality_procedure: + frappe.throw(_("{0} already has a Parent Procedure {1}.".format(process.procedure, doc.parent_quality_procedure))) self.is_group = 1 def on_update(self): @@ -28,25 +27,28 @@ class QualityProcedure(NestedSet): def on_trash(self): if self.parent_quality_procedure: doc = frappe.get_doc("Quality Procedure", self.parent_quality_procedure) - for data in doc.procedure_step: - if data.procedure_name == self.name: - doc.procedure_step.remove(data) - doc.save() + for process in doc.processes: + if process.procedure == self.name: + doc.processes.remove(process) + doc.save(ignore_permissions=True) + flag_is_group = 0 doc.load_from_db() - for data in doc.procedure_step: - if data.procedure == "Procedure": + + for process in doc.processes: + if process.procedure: flag_is_group = 1 + if flag_is_group == 0: doc.is_group = 0 - doc.save() + doc.save(ignore_permissions=True) def set_parent(self): - for data in self.procedure_step: - if data.procedure == 'Procedure' and data.procedure_name: - doc = frappe.get_doc("Quality Procedure", data.procedure_name) + for process in self.processes: + if process.procedure: + doc = frappe.get_doc("Quality Procedure", process.procedure) doc.parent_quality_procedure = self.name - doc.save() + doc.save(ignore_permissions=True) @frappe.whitelist() def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False): @@ -57,8 +59,11 @@ def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=Fa @frappe.whitelist() def add_node(): from frappe.desk.treeview import make_tree_args + args = frappe.form_dict args = make_tree_args(**args) + if args.parent_quality_procedure == 'All Quality Procedures': args.parent_quality_procedure = None + frappe.get_doc(args).insert() \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure_dashboard.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure_dashboard.py index 8eff33c1e1..407028bb82 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure_dashboard.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure_dashboard.py @@ -1,20 +1,20 @@ from frappe import _ def get_data(): - return { - 'fieldname': 'procedure', - 'transactions': [ - { - 'label': _('Goal'), - 'items': ['Quality Goal'] - }, - { - 'label': _('Review'), - 'items': ['Quality Review'] - }, - { - 'label': _('Action'), - 'items': ['Quality Action'] - } - ], - } \ No newline at end of file + return { + 'fieldname': 'procedure', + 'transactions': [ + { + 'label': _('Goal'), + 'items': ['Quality Goal'] + }, + { + 'label': _('Review'), + 'items': ['Quality Review'] + }, + { + 'label': _('Action'), + 'items': ['Quality Action'] + } + ], + } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py index af7adec90d..79f8771395 100644 --- a/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/test_quality_procedure.py @@ -11,25 +11,26 @@ class TestQualityProcedure(unittest.TestCase): test_create_procedure = create_procedure() test_create_nested_procedure = create_nested_procedure() test_get_procedure, test_get_nested_procedure = get_procedure() - self.assertEquals(test_create_procedure, test_get_procedure.name) - self.assertEquals(test_create_nested_procedure, test_get_nested_procedure.name) - self.assertEquals(test_get_nested_procedure.name, test_get_procedure.parent_quality_procedure) + + self.assertEquals(test_create_procedure, test_get_procedure.get("name")) + self.assertEquals(test_create_nested_procedure, test_get_nested_procedure.get("name")) def create_procedure(): procedure = frappe.get_doc({ "doctype": "Quality Procedure", "procedure": "_Test Quality Procedure", - "procedure_step": [ + "processes": [ { - "procedure": "Step", - "step": "_Test Quality Procedure Table", + "process_description": "_Test Quality Procedure Table", } ] }) - procedure_exist = frappe.db.exists("Quality Procedure",""+ procedure.procedure +"") + + procedure_exist = frappe.db.exists("Quality Procedure", "PRC-_Test Quality Procedure") + if not procedure_exist: procedure.insert() - return procedure.procedure + return procedure.name else: return procedure_exist @@ -37,21 +38,22 @@ def create_nested_procedure(): nested_procedure = frappe.get_doc({ "doctype": "Quality Procedure", "procedure": "_Test Nested Quality Procedure", - "procedure_step": [ + "processes": [ { - "procedure": "Procedure", - "procedure_name": "_Test Quality Procedure", + "procedure": "PRC-_Test Quality Procedure" } ] }) - nested_procedure_exist = frappe.db.exists("Quality Procedure",""+ nested_procedure.procedure +"") + + nested_procedure_exist = frappe.db.exists("Quality Procedure", "PRC-_Test Nested Quality Procedure") + if not nested_procedure_exist: nested_procedure.insert() - return nested_procedure.procedure + return nested_procedure.name else: return nested_procedure_exist def get_procedure(): - procedure = frappe.get_all("Quality Procedure", filters={"procedure": "_Test Quality Procedure"}, fields=["name", "parent_quality_procedure"], limit=1) - nested_procedure = frappe.get_all("Quality Procedure", filters={"procedure": "_Test Nested Quality Procedure"}, fields=["name", "parent_quality_procedure"], limit=1) - return procedure[0], nested_procedure[0] \ No newline at end of file + procedure = frappe.get_doc("Quality Procedure", "PRC-_Test Quality Procedure") + nested_procedure = frappe.get_doc("Quality Procedure", "PRC-_Test Nested Quality Procedure") + return {"name": procedure.name}, {"name": nested_procedure.name, "parent_quality_procedure": nested_procedure.parent_quality_procedure} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review_table/__init__.py b/erpnext/quality_management/doctype/quality_procedure_process/__init__.py similarity index 100% rename from erpnext/quality_management/doctype/quality_review_table/__init__.py rename to erpnext/quality_management/doctype/quality_procedure_process/__init__.py diff --git a/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json new file mode 100644 index 0000000000..f5c0fbc252 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.json @@ -0,0 +1,36 @@ +{ + "creation": "2019-05-26 00:10:00.248885", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "process_description", + "procedure" + ], + "fields": [ + { + "fieldname": "process_description", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Process Description" + }, + { + "description": "Link existing Quality Procedure.", + "fieldname": "procedure", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Procedure", + "options": "Quality Procedure" + } + ], + "istable": 1, + "modified": "2019-05-26 22:05:49.007189", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Procedure Process", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.py b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.py new file mode 100644 index 0000000000..0d9a286052 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_procedure_process/quality_procedure_process.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class QualityProcedureProcess(Document): + pass diff --git a/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.json b/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.json deleted file mode 100644 index 965edbcc40..0000000000 --- a/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-17 15:48:57.617831", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 0, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "procedure", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Step\nProcedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.procedure == \"Procedure\"", - "fieldname": "procedure_name", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.procedure == \"Step\"", - "fieldname": "step", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Step", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "responsible_individual", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Responsible Individual", - "length": 0, - "no_copy": 0, - "options": "Role", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-01 14:26:33.558345", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Procedure Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.py b/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.py deleted file mode 100644 index 6fe927adc7..0000000000 --- a/erpnext/quality_management/doctype/quality_procedure_table/quality_procedure_table.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -from frappe.model.document import Document - -class QualityProcedureTable(Document): - pass diff --git a/erpnext/quality_management/doctype/quality_review/quality_review.js b/erpnext/quality_management/doctype/quality_review/quality_review.js index 48b5c882fd..b6245818f5 100644 --- a/erpnext/quality_management/doctype/quality_review/quality_review.js +++ b/erpnext/quality_management/doctype/quality_review/quality_review.js @@ -4,69 +4,25 @@ frappe.ui.form.on('Quality Review', { onload: function(frm){ frm.set_value("date", frappe.datetime.get_today()); - $(".grid-add-row").hide(); - if(frm.doc.measurable == "Yes"){ - show_target_achieved_unit(frm); - } - else{ - hide_target_achieved_unit(frm); - } - frm.refresh(); }, goal: function(frm) { - frm.fields_dict.values.grid.remove_all(); - if (frm.doc.goal){ - frappe.call({ - "method": "frappe.client.get", - args: { - doctype: "Quality Goal", - name: frm.doc.goal - }, - callback: function (data) { - for (var i = 0; i < data.message.objective.length; i++ ){ - frm.add_child("values"); - frm.fields_dict.values.get_value()[i].objective = data.message.objective[i].objective; - if(frm.doc.measurable == "Yes"){ - if(i < 1){ - show_target_achieved_unit(frm); - } - frm.fields_dict.values.get_value()[i].target = data.message.objective[i].target; - frm.fields_dict.values.get_value()[i].achieved = 0; - frm.fields_dict.values.get_value()[i].unit = data.message.objective[i].unit; - } - if(frm.doc.measurable == "No"){ - if(i < 1){ - hide_target_achieved_unit(frm); - } - frm.fields_dict.values.get_value()[i].yes_no = "No"; - } - } - frm.refresh(); + frappe.call({ + "method": "frappe.client.get", + args: { + doctype: "Quality Goal", + name: frm.doc.goal + }, + callback: function(data){ + frm.fields_dict.reviews.grid.remove_all(); + let objectives = data.message.objectives; + for (var i in objectives) { + frm.add_child("reviews"); + frm.fields_dict.reviews.get_value()[i].objective = objectives[i].objective; + frm.fields_dict.reviews.get_value()[i].target = objectives[i].target; + frm.fields_dict.reviews.get_value()[i].uom = objectives[i].uom; } - }); - } - else{ - frm.doc.procedure = ''; - frm.doc.scope = ''; - frm.doc.action = ''; - frm.doc.measurable = ''; - frm.refresh(); - } + frm.refresh(); + } + }); }, -}); - -function show_target_achieved_unit(frm){ - // shows target, achieved and unit columns as the goal can be measured in numeric values - frm.fields_dict.values.grid.docfields[1].hidden = 0; - frm.fields_dict.values.grid.docfields[2].hidden = 0; - frm.fields_dict.values.grid.docfields[3].hidden = 0; - frm.fields_dict.values.grid.docfields[4].hidden = 1; -} - -function hide_target_achieved_unit(frm){ - // hides target and unit columns as the goal cannot be measured in numeric values - frm.fields_dict.values.grid.docfields[1].hidden = 1; - frm.fields_dict.values.grid.docfields[2].hidden = 1; - frm.fields_dict.values.grid.docfields[3].hidden = 1; - frm.fields_dict.values.grid.docfields[4].hidden = 0; -} \ No newline at end of file +}); \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review/quality_review.json b/erpnext/quality_management/doctype/quality_review/quality_review.json index 689c1c5c6e..bd5e9351f4 100644 --- a/erpnext/quality_management/doctype/quality_review/quality_review.json +++ b/erpnext/quality_management/doctype/quality_review/quality_review.json @@ -1,424 +1,110 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "QMS-REV-.#####", - "beta": 0, - "creation": "2018-10-02 11:45:16.301955", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "autoname": "format:REV-{#####}", + "creation": "2018-10-02 11:45:16.301955", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "goal", + "date", + "cb_00", + "procedure", + "status", + "sb_00", + "reviews", + "sb_01", + "additional_information" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "", - "fieldname": "goal", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Quality Goal", - "length": 0, - "no_copy": 0, - "options": "Quality Goal", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "date", - "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Evaluation Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fetch_from": "goal.procedure", + "fieldname": "procedure", + "fieldtype": "Link", + "label": "Procedure", + "options": "Quality Procedure", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "goal.measurable", - "fieldname": "measurable", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Measurable Goal", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "additional_information", + "fieldtype": "Text", + "label": "Additional Information" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cb_00", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "goal.procedure", - "fieldname": "procedure", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Procedure", - "length": 0, - "no_copy": 0, - "options": "Quality Procedure", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Review" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "goal.scope", - "fieldname": "scope", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Scope", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "collapsible": 1, + "fieldname": "sb_01", + "fieldtype": "Section Break", + "label": "Additional Information" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.scope == 'Department'", - "fetch_from": "goal.department", - "fieldname": "department", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Department", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "reviews", + "fieldtype": "Table", + "label": "Reviews", + "options": "Quality Review Objective" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "values_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Values", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "Open\nClosed" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "values", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Values", - "length": 0, - "no_copy": 0, - "options": "Quality Review Table", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "fieldname": "additional_info_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Additional Information", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "additional_information", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Additional Information", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "goal", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Goal", + "options": "Quality Goal", + "reqd": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-11-12 14:25:02.383387", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Review", - "name_case": "", - "owner": "Administrator", + ], + "modified": "2019-05-26 23:12:47.302189", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Review", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review/quality_review.py b/erpnext/quality_management/doctype/quality_review/quality_review.py index 8a28335e28..2bc8867ef7 100644 --- a/erpnext/quality_management/doctype/quality_review/quality_review.py +++ b/erpnext/quality_management/doctype/quality_review/quality_review.py @@ -5,63 +5,50 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -import datetime + class QualityReview(Document): pass def review(): - now = datetime.datetime.now() - day = now.day - day_name = now.strftime("%A") - month=now.strftime("%B") + day = frappe.utils.getdate().day + weekday = frappe.utils.getdate().strftime("%A") + month = frappe.utils.getdate().strftime("%B") - for data in frappe.get_all("Quality Goal",fields=['name', 'frequency', 'date', 'weekly', 'measurable']): - if data.frequency == 'Daily': - create_review(data.name, data.measurable) + for goal in frappe.get_list("Quality Goal", fields=['name', 'frequency', 'date', 'weekday']): + if goal.frequency == 'Daily': + create_review(goal.name) - elif data.frequency == 'Weekly': - if data.weekly == day_name: - create_review(data.name, data.measurable) + elif goal.frequency == 'Weekly' and goal.weekday == weekday: + create_review(goal.name) - elif data.frequency == 'Monthly': - if data.date == str(day): - create_review(data.name, data.measurable) + elif goal.frequency == 'Monthly' and goal.date == str(day): + create_review(goal.name) - elif data.frequency == 'Quarterly': - if (month == 'January' or month == 'April' or month == 'July' or month == 'October') and str(day) == data.date: - create_review(data.name, data.measurable) + elif goal.frequency == 'Quarterly' and goal.data == str(day) and get_quarter(month): + create_review(goal.name) - elif data.frequency == 'Half Yearly': - if (month == 'January' or month == 'July') and str(day) == data.date: - create_review(data.name, data.measurable) +def create_review(goal): + goal = frappe.get_doc("Quality Goal", goal) - elif data.frequency == 'Yearly': - if month == data.yearly and str(day) == data.date: - create_review(data.name, data.measurable) - - else: - pass - -def create_review(name, measurable): - objectives = frappe.get_all("Quality Objective", filters={'parent': name }, fields=['objective', 'target', 'unit']) - doc = frappe.get_doc({ + review = frappe.get_doc({ "doctype": "Quality Review", - "goal": name, - "date": frappe.as_unicode(frappe.utils.nowdate()), - "measurable": measurable, + "goal": goal.name, + "date": frappe.utils.getdate() }) - if measurable == 'Yes': - for objective in objectives: - doc.append("values",{ - 'objective': objective.objective, - 'target': objective.target, - 'achieved': 0, - 'unit': objective.unit - }) + + for objective in goal.objectives: + review.append("reviews", + { + "objective": objective.objective, + "target": objective.target, + "uom": objective.uom + } + ) + + review.insert(ignore_permissions=True) + +def get_quarter(month): + if month in ["January", "April", "July", "October"]: + return True else: - for objective in objectives: - doc.append("values",{ - 'objective': objective.objective, - }) - doc.insert() - frappe.db.commit() \ No newline at end of file + return False \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review/quality_review_dashboard.py b/erpnext/quality_management/doctype/quality_review/quality_review_dashboard.py deleted file mode 100644 index 85e4cccaa1..0000000000 --- a/erpnext/quality_management/doctype/quality_review/quality_review_dashboard.py +++ /dev/null @@ -1,16 +0,0 @@ -from frappe import _ - -def get_data(): - return { - 'fieldname': 'review', - 'transactions': [ - { - 'label': _('Action'), - 'items': ['Quality Action'] - }, - { - 'label': _('Meeting'), - 'items': ['Quality Meeting'] - } - ], - } \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review/test_quality_review.py b/erpnext/quality_management/doctype/quality_review/test_quality_review.py index 421d20dcbc..8add6db9c9 100644 --- a/erpnext/quality_management/doctype/quality_review/test_quality_review.py +++ b/erpnext/quality_management/doctype/quality_review/test_quality_review.py @@ -17,31 +17,30 @@ class TestQualityReview(unittest.TestCase): create_goal() test_create_review = create_review() test_get_review = get_review() - self.assertEquals(test_create_review.name, test_get_review.name) + self.assertEquals(test_create_review, test_get_review) def create_review(): review = frappe.get_doc({ "doctype": "Quality Review", - "goal": "_Test Quality Goal", - "procedure": "_Test Quality Procedure", - "scope": "Company", - "date": ""+ frappe.utils.nowdate() +"", - "values": [ + "goal": "GOAL-_Test Quality Goal", + "procedure": "PRC-_Test Quality Procedure", + "date": frappe.utils.nowdate(), + "reviews": [ { "objective": "_Test Quality Objective", "target": "100", - "achieved": "100", - "unit": "_Test UOM" + "uom": "_Test UOM", + "review": "Test Review" } ] }) - review_exist = frappe.get_list("Quality Review", filters={"goal": "_Test Quality Goal"}, limit=1) - if len(review_exist) == 0: - review.insert() - return review + review_exist = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}) + if not review_exist: + review.insert(ignore_permissions=True) + return review.name else: - return review_exist[0] + return review_exist def get_review(): - review = frappe.get_list("Quality Review", filters={"goal": "_Test Quality Goal"}, limit=1) - return review[0] \ No newline at end of file + review = frappe.db.exists("Quality Review", {"goal": "GOAL-_Test Quality Goal"}) + return review \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review_objective/__init__.py b/erpnext/quality_management/doctype/quality_review_objective/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json b/erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json new file mode 100644 index 0000000000..91f7bc07c7 --- /dev/null +++ b/erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json @@ -0,0 +1,64 @@ +{ + "creation": "2019-05-26 15:17:44.796958", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "objective", + "cb_00", + "target", + "uom", + "sb_00", + "review" + ], + "fields": [ + { + "fieldname": "objective", + "fieldtype": "Text", + "in_list_view": 1, + "label": "Objective", + "read_only": 1 + }, + { + "fieldname": "target", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Target", + "read_only": 1 + }, + { + "fetch_from": "target_unit", + "fieldname": "uom", + "fieldtype": "Link", + "in_list_view": 1, + "label": "UOM", + "options": "UOM", + "read_only": 1 + }, + { + "fieldname": "review", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Review" + }, + { + "fieldname": "sb_00", + "fieldtype": "Section Break", + "label": "Review" + }, + { + "fieldname": "cb_00", + "fieldtype": "Column Break" + } + ], + "istable": 1, + "modified": "2019-05-26 16:14:12.586128", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Quality Review Objective", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.py b/erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.py similarity index 56% rename from erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.py rename to erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.py index 2e39c2482b..3092a1e997 100644 --- a/erpnext/quality_management/doctype/quality_meeting_table/quality_meeting_table.py +++ b/erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt from __future__ import unicode_literals +# import frappe from frappe.model.document import Document -class QualityMeetingTable(Document): +class QualityReviewObjective(Document): pass diff --git a/erpnext/quality_management/doctype/quality_review_table/quality_review_table.json b/erpnext/quality_management/doctype/quality_review_table/quality_review_table.json deleted file mode 100644 index 442c4c6b8a..0000000000 --- a/erpnext/quality_management/doctype/quality_review_table/quality_review_table.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-09 13:03:37.666929", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "objective", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "objective", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "target", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Target", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "fieldname": "achieved", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Achieved", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_from": "target_unit", - "fieldname": "unit", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Unit", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "fieldname": "yes_no", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Yes/No", - "length": 0, - "no_copy": 0, - "options": "No\nYes", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2018-11-03 11:10:53.818818", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Quality Review Table", - "name_case": "", - "owner": "Administrator", - "permissions": [], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/quality_management/doctype/quality_review_table/quality_review_table.py b/erpnext/quality_management/doctype/quality_review_table/quality_review_table.py deleted file mode 100644 index 5760cbcb06..0000000000 --- a/erpnext/quality_management/doctype/quality_review_table/quality_review_table.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -from frappe.model.document import Document - -class QualityReviewTable(Document): - pass diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py index fc2fc9658f..8893cab2fd 100644 --- a/erpnext/regional/india/utils.py +++ b/erpnext/regional/india/utils.py @@ -261,3 +261,19 @@ def calculate_hra_exemption_for_period(doc): exemptions["monthly_house_rent"] = monthly_rent exemptions["total_eligible_hra_exemption"] = eligible_hra return exemptions + +@frappe.whitelist() +def get_gstins_for_company(company): + company_gstins =[] + if company: + company_gstins = frappe.db.sql("""select + distinct `tabAddress`.gstin + from + `tabAddress`, `tabDynamic Link` + where + `tabDynamic Link`.parent = `tabAddress`.name and + `tabDynamic Link`.parenttype = 'Address' and + `tabDynamic Link`.link_doctype = 'Company' and + `tabDynamic Link`.link_name = '{0}'""".format(company)) + return company_gstins + diff --git a/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.js b/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.js index 1ece14b713..3a0f0c966d 100644 --- a/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.js +++ b/erpnext/regional/report/gst_itemised_sales_register/gst_itemised_sales_register.js @@ -3,5 +3,31 @@ /* eslint-disable */ {% include "erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js" %} +{% include "erpnext/regional/report/india_gst_common/india_gst_common.js" %} -frappe.query_reports["GST Itemised Sales Register"] = frappe.query_reports["Item-wise Sales Register"] \ No newline at end of file +let filters = frappe.query_reports["Item-wise Sales Register"]["filters"]; + +// Add GSTIN filter +filters = filters.concat({ + "fieldname":"company_gstin", + "label": __("Company GSTIN"), + "fieldtype": "Select", + "placeholder":"Company GSTIN", + "options": [""], + "width": "80" +}, { + "fieldname":"invoice_type", + "label": __("Invoice Type"), + "fieldtype": "Select", + "placeholder":"Invoice Type", + "options": ["", "Regular", "SEZ", "Export", "Deemed Export"] +}); + +// Handle company on change +for (var i = 0; i < filters.length; ++i) { + if (filters[i].fieldname === 'company') { + filters[i].on_change = fetch_gstins; + } +} + +frappe.query_reports["GST Itemised Sales Register"] = { "filters": filters, "onload": fetch_gstins }; diff --git a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.js b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.js index df0ef25315..dcb81cb087 100644 --- a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.js +++ b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.js @@ -2,6 +2,8 @@ // For license information, please see license.txt /* eslint-disable */ +{% include "erpnext/regional/report/india_gst_common/india_gst_common.js" %} + frappe.query_reports["HSN-wise-summary of outward supplies"] = { "filters": [ { @@ -10,7 +12,8 @@ frappe.query_reports["HSN-wise-summary of outward supplies"] = { "fieldtype": "Link", "options": "Company", "reqd": 1, - "default": frappe.defaults.get_user_default("Company") + "default": frappe.defaults.get_user_default("Company"), + "on_change": fetch_gstins }, { "fieldname":"gst_hsn_code", @@ -18,6 +21,17 @@ frappe.query_reports["HSN-wise-summary of outward supplies"] = { "fieldtype": "Link", "options": "GST HSN Code", "width": "80" + }, + { + "fieldname":"company_gstin", + "label": __("Company GSTIN"), + "fieldtype": "Select", + "placeholder":"Company GSTIN", + "options": [""], + "width": "80" } - ] -} + ], + onload: (report) => { + fetch_gstins(report); + } +}; diff --git a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py index 165458c4d5..e938e29c44 100644 --- a/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py +++ b/erpnext/regional/report/hsn_wise_summary_of_outward_supplies/hsn_wise_summary_of_outward_supplies.py @@ -87,7 +87,8 @@ def get_conditions(filters): conditions = "" for opts in (("company", " and company=%(company)s"), - ("gst_hsn_code", " and gst_hsn_code=%(gst_hsn_code)s")): + ("gst_hsn_code", " and gst_hsn_code=%(gst_hsn_code)s"), + ("company_gstin", " and company_gstin=%(company_gstin)s")): if filters.get(opts[0]): conditions += opts[1] @@ -193,7 +194,7 @@ def get_merged_data(columns, data): add_column_index.append(i) for row in data: - if merged_hsn_dict.has_key(row[0]): + if row[0] in merged_hsn_dict: to_add_row = merged_hsn_dict.get(row[0]) # add columns from the add_column_index table diff --git a/erpnext/regional/report/india_gst_common/india_gst_common.js b/erpnext/regional/report/india_gst_common/india_gst_common.js new file mode 100644 index 0000000000..4960601394 --- /dev/null +++ b/erpnext/regional/report/india_gst_common/india_gst_common.js @@ -0,0 +1,21 @@ +function fetch_gstins(report) { + var company_gstins = report.get_filter('company_gstin'); + var company = report.get_filter_value('company'); + if (company) { + frappe.call({ + method:'erpnext.regional.india.utils.get_gstins_for_company', + async: false, + args: { + company: company + }, + callback: function(r) { + r.message.unshift(""); + company_gstins.df.options = r.message; + company_gstins.refresh(); + } + }); + } else { + company_gstins.df.options = [""]; + company_gstins.refresh(); + } +} \ No newline at end of file diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 5a287b12f7..fc715c91c5 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -76,9 +76,8 @@ "is_customer_provided_item", "customer", "supplier_details", + "manufacturers", "delivered_by_supplier", - "manufacturer", - "manufacturer_part_no", "column_break2", "supplier_items", "foreign_trade_details", @@ -198,6 +197,7 @@ "search_index": 1 }, { + "default": "0", "fieldname": "is_item_from_hub", "fieldtype": "Check", "label": "Is Item from Hub", @@ -218,11 +218,13 @@ "fieldtype": "Column Break" }, { + "default": "0", "fieldname": "disabled", "fieldtype": "Check", "label": "Disabled" }, { + "default": "0", "fieldname": "allow_alternative_item", "fieldtype": "Check", "label": "Allow Alternative Item" @@ -263,6 +265,7 @@ "label": "Standard Selling Rate" }, { + "default": "0", "fieldname": "is_fixed_asset", "fieldtype": "Check", "label": "Is Fixed Asset", @@ -439,6 +442,7 @@ "label": "Serial Nos and Batches" }, { + "default": "0", "depends_on": "eval:doc.is_stock_item", "fieldname": "has_batch_no", "fieldtype": "Check", @@ -448,6 +452,7 @@ "oldfieldtype": "Select" }, { + "default": "0", "depends_on": "has_batch_no", "fieldname": "create_new_batch", "fieldtype": "Check", @@ -462,12 +467,14 @@ "translatable": 1 }, { + "default": "0", "depends_on": "has_batch_no", "fieldname": "has_expiry_date", "fieldtype": "Check", "label": "Has Expiry Date" }, { + "default": "0", "depends_on": "has_batch_no", "fieldname": "retain_sample", "fieldtype": "Check", @@ -485,6 +492,7 @@ "fieldtype": "Column Break" }, { + "default": "0", "depends_on": "eval:doc.is_stock_item || doc.is_fixed_asset", "fieldname": "has_serial_no", "fieldtype": "Check", @@ -601,6 +609,7 @@ "read_only": 1 }, { + "default": "0", "fieldname": "is_customer_provided_item", "fieldtype": "Check", "label": "Is Customer Provided Item" @@ -619,26 +628,15 @@ "label": "Supplier Details" }, { + "default": "0", "fieldname": "delivered_by_supplier", "fieldtype": "Check", "label": "Delivered by Supplier (Drop Ship)", "print_hide": 1 }, - { - "fieldname": "manufacturer", - "fieldtype": "Link", - "label": "Manufacturer", - "options": "Manufacturer" - }, - { - "fieldname": "manufacturer_part_no", - "fieldtype": "Data", - "label": "Manufacturer Part Number" - }, { "fieldname": "column_break2", "fieldtype": "Column Break", - "label": "Item Code for Suppliers", "oldfieldtype": "Column Break", "width": "50%" }, @@ -718,6 +716,7 @@ "options": "Account" }, { + "default": "0", "fieldname": "enable_deferred_revenue", "fieldtype": "Check", "label": "Enable Deferred Revenue" @@ -747,6 +746,7 @@ "options": "Account" }, { + "default": "0", "fieldname": "enable_deferred_expense", "fieldtype": "Check", "label": "Enable Deferred Expense" @@ -800,6 +800,7 @@ "options": "fa fa-search" }, { + "default": "0", "fieldname": "inspection_required_before_purchase", "fieldtype": "Check", "label": "Inspection Required before Purchase", @@ -807,6 +808,7 @@ "oldfieldtype": "Select" }, { + "default": "0", "fieldname": "inspection_required_before_delivery", "fieldtype": "Check", "label": "Inspection Required before Delivery" @@ -840,6 +842,7 @@ "read_only": 1 }, { + "default": "0", "description": "If subcontracted to a vendor", "fieldname": "is_sub_contracted_item", "fieldtype": "Check", @@ -867,6 +870,7 @@ "options": "fa fa-globe" }, { + "default": "0", "depends_on": "eval:!doc.variant_of", "fieldname": "show_in_website", "fieldtype": "Check", @@ -874,6 +878,7 @@ "search_index": 1 }, { + "default": "0", "depends_on": "variant_of", "fieldname": "show_variant_in_website", "fieldtype": "Check", @@ -1016,6 +1021,12 @@ "fieldtype": "Check", "label": "Synced With Hub", "read_only": 1 + }, + { + "fieldname": "manufacturers", + "fieldtype": "Table", + "label": "Manufacturers", + "options": "Item Manufacturer" } ], "has_web_view": 1, @@ -1023,7 +1034,7 @@ "idx": 2, "image_field": "image", "max_attachments": 1, - "modified": "2019-05-16 09:32:27.056036", + "modified": "2019-06-02 04:45:59.911507", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/item/item_dashboard.py b/erpnext/stock/doctype/item/item_dashboard.py index 8e4f74ddbb..b3733d357b 100644 --- a/erpnext/stock/doctype/item/item_dashboard.py +++ b/erpnext/stock/doctype/item/item_dashboard.py @@ -41,7 +41,7 @@ def get_data(): }, { 'label': _('Manufacture'), - 'items': ['Work Order'] + 'items': ['Work Order', 'Item Manufacturer'] } ] } \ No newline at end of file diff --git a/erpnext/stock/doctype/item/templates/item.html b/erpnext/stock/doctype/item/templates/item.html new file mode 100644 index 0000000000..db123090aa --- /dev/null +++ b/erpnext/stock/doctype/item/templates/item.html @@ -0,0 +1,7 @@ +{% extends "templates/web.html" %} + +{% block page_content %} +

{{ title }}

+{% endblock %} + + \ No newline at end of file diff --git a/erpnext/stock/doctype/item/templates/item_row.html b/erpnext/stock/doctype/item/templates/item_row.html new file mode 100644 index 0000000000..2b999819cb --- /dev/null +++ b/erpnext/stock/doctype/item/templates/item_row.html @@ -0,0 +1,4 @@ +
+ {{ title }} +
+ \ No newline at end of file diff --git a/erpnext/stock/doctype/item_manufacturer/__init__.py b/erpnext/stock/doctype/item_manufacturer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.js b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.js new file mode 100644 index 0000000000..a4df923f03 --- /dev/null +++ b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Item Manufacturer', { + // refresh: function(frm) { + + // } +}); diff --git a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.json b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.json new file mode 100644 index 0000000000..956c92e673 --- /dev/null +++ b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.json @@ -0,0 +1,105 @@ +{ + "allow_import": 1, + "creation": "2019-06-02 04:41:37.332911", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "item_code", + "manufacturer", + "manufacturer_part_no", + "column_break_3", + "item_name", + "description" + ], + "fields": [ + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Manufacturer", + "options": "Manufacturer", + "reqd": 1 + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Manufacturer Part Number", + "reqd": 1 + }, + { + "fieldname": "item_code", + "fieldtype": "Link", + "label": "Item Code", + "options": "Item", + "reqd": 1 + }, + { + "fetch_from": "item_code.item_name", + "fieldname": "item_name", + "fieldtype": "Data", + "label": "Item Name", + "read_only": 1 + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "fetch_from": "item_code.description", + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Description", + "read_only": 1 + } + ], + "modified": "2019-06-06 19:07:31.175919", + "modified_by": "Administrator", + "module": "Stock", + "name": "Item Manufacturer", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Item Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "ASC", + "title_field": "item_code", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py new file mode 100644 index 0000000000..67eab82d97 --- /dev/null +++ b/erpnext/stock/doctype/item_manufacturer/item_manufacturer.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals + +import frappe +from frappe import _ +from frappe.model.document import Document + +class ItemManufacturer(Document): + def validate(self): + self.validate_duplicate_entry() + + def validate_duplicate_entry(self): + if self.is_new(): + filters = { + 'item_code': self.item_code, + 'manufacturer': self.manufacturer, + 'manufacturer_part_no': self.manufacturer_part_no + } + + if frappe.db.exists("Item Manufacturer", filters): + frappe.throw(_("Duplicate entry against the item code {0} and manufacturer {1}") + .format(self.item_code, self.manufacturer)) + +@frappe.whitelist() +def get_item_manufacturer_part_no(item_code, manufacturer): + return frappe.db.get_value("Item Manufacturer", + {'item_code': item_code, 'manufacturer': manufacturer}, 'manufacturer_part_no') \ No newline at end of file diff --git a/erpnext/stock/doctype/item_manufacturer/test_item_manufacturer.py b/erpnext/stock/doctype/item_manufacturer/test_item_manufacturer.py new file mode 100644 index 0000000000..1cef20c417 --- /dev/null +++ b/erpnext/stock/doctype/item_manufacturer/test_item_manufacturer.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestItemManufacturer(unittest.TestCase): + pass diff --git a/erpnext/stock/doctype/material_request_item/material_request_item.json b/erpnext/stock/doctype/material_request_item/material_request_item.json index 9f4f14a05d..795971b5e3 100644 --- a/erpnext/stock/doctype/material_request_item/material_request_item.json +++ b/erpnext/stock/doctype/material_request_item/material_request_item.json @@ -15,6 +15,10 @@ "brand", "image_section", "image", + "manufacture_details", + "manufacturer", + "column_break_12", + "manufacturer_part_no", "quantity_and_warehouse", "qty", "uom", @@ -378,11 +382,32 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "fieldname": "manufacture_details", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "column_break_12", + "fieldtype": "Column Break" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number", + "read_only": 1 } ], "idx": 1, "istable": 1, - "modified": "2019-05-25 22:03:10.517886", + "modified": "2019-06-02 06:49:36.493957", "modified_by": "Administrator", "module": "Stock", "name": "Material Request Item", diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index 66df86bcf4..bb5cd52002 100644 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -19,6 +19,10 @@ "image_section", "image", "image_view", + "manufacture_details", + "manufacturer", + "column_break_16", + "manufacturer_part_no", "received_and_accepted", "received_qty", "qty", @@ -788,11 +792,33 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "collapsible": 1, + "fieldname": "manufacture_details", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "column_break_16", + "fieldtype": "Column Break" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number", + "read_only": 1 } ], "idx": 1, "istable": 1, - "modified": "2019-06-01 23:25:20.732134", + "modified": "2019-06-02 06:37:48.198745", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index f694af8481..791fad815a 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -14,6 +14,7 @@ from erpnext import get_company_currency from erpnext.stock.doctype.item.item import get_item_defaults, get_uom_conv_factor from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.setup.doctype.brand.brand import get_brand_defaults +from erpnext.stock.doctype.item_manufacturer.item_manufacturer import get_item_manufacturer_part_no from six import string_types, iteritems @@ -312,6 +313,14 @@ def get_basic_details(args, item): for fieldname in ("item_name", "item_group", "barcodes", "brand", "stock_uom"): out[fieldname] = item.get(fieldname) + if args.get("manufacturer"): + part_no = get_item_manufacturer_part_no(args.get("item_code"), args.get("manufacturer")) + if part_no: + out["manufacturer_part_no"] = part_no + else: + out["manufacturer_part_no"] = None + out["manufacturer"] = None + return out @frappe.whitelist() diff --git a/erpnext/www/lms.html b/erpnext/www/lms.html deleted file mode 100644 index aa76ca06e7..0000000000 --- a/erpnext/www/lms.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "templates/web.html" %} - -{% block title %}{{ heading or "LMS"}}{% endblock %} - -{% block navbar %}{% endblock %} - -{% block content %} -{% if lms_enabled %} -
- -{% else %} - - -
-
- {{_("Page Missing or Moved")}} -
-

{{_("The page you are looking for is missing. This could be because it is moved or there is a typo in the link.")}}

-
{{ _("Home") }}
-
-

{{ _("Error Code: {0}").format('404') }}

- -{% endif %} -{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms.py b/erpnext/www/lms.py deleted file mode 100644 index 7561d73d20..0000000000 --- a/erpnext/www/lms.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import unicode_literals -import erpnext.education.utils as utils -import frappe -from frappe import _ - -# LMS Utils to Update State for Vue Store -@frappe.whitelist() -def get_program_enrollments(): - student = utils.get_current_student() - if student == None: - return None - return student.get_program_enrollments() - -@frappe.whitelist() -def get_all_course_enrollments(): - student = utils.get_current_student() - if student == None: - return None - return student.get_all_course_enrollments() - -# Vue Client Functions -@frappe.whitelist(allow_guest=True) -def get_portal_details(): - """ - Returns portal details from Education Settings Doctype. This contains the Title and Description for LMS amoung other things. - """ - from erpnext import get_default_company - - settings = frappe.get_doc("Education Settings") - title = settings.portal_title or get_default_company() - description = settings.description - return dict(title=title, description=description) - -@frappe.whitelist(allow_guest=True) -def get_featured_programs(): - featured_program_names = frappe.get_all("Program", filters={"is_published": True, "is_featured": True}) - if featured_program_names: - featured_list = [utils.get_program_and_enrollment_status(program['name']) for program in featured_program_names] - return featured_list - else: - return get_all_programs()[:2] - -@frappe.whitelist(allow_guest=True) -def get_all_programs(): - program_names = frappe.get_all("Program", filters={"is_published": True}) - if program_names: - program_list = [utils.get_program_and_enrollment_status(program['name']) for program in program_names] - return program_list - -@frappe.whitelist(allow_guest=True) -def get_program(program_name): - try: - return frappe.get_doc('Program', program_name) - except frappe.DoesNotExistError: - frappe.throw(_("Program {0} does not exist.".format(program_name))) - -# Functions to get program & course details -@frappe.whitelist(allow_guest=True) -def get_courses(program_name): - program = frappe.get_doc('Program', program_name) - courses = program.get_course_list() - return courses - -@frappe.whitelist() -def get_next_content(current_content, current_content_type, topic): - if frappe.session.user == "Guest": - return None - topic = frappe.get_doc("Topic", topic) - content_list = [{'content_type':item.doctype, 'content':item.name} for item in topic.get_contents()] - current_index = content_list.index({'content': current_content, 'content_type': current_content_type}) - try: - return content_list[current_index + 1] - except IndexError: - return None - -def get_quiz_with_answers(quiz_name): - try: - quiz = frappe.get_doc("Quiz", quiz_name).get_questions() - quiz_output = [{'name':question.name, 'question':question.question, 'options':[{'name': option.name, 'option':option.option, 'is_correct':option.is_correct} for option in question.options]} for question in quiz] - return quiz_output - except: - frappe.throw("Quiz {0} does not exist".format(quiz_name)) - return None - -@frappe.whitelist() -def get_quiz_without_answers(quiz_name, course_name): - try: - quiz = frappe.get_doc("Quiz", quiz_name) - questions = quiz.get_questions() - except: - frappe.throw("Quiz {0} does not exist".format(quiz_name)) - return None - - if utils.check_super_access(): - quiz_output = [{'name':question.name, 'question':question.question, 'type': question.type, 'options':[{'name': option.name, 'option':option.option} for option in question.options]} for question in questions] - return { 'quizData': quiz_output, 'status': None} - - enrollment = utils.get_course_enrollment(course_name).name - quiz_progress = {} - quiz_progress['is_complete'], quiz_progress['score'], quiz_progress['result'] = utils.check_quiz_completion(quiz, enrollment) - quiz_output = [{'name':question.name, 'question':question.question, 'type': question.type, 'options':[{'name': option.name, 'option':option.option} for option in question.options]} for question in questions] - return { 'quizData': quiz_output, 'status': quiz_progress} - -@frappe.whitelist() -def evaluate_quiz(course, quiz_response, quiz_name): - """LMS Function: Evaluates a simple multiple choice quiz. - :param course: name of the course - :param quiz_response: contains user selected choices for a quiz in the form of a string formatted as a dictionary. The function uses `json.loads()` to convert it to a python dictionary. - :param quiz_name: Name of the quiz attempted - """ - import json - quiz_response = json.loads(quiz_response) - quiz = frappe.get_doc("Quiz", quiz_name) - answers, score, status = quiz.evaluate(quiz_response, quiz_name) - print(answers) - - course_enrollment = utils.get_course_enrollment(course) - if course_enrollment: - course_enrollment.add_quiz_activity(quiz_name, quiz_response, answers, score, status) - - return score - -@frappe.whitelist() -def enroll_in_program(program_name): - student = utils.get_current_student() - if not student: - student = utils.create_student_from_current_user() - program_enrollment = student.enroll_in_program(program_name) - return program_name - -# Academdy Activity -@frappe.whitelist() -def add_activity(course, content_type, content): - if not utils.get_current_student(): - return - enrollment = utils.get_course_enrollment(course) - enrollment.add_activity(content_type, content) - -@frappe.whitelist() -def get_student_course_details(course_name, program_name): - """ - Return the porgress of a course in a program as well as the content to continue from. - :param course_name: - :param program_name: - """ - student = utils.get_current_student() - if not student: - return {'flag':'Start Course' } - - course_enrollment = utils.get_course_enrollment(course_name) - program_enrollment = utils.get_program_enrollment(program_name) - - if not program_enrollment: - return None - - if not course_enrollment: - course_enrollment = utils.enroll_in_course(course_name, program_name) - - progress = course_enrollment.get_progress(student) - count = sum([activity['is_complete'] for activity in progress]) - if count == 0: - return {'flag':'Start Course'} - elif count == len(progress): - return {'flag':'Completed'} - elif count < len(progress): - next_item = next(item for item in progress if item['is_complete']==False) - return {'flag':'Continue'} - -@frappe.whitelist() -def get_student_topic_details(topic_name, course_name): - """ - Return the porgress of a course in a program as well as the content to continue from. - :param topic_name: - :param course_name: - """ - topic = frappe.get_doc("Topic", topic_name) - student = utils.get_current_student() - if not student: - topic_content = topic.get_all_children() - if topic_content: - return {'flag':'Start Course', 'content_type': topic_content[0].content_type, 'content': topic_content[0].content} - else: - return None - course_enrollment = utils.get_course_enrollment(course_name) - progress = student.get_topic_progress(course_enrollment.name, topic) - if not progress: - return { 'flag':'Start Topic', 'content_type': None, 'content': None } - count = sum([activity['is_complete'] for activity in progress]) - if count == 0: - return {'flag':'Start Topic', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']} - elif count == len(progress): - return {'flag':'Completed', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']} - elif count < len(progress): - next_item = next(item for item in progress if item['is_complete']==False) - return {'flag':'Continue', 'content_type': next_item['content_type'], 'content': next_item['content']} - -@frappe.whitelist() -def get_program_progress(program_name): - program_enrollment = frappe.get_doc("Program Enrollment", utils.get_program_enrollment(program_name)) - if not program_enrollment: - return None - else: - return program_enrollment.get_program_progress() - -@frappe.whitelist() -def get_joining_date(): - student = utils.get_current_student() - if student: - return student.joining_date - -@frappe.whitelist() -def get_quiz_progress_of_program(program_name): - program_enrollment = frappe.get_doc("Program Enrollment", utils.get_program_enrollment(program_name)) - if not program_enrollment: - return None - else: - return program_enrollment.get_quiz_progress() - - -@frappe.whitelist(allow_guest=True) -def get_course_details(course_name): - try: - course = frappe.get_doc('Course', course_name) - return course - except: - return None - -# Functions to get program & course details -@frappe.whitelist(allow_guest=True) -def get_topics(course_name): - try: - course = frappe.get_doc('Course', course_name) - return course.get_topics() - except frappe.DoesNotExistError: - frappe.throw(_("Course {0} does not exist.".format(course_name))) - -@frappe.whitelist() -def get_content(content_type, content): - try: - return frappe.get_doc(content_type, content) - except frappe.DoesNotExistError: - frappe.throw(_("{0} {1} does not exist.".format(content_type, content))) \ No newline at end of file diff --git a/erpnext/www/lms/__init__.py b/erpnext/www/lms/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/www/lms/content.html b/erpnext/www/lms/content.html new file mode 100644 index 0000000000..9b8c45cb9b --- /dev/null +++ b/erpnext/www/lms/content.html @@ -0,0 +1,208 @@ +{% extends "templates/base.html" %} +{% block title %}{{ content.name or 'Content Page' }}{% endblock %} + +{% block head_include %} + + +{% endblock %} + +{% macro title() %} +
+ + Back to Course + +
+
+

{{ content.name }} ({{ position + 1 }}/{{length}})

+
+{% endmacro %} + +{% macro navigation() %} + {% if previous %} + Previous + {% else %} + Back to Course + {% endif %} + + {% if next %} + + {% else %} + + {% endif %} +{% endmacro %} + +{% macro video() %} +
+ {{ title() }} +
+ {% if content.duration %} + {{ content.duration }} Mins + {% endif %} + + {% if content.publish_date and content.duration%} + - + {% endif %} + + {% if content.publish_date %} + Published on {{ content.publish_date.strftime('%d, %b %Y') }} + {% endif %} +
+
+
+
+ {{ content.description }} +
+{% endmacro %} + +{% macro article() %} +
+ {{ title() }} +
+ {% if content.author or content.publish_date %} + Published + {% endif %} + {% if content.author %} + by {{ content.author }} + {% endif %} + {% if content.publish_date %} + on {{ content.publish_date.strftime('%d, %b %Y') }} + {% endif %} +
+
+
+ {{ content.content }} +
+{% endmacro %} + +{% macro quiz() %} +
+ {{ title() }} +
+
+
+{% endmacro %} + +{% block content %} +
+
+
+ {% if content_type=='Video' %} + {{ video() }} + {% elif content_type=='Article'%} + {{ article() }} + {% elif content_type=='Quiz' %} + {{ quiz() }} + {% endif %} +
+ {{ navigation() }} +
+
+
+
+{% endblock %} + +{% block script %} + {% if content_type=='Video' %} + + {% elif content_type == 'Quiz' %} + + {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/content.py b/erpnext/www/lms/content.py new file mode 100644 index 0000000000..0c04845362 --- /dev/null +++ b/erpnext/www/lms/content.py @@ -0,0 +1,68 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe + +no_cache = 1 + +def get_context(context): + # Load Query Parameters + try: + program = frappe.form_dict['program'] + content = frappe.form_dict['content'] + content_type = frappe.form_dict['type'] + course = frappe.form_dict['course'] + topic = frappe.form_dict['topic'] + except KeyError: + frappe.local.flags.redirect_location = '/lms' + raise frappe.Redirect + + + # Check if user has access to the content + has_program_access = utils.allowed_program_access(program) + has_content_access = allowed_content_access(program, content, content_type) + + if frappe.session.user == "Guest" or not has_program_access or not has_content_access: + frappe.local.flags.redirect_location = '/lms' + raise frappe.Redirect + + + # Set context for content to be displayer + context.content = frappe.get_doc(content_type, content).as_dict() + context.content_type = content_type + context.program = program + context.course = course + context.topic = topic + + topic = frappe.get_doc("Topic", topic) + content_list = [{'content_type':item.content_type, 'content':item.content} for item in topic.topic_content] + + # Set context for progress numbers + context.position = content_list.index({'content': content, 'content_type': content_type}) + context.length = len(content_list) + + # Set context for navigation + context.previous = get_previous_content(content_list, context.position) + context.next = get_next_content(content_list, context.position) + +def get_next_content(content_list, current_index): + try: + return content_list[current_index + 1] + except IndexError: + return None + +def get_previous_content(content_list, current_index): + if current_index == 0: + return None + else: + return content_list[current_index - 1] + +def allowed_content_access(program, content, content_type): + contents_of_program = frappe.db.sql("""select `tabTopic Content`.content, `tabTopic Content`.content_type + from `tabCourse Topic`, + `tabProgram Course`, + `tabTopic Content` + where `tabCourse Topic`.parent = `tabProgram Course`.course + and `tabTopic Content`.parent = `tabCourse Topic`.topic + and `tabProgram Course`.parent = %(program)s""", {'program': program}) + + return (content, content_type) in contents_of_program \ No newline at end of file diff --git a/erpnext/www/lms/course.html b/erpnext/www/lms/course.html new file mode 100644 index 0000000000..f8618e08ec --- /dev/null +++ b/erpnext/www/lms/course.html @@ -0,0 +1,125 @@ +{% extends "templates/base.html" %} +{% block title %}{{ course.course_name }}{% endblock %} +{% from "www/lms/macros/hero.html" import hero %} +{% from "www/lms/macros/card.html" import null_card %} + +{% block head_include %} + +{% endblock %} + + +{% macro card(topic) %} +
+
+ {% if has_access %} + + {% else %} +
+ {% endif %} + {% if topic.hero_image %} +
+ {% else %} +
+
+
+ {% endif %} +
+ {% if has_access %} + + + {% else %} +
+ {% endif %} +
+
+{% endmacro %} + +{% block content %} +
+ {{ hero(course.course_name, course.description, has_access, {'name': 'Program', 'url': '/lms/program?program=' + program }) }} +
+
+ {% for topic in topics %} + {{ card(topic) }} + {% endfor %} + {% if topics %} + {% for n in range(3 - ((topics|length)%3)) %} + {{ null_card() }} + {% endfor %} + {% endif %} +
+
+
+{% endblock %} + +{% block script %} + +{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/course.py b/erpnext/www/lms/course.py new file mode 100644 index 0000000000..e7ed2e3ed6 --- /dev/null +++ b/erpnext/www/lms/course.py @@ -0,0 +1,19 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe + +no_cache = 1 + +def get_context(context): + context.education_settings = frappe.get_single("Education Settings") + course = frappe.get_doc('Course', frappe.form_dict['name']) + context.program = frappe.form_dict['program'] + context.course = course + + context.topics = course.get_topics() + context.has_access = utils.allowed_program_access(context.program) + context.progress = get_topic_progress(context.topics, course, context.program) + +def get_topic_progress(topics, course, program): + progress = {topic.name: utils.get_topic_progress(topic, course.name, program) for topic in topics} + return progress diff --git a/erpnext/www/lms/index.html b/erpnext/www/lms/index.html new file mode 100644 index 0000000000..3e107ac608 --- /dev/null +++ b/erpnext/www/lms/index.html @@ -0,0 +1,65 @@ +{% extends "templates/base.html" %} +{% block title %}{{ education_settings.portal_title }}{% endblock %} +{% from "www/lms/macros/card.html" import program_card %} +{% from "www/lms/macros/card.html" import null_card %} + +{% block head_include %} + + + +{% endblock %} + +{% block content %} +
+
+

{{ education_settings.portal_title }}

+

{{ education_settings.description }}

+

+ {% if frappe.session.user == 'Guest' %} + Sign Up + {% endif %} +

+
+
+
+ {% for program in featured_programs %} + {{ program_card(program.program, program.has_access) }} + {% endfor %} + {% if featured_programs %} + {% for n in range(3 - ((featured_programs|length)%3)) %} + {{ null_card() }} + {% endfor %} + {% endif %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/index.py b/erpnext/www/lms/index.py new file mode 100644 index 0000000000..00f66e72c3 --- /dev/null +++ b/erpnext/www/lms/index.py @@ -0,0 +1,16 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe + +no_cache = 1 + +def get_context(context): + context.education_settings = frappe.get_single("Education Settings") + if not context.education_settings.enable_lms: + frappe.local.flags.redirect_location = '/' + raise frappe.Redirect + context.featured_programs = get_featured_programs() + + +def get_featured_programs(): + return utils.get_portal_programs() \ No newline at end of file diff --git a/erpnext/www/lms/macros/card.html b/erpnext/www/lms/macros/card.html new file mode 100644 index 0000000000..9964d2df34 --- /dev/null +++ b/erpnext/www/lms/macros/card.html @@ -0,0 +1,34 @@ +{% macro program_card(program, has_access) %} +
+ + + +
+{% endmacro %} + + +{% macro null_card() %} +
+
+
+
+{% endmacro %} \ No newline at end of file diff --git a/erpnext/www/lms/macros/hero.html b/erpnext/www/lms/macros/hero.html new file mode 100644 index 0000000000..66bb861c46 --- /dev/null +++ b/erpnext/www/lms/macros/hero.html @@ -0,0 +1,55 @@ +{% macro hero(title, description, has_access, back) %} +
+ +

{{ title }}

+

{{ description or ''}}

+

+ {% if frappe.session.user == 'Guest' %} + Sign Up + {% elif not has_access %} + + {% endif %} +

+
+ +{% block script %} + +{% endblock %} +{% endmacro %} \ No newline at end of file diff --git a/erpnext/www/lms/profile.html b/erpnext/www/lms/profile.html new file mode 100644 index 0000000000..9508daedb7 --- /dev/null +++ b/erpnext/www/lms/profile.html @@ -0,0 +1,64 @@ +{% extends "templates/base.html" %} +{% block title %}Profile{% endblock %} +{% from "www/lms/macros/hero.html" import hero %} + +{% block head_include %} + +{% endblock %} + +{% macro card(program) %} +
+ + + +
+{% endmacro %} + +{% block content %} +
+
+ +

{{ student.first_name }} {{ student.last_name or '' }}

+

{{ student.name }}

+
+
+
+ {% for program in progress %} + {{ card(program) }} + {% endfor %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/profile.py b/erpnext/www/lms/profile.py new file mode 100644 index 0000000000..4788ea6e70 --- /dev/null +++ b/erpnext/www/lms/profile.py @@ -0,0 +1,26 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe + +no_cache = 1 + +def get_context(context): + if frappe.session.user == "Guest": + frappe.local.flags.redirect_location = '/lms' + raise frappe.Redirect + + context.student = utils.get_current_student() + if not context.student: + context.student = frappe.get_doc('User', frappe.session.user) + context.progress = get_program_progress(context.student.name) + +def get_program_progress(student): + enrolled_programs = frappe.get_all("Program Enrollment", filters={'student':student}, fields=['program']) + student_progress = [] + for list_item in enrolled_programs: + program = frappe.get_doc("Program", list_item.program) + progress = utils.get_program_progress(program) + completion = utils.get_program_completion(program) + student_progress.append({'program': program.program_name, 'name': program.name, 'progress':progress, 'completion': completion}) + + return student_progress \ No newline at end of file diff --git a/erpnext/www/lms/program.html b/erpnext/www/lms/program.html new file mode 100644 index 0000000000..b6d696653b --- /dev/null +++ b/erpnext/www/lms/program.html @@ -0,0 +1,87 @@ +{% extends "templates/base.html" %} +{% block title %}{{ program.program_name }}{% endblock %} +{% from "www/lms/macros/hero.html" import hero %} +{% from "www/lms/macros/card.html" import null_card %} + +{% block head_include %} + +{% endblock %} + + +{% macro card(course) %} +
+ +
+ {% if course.hero_image %} +
+ {% else %} +
+
+
+ {% endif %} +
+
{{ course.course_name }}
+
{{ course.description[:110] + '...' if course.description else '' }}
+
+ {% if has_access and progress[course.name] %} + + {% endif %} +
+
+
+{% endmacro %} + +{% block content %} +
+ {{ hero(program.program_name, program.description, has_access, {'name': 'Home', 'url': '/lms'}) }} +
+
+ {% for course in courses %} + {{ card(course) }} + {% endfor %} + {% if courses %} + {% for n in range(3 - ((courses|length)%3)) %} + {{ null_card() }} + {% endfor %} + {% endif %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py new file mode 100644 index 0000000000..1fcb3d3028 --- /dev/null +++ b/erpnext/www/lms/program.py @@ -0,0 +1,23 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe +from frappe import _ + +no_cache = 1 + +def get_context(context): + context.education_settings = frappe.get_single("Education Settings") + context.program = get_program(frappe.form_dict['program']) + context.courses = [frappe.get_doc("Course", course.course) for course in context.program.courses] + context.has_access = utils.allowed_program_access(frappe.form_dict['program']) + context.progress = get_course_progress(context.courses, context.program) + +def get_program(program_name): + try: + return frappe.get_doc('Program', program_name) + except frappe.DoesNotExistError: + frappe.throw(_("Program {0} does not exist.".format(program_name))) + +def get_course_progress(courses, program): + progress = {course.name: utils.get_course_progress(course, program) for course in courses} + return progress \ No newline at end of file diff --git a/erpnext/www/lms/topic.html b/erpnext/www/lms/topic.html new file mode 100644 index 0000000000..3bbfbd0936 --- /dev/null +++ b/erpnext/www/lms/topic.html @@ -0,0 +1,58 @@ +{% extends "templates/base.html" %} +{% block title %}Topic Title{% endblock %} +{% from "www/lms/macros/hero.html" import hero %} +{% from "www/lms/macros/card.html" import null_card %} + +{% block head_include %} + +{% endblock %} + + +{% macro card(content, index, length) %} +
+ +
+
+
{{ content.content_type or '' }}
+
{{ content.content.name }}
+
+ {% if has_access %} + + {% endif %} +
+
+
+{% endmacro %} + +{% block content %} +
+ {{ hero(topic.topic_name, topic.description, has_access, {'name': 'Course', 'url': '/lms/course?name=' + course +'&program=' + program}) }} +
+
+ {% for content in contents %} + {{ card(content, loop.index, topic.contents|length) }} + {% endfor %} + {% if contents %} + {% for n in range(3 - ((contents|length)%3)) %} + {{ null_card() }} + {% endfor %} + {% endif %} +
+
+
+{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/topic.py b/erpnext/www/lms/topic.py new file mode 100644 index 0000000000..0af0778312 --- /dev/null +++ b/erpnext/www/lms/topic.py @@ -0,0 +1,41 @@ +from __future__ import unicode_literals +import erpnext.education.utils as utils +import frappe + +no_cache = 1 + +def get_context(context): + course = frappe.form_dict['course'] + program = frappe.form_dict['program'] + topic = frappe.form_dict['topic'] + + context.program = program + context.course = course + context.topic = frappe.get_doc("Topic", topic) + context.contents = get_contents(context.topic, course, program) + context.has_access = utils.allowed_program_access(program) + +def get_contents(topic, course, program): + student = utils.get_current_student() + if student: + course_enrollment = utils.get_or_create_course_enrollment(course, program) + contents = topic.get_contents() + progress = [] + if contents: + for content in contents: + if content.doctype in ('Article', 'Video'): + if student: + status = utils.check_content_completion(content.name, content.doctype, course_enrollment.name) + else: + status = True + progress.append({'content': content, 'content_type': content.doctype, 'completed': status}) + elif content.doctype == 'Quiz': + if student: + status, score, result = utils.check_quiz_completion(content, course_enrollment.name) + else: + status = False + score = None + result = None + progress.append({'content': content, 'content_type': content.doctype, 'completed': status, 'score': score, 'result': result}) + + return progress \ No newline at end of file diff --git a/erpnext/www/test_lms.py b/erpnext/www/test_lms.py deleted file mode 100644 index e63f4c913e..0000000000 --- a/erpnext/www/test_lms.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2018, Frappe Technologies and Contributors -# See license.txt -from __future__ import unicode_literals -from erpnext.education.doctype.program.test_program import make_program_and_linked_courses - -import frappe -import unittest - -class TestLms(unittest.TestCase): - pass \ No newline at end of file