Example #1
0
 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
Example #2
0
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
Example #3
0
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)
Example #4
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
Example #5
0
def generate_report_meta(report_name):
    report = get_report_doc(report_name)
    report_res = generate_report_result(report=report)
    return report_res.get('columns')