diff --git a/frappe/core/doctype/background_report/background_report.json b/frappe/core/doctype/background_report/background_report.json index 4da74b18c0..6e0428b8c6 100644 --- a/frappe/core/doctype/background_report/background_report.json +++ b/frappe/core/doctype/background_report/background_report.json @@ -84,7 +84,7 @@ "collapsible": 0, "columns": 0, "fieldname": "status", - "fieldtype": "Data", + "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -95,6 +95,71 @@ "label": "Status", "length": 0, "no_copy": 0, + "options": "done\nerror\nopen", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "report_start_time", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Report Start Time", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "report_end_time", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Report End Time", + "length": 0, + "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, @@ -151,7 +216,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-06-08 10:31:57.428394", + "modified": "2018-06-12 00:31:44.112016", "modified_by": "Administrator", "module": "Core", "name": "Background Report", diff --git a/frappe/core/doctype/background_report/background_report.py b/frappe/core/doctype/background_report/background_report.py index 410f42b2ff..346733a11f 100644 --- a/frappe/core/doctype/background_report/background_report.py +++ b/frappe/core/doctype/background_report/background_report.py @@ -6,5 +6,8 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document + class BackgroundReport(Document): - pass + + def before_insert(self): + print "shrihari" \ No newline at end of file diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index ce4c612afc..5f963f905f 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -5,6 +5,8 @@ from __future__ import unicode_literals import frappe import os, json +import csv +from datetime import datetime from frappe import _ from frappe.modules import scrub, get_module_path @@ -16,6 +18,7 @@ from frappe.permissions import get_role_permissions from six import string_types, iteritems from frappe.utils.background_jobs import enqueue from frappe.utils.file_manager import save_file +import base64 def get_report_doc(report_name): @@ -72,6 +75,7 @@ def generate_report_result(report, filters, user): "data_to_be_printed": data_to_be_printed } + @frappe.whitelist() def get_script(report_name): report = get_report_doc(report_name) @@ -105,11 +109,54 @@ def get_script(report_name): } -@frappe.whitelist() +def create_csv_file(columns, data, doctype): + print columns + column_list = [str(d) for d in columns] # create the list of column labels + csv_filename = '{0}.csv'.format(datetime.now().strftime("%Y%m%d-%H%M%S")) + # + with open(csv_filename, 'wb') as out: + csv_out = csv.writer(out) + csv_out.writerow(column_list) + for row in data: + csv_out.writerow(row) + + with open(csv_filename, "rb") as f: # encode the content of csv + encoded = base64.b64encode(f.read()) + + save_file( # call save_file function to upload the file + fname=csv_filename, + content=encoded, + dt='', + dn=docname, + df=docfield, + folder=None, + decode=True, + is_private=0) + + def background_enqueue_run(report, filters=None, user=None): - report_instance = frappe.get_doc({"docType": "Background Report"}) - report_instance.insert(ignore_permissions = True) - return generate_report_result(report, filters, user) + track_instance = \ + frappe.get_doc({ + "doctype": "Background Report", + "filters": "filters to be saved", + "status":"open", + "report_start_time": frappe.utils.now() + }) + track_instance.insert(ignore_permissions=True) + frappe.db.commit() + results = generate_report_result(report, filters, user) + print results + if results: + create_csv_file(results['columns'], results['result']) + track_instance.status = "done" + track_instance.view_report = "http://google.com" + else: + track_instance.status = "error" + + track_instance.report_end_time = frappe.utils.now() + track_instance.save() + frappe.db.commit() + return results @frappe.whitelist() @@ -130,7 +177,7 @@ def run(report_name, filters=None, user=None): raise_exception=True) if report.background_report: - return background_enqueue_run(report, filters, user) + return background_enqueue_run(report, filters, report, user) #enqueue('frappe.desk.query_report.background_enqueue_run', queue='background') # frappe.msgprint(_("This is a background job"), raise_exception=True) else: diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py index 4eafaae75f..6117ce132e 100755 --- a/frappe/utils/background_jobs.py +++ b/frappe/utils/background_jobs.py @@ -70,13 +70,16 @@ def enqueue(method, queue='default', timeout=300, event=None, def enqueue_doc(doctype, name=None, method=None, queue='default', timeout=300, now=False, **kwargs): + '''Enqueue a method to be run on a document''' enqueue('frappe.utils.background_jobs.run_doc_method', doctype=doctype, name=name, doc_method=method, queue=queue, timeout=timeout, now=now, **kwargs) + def run_doc_method(doctype, name, doc_method, **kwargs): getattr(frappe.get_doc(doctype, name), doc_method)(**kwargs) + def execute_job(site, method, event, job_name, kwargs, user=None, async=True, retry=0): '''Executes job in a worker, performs commit/rollback and logs if there is any error''' from frappe.utils.scheduler import log