Exemplo n.º 1
0
def generate_report_result(report, filters=None, user=None):
    status = None
    if not user:
        user = frappe.session.user
    if not filters:
        filters = []

    if filters and isinstance(filters, query_report.string_types):
        filters = json.loads(filters)
    columns, result, message, chart, data_to_be_printed = [], [], None, None, None
    if report.report_type == "Query Report":
        if not report.query:
            status = "error"
            frappe.msgprint(_("Must specify a Query to run"),
                            raise_exception=True)

        if not report.query.lower().startswith("select"):
            status = "error"
            frappe.msgprint(_("Query must be a SELECT"), raise_exception=True)

        result = [list(t) for t in frappe.db.sql(report.query, filters)]
        columns = [cstr(c[0]) for c in frappe.db.get_description()]
    else:
        module = report.module or frappe.db.get_value(
            "DocType", report.ref_doctype, "module")
        if report.is_standard == "Yes":
            method_name = query_report.get_report_module_dotted_path(
                module, report.name) + ".execute"
            res = []

            # The JOB
            res = frappe.get_attr(method_name)(frappe._dict(filters))

            columns, result = res[0], res[1]
            if len(res) > 2:
                message = res[2]
            if len(res) > 3:
                chart = res[3]
            if len(res) > 4:
                data_to_be_printed = res[4]

    if result:
        result = query_report.get_filtered_data(report.ref_doctype, columns,
                                                result, user)

    if cint(report.add_total_row) and result:
        result = query_report.add_total_row(result, columns)

    return {
        "result": result,
        "columns": columns,
        "message": message,
        "chart": chart,
        "data_to_be_printed": data_to_be_printed,
        "status": status
    }
Exemplo n.º 2
0
    def test_add_total_row_for_tree_reports(self):
        report_settings = {"tree": True, "parent_field": "parent_value"}

        columns = [
            {
                "fieldname": "parent_column",
                "label": "Parent Column",
                "fieldtype": "Data",
                "width": 10
            },
            {
                "fieldname": "column_1",
                "label": "Column 1",
                "fieldtype": "Float",
                "width": 10
            },
            {
                "fieldname": "column_2",
                "label": "Column 2",
                "fieldtype": "Float",
                "width": 10
            },
        ]

        result = [
            {
                "parent_column": "Parent 1",
                "column_1": 200,
                "column_2": 150.50
            },
            {
                "parent_column": "Child 1",
                "column_1": 100,
                "column_2": 75.25,
                "parent_value": "Parent 1"
            },
            {
                "parent_column": "Child 2",
                "column_1": 100,
                "column_2": 75.25,
                "parent_value": "Parent 1"
            },
        ]

        result = add_total_row(
            result,
            columns,
            meta=None,
            is_tree=report_settings["tree"],
            parent_field=report_settings["parent_field"],
        )
        self.assertEqual(result[-1][0], "Total")
        self.assertEqual(result[-1][1], 200)
        self.assertEqual(result[-1][2], 150.50)
Exemplo n.º 3
0
def compress(data, args={}):
    """separate keys and values"""
    from frappe.desk.query_report import add_total_row

    if not data: return data
    values = []
    keys = list(data[0])
    for row in data:
        new_row = []
        for key in keys:
            new_row.append(row.get(key))
        values.append(new_row)

    if args.get("add_total_row"):
        meta = frappe.get_meta(args.doctype)
        values = add_total_row(values, keys, meta)

    return {"keys": keys, "values": values}
Exemplo n.º 4
0
def compress(data, args = {}):
	"""separate keys and values"""
	from frappe.desk.query_report import add_total_row

	if not data: return data
	values = []
	keys = data[0].keys()
	for row in data:
		new_row = []
		for key in keys:
			new_row.append(row[key])
		values.append(new_row)

	if args.get("add_total_row"):
		meta = frappe.get_meta(args.doctype)
		values = add_total_row(values, keys, meta)

	return {
		"keys": keys,
		"values": values
	}
Exemplo n.º 5
0
def query_report_run(report_name, filters=None, user=None):
    from frappe.desk.query_report import (get_report_doc,
                                          get_prepared_report_result,
                                          generate_report_result,
                                          get_filtered_data, add_total_row)

    report = get_report_doc(report_name)
    if not user:
        user = frappe.session.user
    if not frappe.has_permission(report.ref_doctype, "report"):
        frappe.msgprint(
            frappe._("Must have report permission to access this report.",
                     raise_exception=True))

    result = None
    if report.prepared_report:
        if filters:
            if isinstance(filters, six.string_types):
                filters = json.loads(filters)

            dn = filters.get('prepared_report_name')
        else:
            dn = ''
        result = get_prepared_report_result(report, filters, dn)
    elif report.backend_js:
        threshold = 10
        res = []
        start_time = datetime.datetime.now()

        # The JOB
        def context_processor(jsi):
            jsi.evaljs('''
			var columns = [],
			    data = [],
				message = null,
				chart = [],
				data_to_be_printed = [],
				filters = dukpy.filters || {};
			delete dukpy;
			''')

        res = evaluate_js(report.backend_js +
                          '\n;[columns,data,message,chart,data_to_be_printed]',
                          default_context=False,
                          context_processor=context_processor)
        end_time = datetime.datetime.now()
        if (end_time -
                start_time).seconds > threshold and not report.prepared_report:
            report.db_set('prepared_report', 1)

        message, chart, data_to_be_printed = None, None, None
        columns, result = res[0], res[1]
        if len(res) > 2:
            message = res[2]
        if len(res) > 3:
            chart = res[3]
        if len(res) > 4:
            data_to_be_printed = res[4]

        if result:
            result = get_filtered_data(report.ref_doctype, columns, result,
                                       user)

        if cint(report.add_total_row) and result:
            result = add_total_row(result, columns)

        result = {
            'result': result,
            'columns': columns,
            'message': message,
            'chart': chart,
            'data_to_be_printed': data_to_be_printed,
            'status': None
        }

    else:
        result = generate_report_result(report, filters, user)

    return result