Fixed merge conflict

This commit is contained in:
Nabin Hait 2019-04-11 11:56:37 +05:30
commit 8c91e46563
10 changed files with 192 additions and 23 deletions

View file

@ -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

View file

@ -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"),

View file

@ -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",

View file

@ -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 = {

View file

@ -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 = []

View file

@ -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)

View file

@ -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",

View file

@ -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());
},

View file

@ -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() {

View file

@ -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)