def run_doc_method(method, docs=None, dt=None, dn=None, arg=None, args=None): """run a whitelisted controller method""" import inspect import json if not args: args = arg or "" if dt: # not called from a doctype (from a page) if not dn: dn = dt # single doc = frappe.get_doc(dt, dn) else: if isinstance(docs, str): docs = json.loads(docs) doc = frappe.get_doc(docs) doc._original_modified = doc.modified doc.check_if_latest() if not doc or not doc.has_permission("read"): throw_permission_error() try: args = json.loads(args) except ValueError: args = args method_obj = getattr(doc, method) fn = getattr(method_obj, "__func__", method_obj) is_whitelisted(fn) is_valid_http_method(fn) fnargs = inspect.getfullargspec(method_obj).args if not fnargs or (len(fnargs) == 1 and fnargs[0] == "self"): response = doc.run_method(method) elif "args" in fnargs or not isinstance(args, dict): response = doc.run_method(method, args) else: response = doc.run_method(method, **args) frappe.response.docs.append(doc) if not response: return # build output as csv if cint(frappe.form_dict.get("as_csv")): build_csv_response(response, _(doc.doctype).replace(" ", "")) return frappe.response["message"] = response
def download_raw_materials(doc, warehouses=None): if isinstance(doc, str): doc = frappe._dict(json.loads(doc)) item_list = [[ 'Item Code', 'Description', 'Stock UOM', 'Warehouse', 'Required Qty as per BOM', 'Projected Qty', 'Available Qty In Hand', 'Ordered Qty', 'Planned Qty', 'Reserved Qty for Production', 'Safety Stock', 'Required Qty' ]] doc.warehouse = None frappe.flags.show_qty_in_stock_uom = 1 items = get_items_for_material_requests(doc, warehouses=warehouses, get_parent_warehouse_data=True) for d in items: item_list.append([ d.get('item_code'), d.get('description'), d.get('stock_uom'), d.get('warehouse'), d.get('required_bom_qty'), d.get('projected_qty'), d.get('actual_qty'), d.get('ordered_qty'), d.get('planned_qty'), d.get('reserved_qty_for_production'), d.get('safety_stock'), d.get('quantity') ]) if not doc.get('for_warehouse'): row = {'item_code': d.get('item_code')} for bin_dict in get_bin_details(row, doc.company, all_warehouse=True): if d.get("warehouse") == bin_dict.get('warehouse'): continue item_list.append([ '', '', '', bin_dict.get('warehouse'), '', bin_dict.get('projected_qty', 0), bin_dict.get('actual_qty', 0), bin_dict.get('ordered_qty', 0), bin_dict.get('reserved_qty_for_production', 0) ]) build_csv_response(item_list, doc.name)
def download_raw_materials(doc): if isinstance(doc, string_types): doc = frappe._dict(json.loads(doc)) item_list = [[ 'Item Code', 'Description', 'Stock UOM', 'Warehouse', 'Required Qty as per BOM', 'Projected Qty', 'Actual Qty', 'Ordered Qty', 'Reserved Qty for Production', 'Safety Stock', 'Required Qty' ]] for d in get_items_for_material_requests(doc): item_list.append([ d.get('item_code'), d.get('description'), d.get('stock_uom'), d.get('warehouse'), d.get('required_bom_qty'), d.get('projected_qty'), d.get('actual_qty'), d.get('ordered_qty'), d.get('reserved_qty_for_production'), d.get('safety_stock'), d.get('quantity') ]) if not doc.get('for_warehouse'): row = {'item_code': d.get('item_code')} for bin_dict in get_bin_details(row, doc.company, all_warehouse=True): if d.get("warehouse") == bin_dict.get('warehouse'): continue item_list.append([ '', '', '', bin_dict.get('warehouse'), '', bin_dict.get('projected_qty', 0), bin_dict.get('actual_qty', 0), bin_dict.get('ordered_qty', 0), bin_dict.get('reserved_qty_for_production', 0) ]) build_csv_response(item_list, doc.name)
def export_errored_rows(self): from frappe.utils.csvutils import build_csv_response if not self.data_import: return import_log = frappe.parse_json(self.data_import.import_log or "[]") failures = [l for l in import_log if l.get("success") == False] row_indexes = [] for f in failures: row_indexes.extend(f.get("row_indexes", [])) # de duplicate row_indexes = list(set(row_indexes)) row_indexes.sort() header_row = [col.header_title for col in self.columns[1:]] rows = [header_row] rows += [row[1:] for row in self.rows if row[0] in row_indexes] build_csv_response(rows, self.doctype)
def download_raw_materials(production_plan): doc = frappe.get_doc('Production Plan', production_plan) doc.check_permission() item_list = [['Item Code', 'Description', 'Stock UOM', 'Required Qty', 'Warehouse', 'projected Qty', 'Actual Qty']] doc = doc.as_dict() for d in get_items_for_material_requests(doc, ignore_existing_ordered_qty=True): item_list.append([d.get('item_code'), d.get('description'), d.get('stock_uom'), d.get('quantity'), d.get('warehouse'), d.get('projected_qty'), d.get('actual_qty')]) if not doc.for_warehouse: row = {'item_code': d.get('item_code')} for bin_dict in get_bin_details(row, doc.company, all_warehouse=True): if d.get("warehouse") == bin_dict.get('warehouse'): continue item_list.append(['', '', '', '', bin_dict.get('warehouse'), bin_dict.get('projected_qty', 0), bin_dict.get('actual_qty', 0)]) build_csv_response(item_list, doc.name)
def export_errored_rows(self): from frappe.utils.csvutils import build_csv_response if not self.data_import: return import_log = frappe.parse_json(self.data_import.import_log or "[]") failures = [log for log in import_log if not log.get("success")] row_indexes = [] for f in failures: row_indexes.extend(f.get("row_indexes", [])) # de duplicate row_indexes = list(set(row_indexes)) row_indexes.sort() header_row = [col.header_title for col in self.import_file.columns] rows = [header_row] rows += [ row.data for row in self.import_file.data if row.row_number in row_indexes ] build_csv_response(rows, _(self.doctype))
def download_raw_materials(doc, warehouses=None): if isinstance(doc, str): doc = frappe._dict(json.loads(doc)) item_list = [[ "Item Code", "Item Name", "Description", "Stock UOM", "Warehouse", "Required Qty as per BOM", "Projected Qty", "Available Qty In Hand", "Ordered Qty", "Planned Qty", "Reserved Qty for Production", "Safety Stock", "Required Qty", ]] doc.warehouse = None frappe.flags.show_qty_in_stock_uom = 1 items = get_items_for_material_requests(doc, warehouses=warehouses, get_parent_warehouse_data=True) for d in items: item_list.append([ d.get("item_code"), d.get("item_name"), d.get("description"), d.get("stock_uom"), d.get("warehouse"), d.get("required_bom_qty"), d.get("projected_qty"), d.get("actual_qty"), d.get("ordered_qty"), d.get("planned_qty"), d.get("reserved_qty_for_production"), d.get("safety_stock"), d.get("quantity"), ]) if not doc.get("for_warehouse"): row = {"item_code": d.get("item_code")} for bin_dict in get_bin_details(row, doc.company, all_warehouse=True): if d.get("warehouse") == bin_dict.get("warehouse"): continue item_list.append([ "", "", "", bin_dict.get("warehouse"), "", bin_dict.get("projected_qty", 0), bin_dict.get("actual_qty", 0), bin_dict.get("ordered_qty", 0), bin_dict.get("reserved_qty_for_production", 0), ]) build_csv_response(item_list, doc.name)
def build_csv_response(self): build_csv_response(self.get_csv_array_for_export(), self.doctype)