Пример #1
0
def run_background(instance):
    report = frappe.get_doc("Report", instance.ref_report_doctype)

    report.custom_columns = []

    if report.report_type == 'Custom Report':
        custom_report_doc = report
        reference_report = custom_report_doc.reference_report
        report = frappe.get_doc("Report", reference_report)
        report.custom_columns = custom_report_doc.json

    result = generate_report_result(report,
                                    filters=instance.filters,
                                    user=instance.owner)
    create_json_gz_file(result['result'], 'Prepared Report', instance.name)

    instance.status = "Completed"
    instance.columns = json.dumps(result["columns"])
    instance.report_end_time = frappe.utils.now()
    instance.save()

    frappe.publish_realtime('report_generated', {
        "report_name": instance.report_name,
        "name": instance.name
    },
                            user=frappe.session.user)
Пример #2
0
def run_background(prepared_report):
    instance = frappe.get_doc("Prepared Report", prepared_report)
    report = frappe.get_doc("Report", instance.ref_report_doctype)

    try:
        report.custom_columns = []

        if report.report_type == "Custom Report":
            custom_report_doc = report
            reference_report = custom_report_doc.reference_report
            report = frappe.get_doc("Report", reference_report)
            report.custom_columns = custom_report_doc.json

        result = generate_report_result(report=report,
                                        filters=instance.filters,
                                        user=instance.owner)
        create_json_gz_file(result["result"], "Prepared Report", instance.name)

        instance.status = "Completed"
        instance.columns = json.dumps(result["columns"])
        instance.report_end_time = frappe.utils.now()
        instance.save(ignore_permissions=True)

    except Exception:
        frappe.log_error(frappe.get_traceback())
        instance = frappe.get_doc("Prepared Report", prepared_report)
        instance.status = "Error"
        instance.error_message = frappe.get_traceback()
        instance.save(ignore_permissions=True)

    frappe.publish_realtime("report_generated", {
        "report_name": instance.report_name,
        "name": instance.name
    },
                            user=frappe.session.user)
Пример #3
0
def run_background(prepared_report):
	instance = frappe.get_doc("Prepared Report", prepared_report)
	report = frappe.get_doc("Report", instance.ref_report_doctype)

	try:
		report.custom_columns = []

		if report.report_type == 'Custom Report':
			custom_report_doc = report
			reference_report = custom_report_doc.reference_report
			report = frappe.get_doc("Report", reference_report)
			report.custom_columns = custom_report_doc.json

		result = generate_report_result(report, filters=instance.filters, user=instance.owner)
		create_json_gz_file(result['result'], 'Prepared Report', instance.name)

		instance.status = "Completed"
		instance.columns = json.dumps(result["columns"])
		instance.report_end_time = frappe.utils.now()
		instance.save()

	except Exception:
		frappe.log_error(frappe.get_traceback())
		instance = frappe.get_doc("Prepared Report", prepared_report)
		instance.status = "Error"
		instance.error_message = frappe.get_traceback()
		instance.save()

	frappe.publish_realtime(
		'report_generated',
		{"report_name": instance.report_name, "name": instance.name},
		user=frappe.session.user
	)
Пример #4
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
Пример #5
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
Пример #6
0
def run_background(instance):
    report = frappe.get_doc("Report", instance.ref_report_doctype)
    result = generate_report_result(report,
                                    filters=json.loads(instance.filters),
                                    user=instance.owner)
    create_csv_file(remove_header_meta(result['columns']), result['result'],
                    'Prepared Report', instance.name)

    instance.status = "Completed"
    instance.report_end_time = frappe.utils.now()
    instance.save()

    frappe.publish_realtime('report_generated',
                            {"report_name": instance.report_name},
                            user=frappe.session.user)
Пример #7
0
def run_background(instance):
	report = frappe.get_doc("Report", instance.ref_report_doctype)
	result = generate_report_result(report, filters=instance.filters, user=instance.owner)
	create_json_gz_file(result['result'], 'Prepared Report', instance.name)

	instance.status = "Completed"
	instance.columns = json.dumps(result["columns"])
	instance.report_end_time = frappe.utils.now()
	instance.save()

	frappe.publish_realtime(
		'report_generated',
		{"report_name": instance.report_name, "name": instance.name},
		user=frappe.session.user
	)
Пример #8
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
Пример #9
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')