From 19f5bb0422658bbe36362fe8ac6d96dd21355124 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Fri, 29 Mar 2019 23:13:23 +0530 Subject: [PATCH 01/23] No need to fetch complete user list to get two usernames --- frappe/desk/form/assign_to.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 15ad442f92..177a436967 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -133,14 +133,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, 'fullname') + user_name = frappe.get_cached_value('User', frappe.session.user, 'fullname') if action=='CLOSE': if owner == frappe.session.get('user'): arg = { From 2f84cfb17802e3c967664ba73e75e12125ae6908 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Fri, 29 Mar 2019 23:18:25 +0530 Subject: [PATCH 02/23] fix fieldname --- frappe/desk/form/assign_to.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 177a436967..a07d76ecd0 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -136,8 +136,8 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE', # 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 = frappe.get_cached_value('User', owner, 'fullname') - user_name = frappe.get_cached_value('User', frappe.session.user, '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 = { From 035a8457f64cc0a4ce8c86844f5f5cbb4ab759cb Mon Sep 17 00:00:00 2001 From: Ahmed Madi Date: Sun, 31 Mar 2019 11:56:00 +0300 Subject: [PATCH 03/23] Update workflow_action.py Add reference_doctype and reference_name to the send_workflow_action_email function --- frappe/workflow/doctype/workflow_action/workflow_action.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/workflow/doctype/workflow_action/workflow_action.py b/frappe/workflow/doctype/workflow_action/workflow_action.py index 2034fb5c56..a487522362 100644 --- a/frappe/workflow/doctype/workflow_action/workflow_action.py +++ b/frappe/workflow/doctype/workflow_action/workflow_action.py @@ -187,6 +187,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) From ff61a4fd0998163819cfff1fdecd5a502c16b803 Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Mon, 1 Apr 2019 17:25:07 +0530 Subject: [PATCH 04/23] fix(todo): Use priority in source document, if available, for ToDo --- .../public/js/frappe/form/footer/assign_to.js | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/assign_to.js b/frappe/public/js/frappe/form/footer/assign_to.js index 95ddebcc99..15255b20de 100644 --- a/frappe/public/js/frappe/form/footer/assign_to.js +++ b/frappe/public/js/frappe/form/footer/assign_to.js @@ -134,22 +134,23 @@ frappe.ui.form.AssignToDialog = Class.extend({ var dialog = new frappe.ui.Dialog({ title: __('Add to To Do'), fields: [ - {fieldtype: 'Link', fieldname:'assign_to', options:'User', - label:__("Assign To"), reqd:true, filters: {'user_type': 'System User'}}, - {fieldtype:'Check', fieldname:'myself', label:__("Assign to me"), "default":0}, - {fieldtype:'Small Text', fieldname:'description', label:__("Comment")}, - {fieldtype: 'Section Break'}, - {fieldtype: 'Column Break'}, - {fieldtype:'Date', fieldname:'date', label: __("Complete By")}, - {fieldtype:'Check', fieldname:'notify', - label:__("Notify by Email")}, - {fieldtype: 'Column Break'}, - {fieldtype:'Select', fieldname:'priority', label: __("Priority"), - options:[ - {value:'Low', label:__('Low')}, - {value:'Medium', label:__('Medium')}, - {value:'High', label:__('High')}], - 'default':'Medium'}, + { fieldtype: 'Link', fieldname: 'assign_to', options: 'User', label: __("Assign To"), reqd: true, filters: { 'user_type': 'System User' }}, + { fieldtype: 'Check', fieldname: 'myself', label: __("Assign to me"), "default": 0 }, + { fieldtype: 'Small Text', fieldname: 'description', label: __("Comment") }, + { fieldtype: 'Section Break' }, + { fieldtype: 'Column Break' }, + { fieldtype: 'Date', fieldname: 'date', label: __("Complete By") }, + { fieldtype: 'Check', fieldname: 'notify', label: __("Notify by Email") }, + { fieldtype: 'Column Break' }, + { fieldtype: 'Select', fieldname: 'priority', label: __("Priority"), + options: [ + { value: 'Low', label: __('Low') }, + { value: 'Medium', label: __('Medium') }, + { value: 'High', label: __('High') } + ], + // Pick up priority from the source document, if it exists and is available in ToDo + 'default': ["Low", "Medium", "High"].includes(opts.obj.frm.doc.priority) ? opts.obj.frm.doc.priority : 'Medium' + }, ], primary_action: function() { frappe.ui.add_assignment(opts, this) }, primary_action_label: __("Add") From feded55c4b2ebd0ea4cada6a421e290814ebfd47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=2E=20Emre=20=C3=96zbak=C4=B1r?= Date: Fri, 5 Apr 2019 22:08:45 +0300 Subject: [PATCH 05/23] fix: Typo of TR-Turkish fixed wrong typo of Turkish in respected language. --- frappe/geo/languages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/geo/languages.json b/frappe/geo/languages.json index 48b60978a4..93e54f37ea 100644 --- a/frappe/geo/languages.json +++ b/frappe/geo/languages.json @@ -293,7 +293,7 @@ }, { "code": "tr", - "name": "T\u00fcrk" + "name": "Türkçe" }, { "code": "uk", @@ -319,4 +319,4 @@ "code": "zh-TW", "name": "\u7e41\u9ad4\u4e2d\u6587" } -] \ No newline at end of file +] From ad37597fb0494850d8df8124d9d2c3cbb3e92a85 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 8 Apr 2019 17:09:54 +0530 Subject: [PATCH 06/23] Revert "fix: Raise exception if apps are on incompatible branches (#7177)" This reverts commit 52da1476e3efcf33d20cc389622aea5c944dbdfc. --- frappe/__init__.py | 3 --- frappe/exceptions.py | 1 - 2 files changed, 4 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index a7338ac201..fd308edf84 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -188,9 +188,6 @@ def connect(site=None, db_name=None): local.db = Database(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 Database diff --git a/frappe/exceptions.py b/frappe/exceptions.py index a1b4ef2024..3a8548a6e0 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -84,4 +84,3 @@ class RetryBackgroundJobError(Exception): pass class DocumentLockedError(ValidationError): pass class CircularLinkingError(ValidationError): pass class SecurityException(Exception): pass -class IncompatibleApp(ValidationError): pass From af46d5c845e2965847080712ae9369795741b681 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira Date: Tue, 9 Apr 2019 13:28:59 +0530 Subject: [PATCH 07/23] =?UTF-8?q?add=20salutation=20to=20contact=20display?= =?UTF-8?q?=20=F0=9F=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frappe/contacts/doctype/contact/contact.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index bce248679c..e1117be4d7 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"), From fdb71ae10f4fd94eb946fbd7f0669cefe042190a Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 9 Apr 2019 15:40:44 +0530 Subject: [PATCH 08/23] feat: Added more button in advance search widget --- frappe/desk/search.py | 7 +++++-- frappe/public/js/frappe/form/link_selector.js | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/frappe/desk/search.py b/frappe/desk/search.py index c1cffb764f..cfee3e6c22 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/public/js/frappe/form/link_selector.js b/frappe/public/js/frappe/form/link_selector.js index e04ebded14..46bef56aea 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() { From 327caada3224e0d736318c2848ed52428d98e654 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 10 Apr 2019 13:02:25 +0530 Subject: [PATCH 18/23] fix: Removed unused imports and data passing --- frappe/desk/query_report.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index b7d12a83de..5790c42878 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -17,7 +17,6 @@ from six import string_types, iteritems from datetime import timedelta from frappe.utils.file_manager import get_file from frappe.utils import gzip_decompress -from frappe.model import no_value_fields def get_report_doc(report_name): doc = frappe.get_doc("Report", report_name) @@ -84,7 +83,7 @@ def generate_report_result(report, filters=None, user=None): data_to_be_printed = res[4] if result: - result, columns = get_filtered_data(report.ref_doctype, columns, result, user) + result = get_filtered_data(report.ref_doctype, columns, result, user) if cint(report.add_total_row) and result: result = add_total_row(result, columns) @@ -384,7 +383,7 @@ def get_filtered_data(ref_doctype, columns, data, user): else: result = list(data) - return result, columns + return result def has_match(row, linked_doctypes, doctype_match_filters, ref_doctype, if_owner, columns_dict, user): From a9b080ca6aed361293e9358de8f940538ea2ec69 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 10 Apr 2019 14:05:07 +0530 Subject: [PATCH 19/23] fix: Styling fixes and missing semicolon --- frappe/public/js/frappe/views/reports/query_report.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 272842d567..2b6d0461e5 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1050,7 +1050,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.columns.splice(insert_after_index + 1, 0, column[0]); this.data.forEach(row => { - row[column_field] = custom_data[row[link_field]] + row[column_field] = custom_data[row[link_field]]; }) this.render_datatable(); @@ -1060,7 +1060,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { let doctypes = []; let dynamic_links = []; let dynamic_doctypes = new Set(); - this.doctype_field_map = {} + this.doctype_field_map = {}; this.columns.forEach(df => { if (df.fieldtype == "Link" && df.options && df.options != "Currency") { @@ -1090,7 +1090,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { return { doctype: doc_field_pair[0], fieldname: doc_field_pair[1] - } + }; })); doctypes.forEach(doc => { From fc2b66dac0f47858f3639b6c511f12eedece572b Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 10 Apr 2019 14:49:34 +0530 Subject: [PATCH 20/23] fix: Rename label from doctype to from document type --- frappe/public/js/frappe/views/reports/query_report.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 2b6d0461e5..24231de50b 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -971,7 +971,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { { fieldtype: 'Select', fieldname: 'doctype', - label: 'DocType', + label: 'From Document Type', options: this.linked_doctypes.map(df => ({ label: df.doctype, value: df.doctype })), change: () => { let doctype = d.get_value('doctype'); From 3cd899dfab55285464baeb521c5b541865b82f13 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 10 Apr 2019 15:34:18 +0530 Subject: [PATCH 21/23] fix: Translation fixes --- .../js/frappe/views/reports/query_report.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 24231de50b..de4bd03e75 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -971,7 +971,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { { fieldtype: 'Select', fieldname: 'doctype', - label: 'From Document Type', + label: __('From Document Type'), options: this.linked_doctypes.map(df => ({ label: df.doctype, value: df.doctype })), change: () => { let doctype = d.get_value('doctype'); @@ -980,18 +980,18 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { .map(df => ({ label: df.label, value: df.fieldname })); d.set_df_property('field', 'options', fields); - }) + }); } }, { fieldtype: 'Select', - label: 'Field', + label: __('Field'), fieldname: 'field', options: [] }, { fieldtype: 'Select', - label: 'Insert After', + label: __('Insert After'), fieldname: 'insert_after', options: this.columns.map(df => df.label) } @@ -1051,7 +1051,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.data.forEach(row => { row[column_field] = custom_data[row[link_field]]; - }) + }); this.render_datatable(); } @@ -1082,8 +1082,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { 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(":"); @@ -1095,7 +1095,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { doctypes.forEach(doc => { this.doctype_field_map[doc.doctype] = doc.fieldname; - }) + }); return doctypes; } From 56f94700e2b58022baf2422cfaef80ce7ac206e3 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 10 Apr 2019 15:58:10 +0530 Subject: [PATCH 22/23] fix: Get all ancestors When a file is uploaded by Guest, the folder size needs to be updated, which breaks because get_ancestors uses `get_list` --- frappe/utils/nestedset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index 777dd7aba7..788714c6e2 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -260,7 +260,7 @@ def get_ancestors_of(doctype, name, order_by="lft desc", limit=None): """Get ancestor elements of a DocType with a tree structure""" lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"]) - result = [d["name"] for d in frappe.db.get_list(doctype, {"lft": ["<", lft], "rgt": [">", rgt]}, + result = [d["name"] for d in frappe.db.get_all(doctype, {"lft": ["<", lft], "rgt": [">", rgt]}, "name", order_by=order_by, limit_page_length=limit)] return result or [] From 747641646c747b1699178010867986820953ec5c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 10 Apr 2019 15:35:45 +0530 Subject: [PATCH 23/23] fix: hide pagination if there is no records or result set is less than 20 --- frappe/public/js/frappe/form/link_selector.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/link_selector.js b/frappe/public/js/frappe/form/link_selector.js index 46bef56aea..bedcaa21fc 100644 --- a/frappe/public/js/frappe/form/link_selector.js +++ b/frappe/public/js/frappe/form/link_selector.js @@ -76,7 +76,7 @@ frappe.ui.form.LinkSelector = Class.extend({ frappe.link_search(this.doctype, args, function (r) { var parent = me.dialog.fields_dict.results.$wrapper; - if (args.start == 0) { + if (args.start === 0) { parent.empty(); } @@ -121,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()); },