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 }
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)
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}
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 }
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