def execute(self, filters=None): # TODO - Fix would be needed to not trigger multiple same reports for the one rendered on the Dashboard. # Also, Filters need to be streamlined. Processing happens on the front end. if self.data_source == 'Method': return frappe.call(self.method) if self.data_source == 'Report': report = get_report_doc(self.report) qry_filters = frappe._dict() if filters: filters = json.loads(filters) for fil in self.filter: for gt_fl in filters.keys(): if gt_fl == fil.filter_data_slice: qry_filters.update( {fil.mapped_filter_field: filters[gt_fl]}) if report.report_type == 'Report Builder': print(report.report_type) report_json = json.loads(report.json) report_fields = [rf[0] for rf in report_json.get('fields')] #frappe.local.form_dict.update(frappe._dict( vargs = frappe._dict(doctype=report.ref_doctype, fields=report_fields, filters=qry_filters or []) return compress(execute(**vargs), args=vargs) return generate_report_result(report=report, filters=qry_filters or []) return None
def run(report_name, filters=None, user=None, ignore_prepared_report=False, custom_columns=None): report = get_report_doc(report_name) if not user: user = frappe.session.user if not frappe.has_permission(report.ref_doctype, "report"): frappe.msgprint( _("Must have report permission to access this report."), raise_exception=True) result = None if report.prepared_report and not report.disable_prepared_report and not ignore_prepared_report and not custom_columns: if filters: if isinstance(filters, string_types): filters = json.loads(filters) dn = filters.get("prepared_report_name") filters.pop("prepared_report_name", None) else: dn = "" result = get_prepared_report_result(report, filters, dn, user) else: result = generate_report_result(report, filters, user, custom_columns) result["add_total_row"] = report.add_total_row and not result.get( 'skip_total_row', False) allowed_roles = ['Accounts Manager'] if "result" not in result: return result for ar in allowed_roles: if ar in frappe.get_roles(): return result if (report_name == "Stock Ledger"): for i, o in enumerate(result['result']): del o['incoming_rate'] del o['valuation_rate'] del o['stock_value'] elif (report_name == "Stock Balance"): for i, o in enumerate(result['result']): if "in_val" in o: o.pop('out_val') o.pop('bal_val') o.pop('in_val') o.pop('opening_val') o.pop('val_rate') return result
def generate_reports(): """reports generated by scheduler at midnight""" reports = ["Accounts Receivable"] for report in reports: report_doc = get_report_doc(report) prepared_report = frappe.new_doc("Prepared Report") prepared_report.update({ "report_name": report, "filters": json.dumps(FILTERS.get(report, {})), "ref_report_doctype": report, "report_type": report_doc.report_type, "query": report_doc.query, "module": report_doc.module }) prepared_report.save(ignore_permissions=True) run_background(prepared_report.name)
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
def generate_report_meta(report_name): report = get_report_doc(report_name) report_res = generate_report_result(report=report) return report_res.get('columns')