[report] make run() agnostic of data source

This commit is contained in:
Prateeksha Singh 2018-06-29 13:17:10 +05:30
parent 658d463b58
commit c7154eed16
5 changed files with 100 additions and 82 deletions

View file

@ -4,28 +4,13 @@
frappe.ui.form.on('Prepared Report', {
refresh: function(frm) {
frm.add_custom_button(__("Show Report"), function() {
return frm.call({
method: "frappe.core.doctype.prepared_report.prepared_report.get_report_attachment_data",
args: {
dn: frm.doc.name
},
callback: function(r) {
if(r.message) {
let data = r.message;
frappe.flags.prepared_report = {
data: data,
name: frm.doc.name,
generated_on: frm.doc.report_end_time,
filters: JSON.parse(frm.doc.filters)
};
frappe.route_options = JSON.parse(JSON.parse(frm.doc.filters));
frappe.set_route("query-report", frm.doc.report_name);
}
}
});
frappe.set_route(
"query-report",
frm.doc.report_name,
frappe.utils.make_query_string({
prepared_report_name: frm.doc.name
})
);
});
}
});

View file

@ -150,25 +150,38 @@ def run(report_name, filters=None, user=None):
raise_exception=True)
if report.prepared_report:
doc_list = frappe.get_list("Prepared Report", filters={"status": "Completed", "ref_report_doctype": report})
columns = []
result = []
if len(doc_list):
doc = frappe.get_doc("Prepared Report", doc_list[0])
data = read_csv_content_from_attached_file(doc)
columns = data[0]
result = data[1:]
return {
"message": "Prepared Report",
"prepared_report": True,
"data": {
"columns": columns,
"result": result
}
}
if filters:
dn = json.loads(filters).get("prepared_report_name")
else:
dn = ""
return get_prepared_report_result(report, filters, dn)
else:
return generate_report_result(report, filters, user)
def get_prepared_report_result(report, filters, dn=""):
latest_report_data = {}
doc_list = frappe.get_list("Prepared Report", filters={"status": "Completed", "ref_report_doctype": report})
if len(doc_list):
if dn:
# Get specified dn
doc = frappe.get_doc("Prepared Report", dn)
else:
# Get latest
doc = frappe.get_doc("Prepared Report", doc_list[0])
data = read_csv_content_from_attached_file(doc)
latest_report_data = {
"columns": data[0],
"result": data[1:]
}
return {
"prepared_report": True,
"data": latest_report_data,
"doc": doc
}
@frappe.whitelist()
def export_query():

View file

@ -4,6 +4,15 @@ function get_url_arg(name) {
return get_query_params()[name] || "";
}
function get_query_string(url) {
if(url.includes("?")) {
return url.slice(url.indexOf("?")+1);
}
else {
return "";
}
}
function get_query_params(query_string) {
var query_params = {};
if (!query_string) {
@ -61,6 +70,7 @@ function make_query_string(obj, encode=true) {
Object.assign(frappe.utils, {
get_url_arg,
get_query_string,
get_query_params,
make_query_string
});

View file

@ -416,6 +416,8 @@ frappe.ui.Page = Class.extend({
let $message = $(`<span class='inner-page-message text-muted small'>${message}</div>`);
this.inner_toolbar.find('.inner-page-message').remove();
this.inner_toolbar.removeClass("hide").prepend($message);
return $message;
},
clear_inner_toolbar: function() {

View file

@ -204,45 +204,63 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
}
refresh() {
const flags = frappe.flags.prepared_report;
this.toggle_message(true);
let filters = this.get_filter_values(true);
if(flags) {
const prepared_data = flags.data;
this.init_report_with_data(prepared_data);
this.toggle_to_button();
return;
let query = frappe.utils.get_query_string(frappe.get_route_str());
if(query) {
let obj = frappe.utils.get_query_params(query);
filters = Object.assign(filters || {}, obj);
}
if(!this.prepared_report){
this.toggle_message(true);
const filters = this.get_filter_values(true);
return new Promise(resolve => frappe.call({
method: 'frappe.desk.query_report.run',
type: 'GET',
args: {
report_name: this.report_name,
filters: filters
},
callback: resolve
})).then(r => {
this.init_report_with_data(r.message);
});
}
return new Promise(resolve => frappe.call({
method: 'frappe.desk.query_report.run',
type: 'GET',
args: {
report_name: this.report_name,
filters: filters,
},
callback: resolve
})).then(r => {
let data = r.message;
if (data.prepared_report){
this.prepared_report = true;
this.add_prepared_report_buttons(data.doc);
data = data.data;
}
this.toggle_message(false);
if (data.result && data.result.length) {
this.render_chart(data);
this.render_report(data);
} else {
this.toggle_nothing_to_show(true);
}
});
}
init_report_with_data(data) {
if (data.prepared_report){
this.prepared_report = true;
this.toggle_to_button();
data = data.data;
}
this.toggle_message(false);
if (data.result && data.result.length) {
this.render_chart(data);
this.render_report(data);
} else {
this.toggle_nothing_to_show(true);
}
add_prepared_report_buttons(doc) {
this.page.add_inner_button(__("Download Report"), function () {
frappe.call({
method:"frappe.core.doctype.prepared_report.prepared_report.download_attachment",
args: {"dn": flags.name}
});
});
let $message = this.page.add_inner_message(__(`
This report was <a href=#Form/Prepared%20Report/${doc.name}>generated</a>
on ${doc.report_end_time}.
<a class="generated_report_list">See all</a>.
`));
$message.on('click', () => {
frappe.route_options = {
report_name: doc.report_name,
filters: doc.filters
};
frappe.set_route("List", "Prepared Report");
})
}
render_background_report() {
@ -630,16 +648,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
toggle_nothing_to_show(flag) {
this.toggle_message(flag, __('Nothing to show'));
}
toggle_to_button(){
this.page.add_inner_button(__("Download Report"), function () {
frappe.call({
method:"frappe.core.doctype.prepared_report.prepared_report.download_attachment",
args: {"dn": flags.name}
});
});
this.page.add_inner_message(__("This report was generated on " + flags.generated_on));
}
toggle_message(flag, message) {
if (flag) {
this.$message.find('div').html(message);