Fixed merge conflict
This commit is contained in:
commit
8c91e46563
10 changed files with 192 additions and 23 deletions
|
|
@ -188,9 +188,6 @@ def connect(site=None, db_name=None):
|
|||
local.db = get_db(user=db_name or local.conf.db_name)
|
||||
set_user("Administrator")
|
||||
|
||||
for hook in get_hooks("connect") or []:
|
||||
get_attr(hook)()
|
||||
|
||||
def connect_read_only():
|
||||
from frappe.database import get_db
|
||||
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ def get_contact_details(contact):
|
|||
out = {
|
||||
"contact_person": contact.get("name"),
|
||||
"contact_display": " ".join(filter(None,
|
||||
[contact.get("first_name"), contact.get("last_name")])),
|
||||
[contact.get("salutation"), contact.get("first_name"), contact.get("last_name")])),
|
||||
"contact_email": contact.get("email_id"),
|
||||
"contact_mobile": contact.get("mobile_no"),
|
||||
"contact_phone": contact.get("phone"),
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "report_name",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
|
|
@ -52,6 +53,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "ref_doctype",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
|
|
@ -84,6 +86,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "is_standard",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
|
|
@ -116,6 +119,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "module",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
|
|
@ -148,6 +152,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "add_total_row",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
|
|
@ -179,6 +184,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "column_break_4",
|
||||
"fieldtype": "Column Break",
|
||||
"hidden": 0,
|
||||
|
|
@ -209,6 +215,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "report_type",
|
||||
"fieldtype": "Select",
|
||||
"hidden": 0,
|
||||
|
|
@ -241,6 +248,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "disabled",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
|
|
@ -272,6 +280,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "icon",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
|
|
@ -304,6 +313,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "color",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 0,
|
||||
|
|
@ -337,6 +347,7 @@
|
|||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval: doc.is_standard == \"No\"",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "letter_head",
|
||||
"fieldtype": "Link",
|
||||
"hidden": 0,
|
||||
|
|
@ -370,6 +381,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "section_break_6",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
|
|
@ -401,6 +413,7 @@
|
|||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.report_type==\"Query Report\"",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "query",
|
||||
"fieldtype": "Code",
|
||||
"hidden": 0,
|
||||
|
|
@ -434,6 +447,7 @@
|
|||
"columns": 0,
|
||||
"depends_on": "",
|
||||
"description": "JavaScript Format: frappe.query_reports['REPORTNAME'] = {}",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "javascript",
|
||||
"fieldtype": "Code",
|
||||
"hidden": 1,
|
||||
|
|
@ -466,6 +480,7 @@
|
|||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.report_type==\"Report Builder\"",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "json",
|
||||
"fieldtype": "Code",
|
||||
"hidden": 0,
|
||||
|
|
@ -497,6 +512,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "permission_rules",
|
||||
"fieldtype": "Section Break",
|
||||
"hidden": 0,
|
||||
|
|
@ -530,6 +546,7 @@
|
|||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"depends_on": "eval:doc.is_standard == 'Yes'",
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "roles",
|
||||
"fieldtype": "Table",
|
||||
"hidden": 0,
|
||||
|
|
@ -563,6 +580,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "disable_prepared_report",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 0,
|
||||
|
|
@ -595,6 +613,7 @@
|
|||
"bold": 0,
|
||||
"collapsible": 0,
|
||||
"columns": 0,
|
||||
"fetch_if_empty": 0,
|
||||
"fieldname": "prepared_report",
|
||||
"fieldtype": "Check",
|
||||
"hidden": 1,
|
||||
|
|
@ -633,7 +652,7 @@
|
|||
"issingle": 0,
|
||||
"istable": 0,
|
||||
"max_attachments": 0,
|
||||
"modified": "2019-01-25 12:04:50.833264",
|
||||
"modified": "2019-04-07 20:32:30.943582",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "Report",
|
||||
|
|
|
|||
|
|
@ -150,14 +150,11 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE',
|
|||
if assigned_by==owner:
|
||||
return
|
||||
|
||||
from frappe.boot import get_fullnames
|
||||
user_info = get_fullnames()
|
||||
|
||||
# Search for email address in description -- i.e. assignee
|
||||
from frappe.utils import get_link_to_form
|
||||
assignment = get_link_to_form(doc_type, doc_name, label="%s: %s" % (doc_type, doc_name))
|
||||
owner_name = user_info.get(owner, {}).get('fullname')
|
||||
user_name = user_info.get(frappe.session.get('user'), {}).get('fullname')
|
||||
owner_name = frappe.get_cached_value('User', owner, 'full_name')
|
||||
user_name = frappe.get_cached_value('User', frappe.session.user, 'full_name')
|
||||
if action=='CLOSE':
|
||||
if owner == frappe.session.get('user'):
|
||||
arg = {
|
||||
|
|
|
|||
|
|
@ -353,6 +353,14 @@ def add_total_row(result, columns, meta = None):
|
|||
result.append(total_row)
|
||||
return result
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_data_for_custom_field(doctype, field):
|
||||
|
||||
value_map = frappe._dict(frappe.get_all(doctype,
|
||||
fields=["name", field],
|
||||
as_list=1))
|
||||
|
||||
return value_map
|
||||
|
||||
def get_filtered_data(ref_doctype, columns, data, user):
|
||||
result = []
|
||||
|
|
|
|||
|
|
@ -57,10 +57,13 @@ def search_link(doctype, txt, query=None, filters=None, page_length=20, searchfi
|
|||
# this is called by the search box
|
||||
@frappe.whitelist()
|
||||
def search_widget(doctype, txt, query=None, searchfield=None, start=0,
|
||||
page_length=10, filters=None, filter_fields=None, as_dict=False, reference_doctype=None, ignore_user_permissions=False):
|
||||
page_length=20, filters=None, filter_fields=None, as_dict=False, reference_doctype=None, ignore_user_permissions=False):
|
||||
|
||||
start = cint(start)
|
||||
|
||||
if isinstance(filters, string_types):
|
||||
filters = json.loads(filters)
|
||||
|
||||
|
||||
if searchfield:
|
||||
sanitize_searchfield(searchfield)
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ def create_email_flag_queue(names, action):
|
|||
return
|
||||
|
||||
for name in json.loads(names or []):
|
||||
uid, seen_status, email_account = frappe.db.get_value("Communication", name,
|
||||
uid, seen_status, email_account = frappe.db.get_value("Communication", name,
|
||||
["ifnull(uid, -1)", "ifnull(seen, 0)", "email_account"])
|
||||
|
||||
# can not mark email SEEN or UNSEEN without uid
|
||||
|
|
@ -92,7 +92,7 @@ def create_email_flag_queue(names, action):
|
|||
"email_account": email_account
|
||||
})
|
||||
flag_queue.save(ignore_permissions=True)
|
||||
frappe.db.set_value("Communication", name, "seen", seen,
|
||||
frappe.db.set_value("Communication", name, "seen", seen,
|
||||
update_modified=False)
|
||||
mark_as_seen_unseen(name, action)
|
||||
|
||||
|
|
@ -109,7 +109,7 @@ def mark_as_spam(communication, sender):
|
|||
frappe.get_doc({
|
||||
"doctype": "Email Rule",
|
||||
"email_id": sender,
|
||||
"is_spam": 1
|
||||
"is_spam": 1
|
||||
}).insert(ignore_permissions=True)
|
||||
frappe.db.set_value("Communication", communication, "email_status", "Spam")
|
||||
|
||||
|
|
@ -142,8 +142,11 @@ def make_lead_from_communication(communication, ignore_communication_links=False
|
|||
""" raise a issue from email """
|
||||
|
||||
doc = frappe.get_doc("Communication", communication)
|
||||
frappe.errprint(doc.sender_full_name)
|
||||
lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender,"mobile_no": doc.phone_no})
|
||||
lead_name = None
|
||||
if doc.sender:
|
||||
lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender})
|
||||
if not lead_name and doc.mobile_no:
|
||||
lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no})
|
||||
if not lead_name:
|
||||
lead = frappe.get_doc({
|
||||
"doctype": "Lead",
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
make: function () {
|
||||
var me = this;
|
||||
|
||||
this.start = 0;
|
||||
this.dialog = new frappe.ui.Dialog({
|
||||
title: __("Select {0}", [(this.doctype == '[Select]') ? __("value") : __(this.doctype)]),
|
||||
fields: [
|
||||
|
|
@ -27,10 +28,17 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
},
|
||||
{
|
||||
fieldtype: "HTML", fieldname: "results"
|
||||
},
|
||||
{
|
||||
fieldtype: "Button", fieldname: "more", label: __("More"), click: () => {
|
||||
me.start += 20;
|
||||
me.search();
|
||||
}
|
||||
}
|
||||
],
|
||||
primary_action_label: __("Search"),
|
||||
primary_action: function () {
|
||||
me.start = 0;
|
||||
me.search();
|
||||
}
|
||||
});
|
||||
|
|
@ -40,6 +48,7 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
|
||||
this.dialog.get_input("txt").on("keypress", function (e) {
|
||||
if (e.which === 13) {
|
||||
me.start = 0;
|
||||
me.search();
|
||||
}
|
||||
});
|
||||
|
|
@ -49,7 +58,8 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
search: function () {
|
||||
var args = {
|
||||
txt: this.dialog.fields_dict.txt.get_value(),
|
||||
searchfield: "name"
|
||||
searchfield: "name",
|
||||
start: this.start
|
||||
};
|
||||
var me = this;
|
||||
|
||||
|
|
@ -66,7 +76,10 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
|
||||
frappe.link_search(this.doctype, args, function (r) {
|
||||
var parent = me.dialog.fields_dict.results.$wrapper;
|
||||
parent.empty();
|
||||
if (args.start === 0) {
|
||||
parent.empty();
|
||||
}
|
||||
|
||||
if (r.values.length) {
|
||||
$.each(r.values, function (i, v) {
|
||||
var row = $(repl('<div class="row link-select-row">\
|
||||
|
|
@ -108,6 +121,12 @@ frappe.ui.form.LinkSelector = Class.extend({
|
|||
frappe.new_doc(me.doctype);
|
||||
});
|
||||
}
|
||||
|
||||
if (r.values.length < 20) {
|
||||
var more_btn = me.dialog.fields_dict.more.$wrapper;
|
||||
more_btn.hide();
|
||||
}
|
||||
|
||||
}, this.dialog.get_primary_btn());
|
||||
|
||||
},
|
||||
|
|
|
|||
|
|
@ -321,7 +321,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
this.add_prepared_report_buttons(data.doc);
|
||||
}
|
||||
this.toggle_message(false);
|
||||
|
||||
if (data.result && data.result.length) {
|
||||
this.prepare_report_data(data);
|
||||
|
||||
|
|
@ -418,12 +417,13 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
this.raw_data = data;
|
||||
this.columns = this.prepare_columns(data.columns);
|
||||
this.data = this.prepare_data(data.result);
|
||||
|
||||
this.linked_doctypes = this.get_linked_doctypes();
|
||||
this.tree_report = this.data.some(d => 'indent' in d);
|
||||
}
|
||||
|
||||
render_datatable() {
|
||||
let data = this.data;
|
||||
|
||||
if (this.raw_data.add_total_row) {
|
||||
data = data.slice();
|
||||
data.splice(-1, 1);
|
||||
|
|
@ -962,6 +962,69 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
action: () => frappe.set_route('List', 'Auto Email Report', {'report' : this.report_name}),
|
||||
standard: true
|
||||
},
|
||||
{
|
||||
label: __('Add Column'),
|
||||
action: () => {
|
||||
let d = new frappe.ui.Dialog({
|
||||
title: __('Add Column'),
|
||||
fields: [
|
||||
{
|
||||
fieldtype: 'Select',
|
||||
fieldname: 'doctype',
|
||||
label: __('From Document Type'),
|
||||
options: this.linked_doctypes.map(df => ({ label: df.doctype, value: df.doctype })),
|
||||
change: () => {
|
||||
let doctype = d.get_value('doctype');
|
||||
frappe.model.with_doctype(doctype, () => {
|
||||
let fields = frappe.meta.get_docfields(doctype)
|
||||
.map(df => ({ label: df.label, value: df.fieldname }));
|
||||
d.set_df_property('field', 'options', fields);
|
||||
|
||||
});
|
||||
}
|
||||
},
|
||||
{
|
||||
fieldtype: 'Select',
|
||||
label: __('Field'),
|
||||
fieldname: 'field',
|
||||
options: []
|
||||
},
|
||||
{
|
||||
fieldtype: 'Select',
|
||||
label: __('Insert After'),
|
||||
fieldname: 'insert_after',
|
||||
options: this.columns.map(df => df.label)
|
||||
}
|
||||
],
|
||||
primary_action: (values) => {
|
||||
const custom_columns = [];
|
||||
let df = frappe.meta.get_docfield(values.doctype, values.field);
|
||||
custom_columns.push({
|
||||
fieldname: df.fieldname,
|
||||
fieldtype: df.fieldtype,
|
||||
label: df.label,
|
||||
width: 100
|
||||
});
|
||||
frappe.call({
|
||||
method: 'frappe.desk.query_report.get_data_for_custom_field',
|
||||
args: {
|
||||
field: values.field,
|
||||
doctype: values.doctype
|
||||
},
|
||||
callback: (r) => {
|
||||
const custom_data = r.message;
|
||||
const link_field = this.doctype_field_map[values.doctype];
|
||||
this.add_custom_column(custom_columns, custom_data, link_field, values.field, values.insert_after);
|
||||
d.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
d.show();
|
||||
},
|
||||
standard: true
|
||||
},
|
||||
{
|
||||
label: __('User Permissions'),
|
||||
action: () => frappe.set_route('List', 'User Permission', {
|
||||
|
|
@ -974,6 +1037,64 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
];
|
||||
}
|
||||
|
||||
add_custom_column(custom_column, custom_data, link_field, column_field, insert_after) {
|
||||
const column = this.prepare_columns(custom_column);
|
||||
|
||||
const insert_after_index = this.columns
|
||||
.findIndex(column => column.label === insert_after);
|
||||
this.columns.splice(insert_after_index + 1, 0, column[0]);
|
||||
|
||||
this.data.forEach(row => {
|
||||
row[column_field] = custom_data[row[link_field]];
|
||||
});
|
||||
|
||||
this.render_datatable();
|
||||
}
|
||||
|
||||
get_linked_doctypes() {
|
||||
let doctypes = [];
|
||||
let dynamic_links = [];
|
||||
let dynamic_doctypes = new Set();
|
||||
this.doctype_field_map = {};
|
||||
|
||||
this.columns.forEach(df => {
|
||||
if (df.fieldtype == "Link" && df.options && df.options != "Currency") {
|
||||
doctypes.push({
|
||||
doctype: df.options,
|
||||
fieldname: df.fieldname
|
||||
});
|
||||
}
|
||||
else if (df.fieldtype == "Dynamic Link" && df.options) {
|
||||
dynamic_links.push({
|
||||
link_name: df.options,
|
||||
fieldname: df.fieldname
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
this.data.forEach(row => {
|
||||
dynamic_links.forEach(field => {
|
||||
if (row[field.link_name]){
|
||||
dynamic_doctypes.add(row[field.link_name] + ":" + field.fieldname);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
doctypes = doctypes.concat(Array.from(dynamic_doctypes).map(d => {
|
||||
const doc_field_pair = d.split(":");
|
||||
return {
|
||||
doctype: doc_field_pair[0],
|
||||
fieldname: doc_field_pair[1]
|
||||
};
|
||||
}));
|
||||
|
||||
doctypes.forEach(doc => {
|
||||
this.doctype_field_map[doc.doctype] = doc.fieldname;
|
||||
});
|
||||
|
||||
return doctypes;
|
||||
}
|
||||
|
||||
setup_report_wrapper() {
|
||||
if (this.$report) return;
|
||||
|
||||
|
|
@ -1012,9 +1133,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
|
|||
${__('Collapse All')}</button>
|
||||
</div>`);
|
||||
this.page.footer.before(this.$tree_footer);
|
||||
this.$tree_footer.find('[data-action=collapse_all_rows]').show();
|
||||
this.$tree_footer.find('[data-action=expand_all_rows]').hide();
|
||||
}
|
||||
this.$tree_footer.find('[data-action=collapse_all_rows]').show();
|
||||
this.$tree_footer.find('[data-action=expand_all_rows]').hide();
|
||||
}
|
||||
|
||||
expand_all_rows() {
|
||||
|
|
|
|||
|
|
@ -188,6 +188,8 @@ def send_workflow_action_email(users_data, doc):
|
|||
'actions': d.get('possible_actions'),
|
||||
'message': message
|
||||
},
|
||||
'reference_name': doc.name,
|
||||
'reference_doctype': doc.doctype
|
||||
}
|
||||
email_args.update(common_args)
|
||||
enqueue(method=frappe.sendmail, queue='short', **email_args)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue