diff --git a/frappe/__init__.py b/frappe/__init__.py index 9bc258b310..c80f60ac3d 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -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 diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index 475da7dd4f..987fad3829 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -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"), diff --git a/frappe/core/doctype/report/report.json b/frappe/core/doctype/report/report.json index 4c8b77de5f..a26bc3164f 100644 --- a/frappe/core/doctype/report/report.json +++ b/frappe/core/doctype/report/report.json @@ -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", diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index af8f8a293a..4b3a607ec5 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -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 = { diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index b1bba542a5..0eed37a86a 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -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 = [] diff --git a/frappe/desk/search.py b/frappe/desk/search.py index b50a444e75..04caf36754 100644 --- a/frappe/desk/search.py +++ b/frappe/desk/search.py @@ -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) diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py index 6cfcf9f263..9df4218d71 100644 --- a/frappe/email/inbox.py +++ b/frappe/email/inbox.py @@ -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", diff --git a/frappe/public/js/frappe/form/link_selector.js b/frappe/public/js/frappe/form/link_selector.js index dd3afee304..c72e74cafc 100644 --- a/frappe/public/js/frappe/form/link_selector.js +++ b/frappe/public/js/frappe/form/link_selector.js @@ -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('`); 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() { diff --git a/frappe/workflow/doctype/workflow_action/workflow_action.py b/frappe/workflow/doctype/workflow_action/workflow_action.py index b1ce138487..a41a74cee8 100644 --- a/frappe/workflow/doctype/workflow_action/workflow_action.py +++ b/frappe/workflow/doctype/workflow_action/workflow_action.py @@ -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)