Example #1
0
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
Example #2
0
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)
Example #3
0
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)
Example #4
0
	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)
Example #5
0
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)
Example #6
0
    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))
Example #7
0
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)
Example #8
0
 def build_csv_response(self):
     build_csv_response(self.get_csv_array_for_export(), self.doctype)