From 4816c72bbe1d4c5fa48f64312a3fbd7836997bab Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sat, 5 Jan 2019 13:46:59 +0530 Subject: [PATCH 01/24] [Fix] 'dict' object has no attribute 'applicable_for' --- frappe/core/doctype/user_permission/user_permission.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py index 0be62ffd01..0fd2efa757 100644 --- a/frappe/core/doctype/user_permission/user_permission.py +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -56,10 +56,10 @@ def get_user_permissions(user=None): if not out.get(perm.allow): out[perm.allow] = [] - out[perm.allow].append({ + out[perm.allow].append(frappe._dict({ 'doc': doc_name, 'applicable_for': perm.get('applicable_for') - }) + })) try: for perm in frappe.get_all('User Permission', @@ -74,6 +74,7 @@ def get_user_permissions(user=None): for doc in decendants: add_doc_to_perm(perm, doc) + out = frappe._dict(out) frappe.cache().hset("user_permissions", user, out) except frappe.SQLError as e: From 7e36e92148293e825a0e8f1d71336a4721a41e66 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 14 Jan 2019 14:08:48 +0530 Subject: [PATCH 02/24] fix: Custom Date filters in DataTable Date comparison won't work with simple string comparison. Now, datatable allows to hook into how cell values are compared. --- .../public/js/frappe/views/reports/query_report.js | 13 +++++++++++++ .../public/js/frappe/views/reports/report_view.js | 14 ++++++++++++++ package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index eeb5a13caa..94d61f4a64 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -616,11 +616,24 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { {for_print: false, always_show_decimals: true}, data); }; + let compareFn = null; + if (column.fieldtype === 'Date') { + compareFn = (cell, keyword) => { + if (!cell.content) return null; + if (keyword.length !== 'YYYY-MM-DD'.length) return null; + + const keywordValue = frappe.datetime.user_to_obj(keyword); + const cellValue = frappe.datetime.str_to_obj(cell.content); + return [+cellValue, +keywordValue]; + } + } + return Object.assign(column, { id: column.fieldname, name: column.label, width: parseInt(column.width) || null, editable: false, + compareValue: compareFn, format: (value, row, column, data) => { if (this.report_settings.formatter) { return this.report_settings.formatter(value, row, column, data, format_cell); diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index eeb0385a57..fc76312bba 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -823,6 +823,19 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { // child table column const id = doctype !== this.doctype ? `${doctype}:${fieldname}` : fieldname; + let compareFn = null; + if (docfield.fieldtype === 'Date') { + compareFn = (cell, keyword) => { + if (!cell.content) return null; + if (keyword.length !== 'YYYY-MM-DD'.length) return null; + + const keywordValue = frappe.datetime.user_to_obj(keyword); + const cellValue = frappe.datetime.str_to_obj(cell.content); + return [+cellValue, +keywordValue]; + } + } + + return { id: id, field: fieldname, @@ -832,6 +845,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { width, editable, align, + compareValue: compareFn, format: (value, row, column, data) => { const d = row.reduce((acc, curr) => { if (!curr.column.docfield) return acc; diff --git a/package.json b/package.json index 5b9cb1e35e..1914cb0180 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "awesomplete": "^1.1.2", "cookie": "^0.3.1", "express": "^4.16.2", - "frappe-datatable": "^1.7.3", + "frappe-datatable": "^1.8.0", "frappe-gantt": "^0.1.0", "fuse.js": "^3.2.0", "highlight.js": "^9.12.0", diff --git a/yarn.lock b/yarn.lock index 800b8d9e1f..8ebc20911b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1219,10 +1219,10 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -frappe-datatable@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.7.3.tgz#dadddf01867723bf0862918dd62cfea4652416a3" - integrity sha512-72LUx0ZRRjFPLFQUzgB7Uywpxgk1rFLjyzOq5yQ5Mr2G8u0t3AoUJLRG2lAqFD49JOxezVb6Oa03Qmon1DCExA== +frappe-datatable@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-1.8.0.tgz#7f789ed77bdf9800143fffb1bb28a24d5dbdc27c" + integrity sha512-j3DdmYtTjhcVXCVkYjKHdZOc8tSwZapanlujdx1xzXcL7Ueo+BFiPR5WptWRfH43K3nboh3m7clcAIX7LdQR4g== dependencies: hyperlist "^1.0.0-beta" lodash "^4.17.5" From 239d2dcfce63eeed22d54ef605c6131f49653ba3 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 14 Jan 2019 14:19:52 +0530 Subject: [PATCH 03/24] style: missing semicolon --- 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 94d61f4a64..f41c8e565f 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -625,7 +625,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { const keywordValue = frappe.datetime.user_to_obj(keyword); const cellValue = frappe.datetime.str_to_obj(cell.content); return [+cellValue, +keywordValue]; - } + }; } return Object.assign(column, { From 45fbd07af1aac328ed79ed14d96178659e76772e Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 16 Jan 2019 12:04:40 +0530 Subject: [PATCH 04/24] fix: increased threshold for making report as prepared report (#6773) --- frappe/desk/query_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 451e9da55c..e7d24454bb 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -58,7 +58,7 @@ def generate_report_result(report, filters=None, user=None): module = report.module or frappe.db.get_value("DocType", report.ref_doctype, "module") if report.is_standard == "Yes": method_name = get_report_module_dotted_path(module, report.name) + ".execute" - threshold = 10 + threshold = 60 res = [] start_time = datetime.datetime.now() From 6d2b16cf427693d861f6a3ead79b583d414fa4c4 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Wed, 16 Jan 2019 18:50:14 +0530 Subject: [PATCH 05/24] fix(minor): assign_to field disappears while assigning a task/issue (#6775) * fix(minor): assign_to field while assigning * fix: remove whitespaces --- frappe/public/js/frappe/form/footer/assign_to.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/footer/assign_to.js b/frappe/public/js/frappe/form/footer/assign_to.js index b7056fd745..95ddebcc99 100644 --- a/frappe/public/js/frappe/form/footer/assign_to.js +++ b/frappe/public/js/frappe/form/footer/assign_to.js @@ -103,6 +103,7 @@ frappe.ui.form.AssignTo = Class.extend({ } me.assign_to.dialog.show(); + me.assign_to = null; }, remove: function(owner) { var me = this; From 19a8a6cdc0430e2913f1ed34b3299ba2c77a1d0d Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Wed, 16 Jan 2019 18:54:37 +0530 Subject: [PATCH 06/24] fix: Address and contact report (#6763) --- .../addresses_and_contacts.py | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py index edb69b831d..16451d0d46 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -2,7 +2,6 @@ # For license information, please see license.txt from __future__ import unicode_literals -from six.moves import range from six import iteritems import frappe @@ -35,66 +34,57 @@ def get_columns(filters): ] def get_data(filters): - data = [] party_type = filters.get("party_type") party = filters.get("party_name") return get_party_addresses_and_contact(party_type, party) -def get_party_addresses_and_contact(party_type, party): +def get_party_addresses_and_contact(reference_doctype, reference_name): data = [] filters = None - party_details = frappe._dict() + reference_details = frappe._dict() - if not party_type: + if not reference_doctype: return [] - if party: - filters = { "name": party } + if reference_name: + filters = { "name": reference_name } - party_list = [d[0] for d in frappe.get_list(party_type, filters=filters, fields=["name"], as_list=True)] - for d in party_list: - party_details.setdefault(d, frappe._dict()) + reference_list = [d[0] for d in frappe.get_list(reference_doctype, filters=filters, fields=["name"], as_list=True)] + for d in reference_list: + reference_details.setdefault(d, frappe._dict()) - party_details = get_party_details(party_type, party_list, "Address", party_details) - party_details = get_party_details(party_type, party_list, "Contact", party_details) + reference_details = get_party_details(reference_doctype, "Address", reference_list, reference_details) + reference_details = get_party_details(reference_doctype, "Contact", reference_list, reference_details) - for party, details in iteritems(party_details): + for reference_name, details in iteritems(reference_details): addresses = details.get("address", []) contacts = details.get("contact", []) if not any([addresses, contacts]): - result = [party] + result = [reference_name] result.extend(add_blank_columns_for("Contact")) result.extend(add_blank_columns_for("Address")) data.append(result) else: - addresses = map(list, addresses) - contacts = map(list, contacts) + result = [reference_name] + result.extend(list(addresses) or add_blank_columns_for("Address")) + result.extend(list(contacts) or add_blank_columns_for("Contact")) + data.append(result) - max_length = max(len(addresses), len(contacts)) - for idx in range(0, max_length): - result = [party] - address = addresses[idx] if idx < len(addresses) else add_blank_columns_for("Address") - contact = contacts[idx] if idx < len(contacts) else add_blank_columns_for("Contact") - result.extend(address) - result.extend(contact) - - data.append(result) return data -def get_party_details(party_type, party_list, doctype, party_details): +def get_party_details(reference_doctype, doctype, reference_list, reference_details): filters = [ - ["Dynamic Link", "link_doctype", "=", party_type], - ["Dynamic Link", "link_name", "in", party_list] + ["Dynamic Link", "link_doctype", "=", reference_doctype], + ["Dynamic Link", "link_name", "in", reference_list] ] fields = ["`tabDynamic Link`.link_name"] + field_map.get(doctype, []) records = frappe.get_list(doctype, filters=filters, fields=fields, as_list=True) for d in records: - details = party_details.get(d[0]) or {} - details.setdefault(frappe.scrub(doctype), []).append(d[1:]) + reference_details[d[0]][frappe.scrub(doctype)] = d[1:] - return party_details + return reference_details def add_blank_columns_for(doctype): - return ["" for field in field_map.get(doctype, [])] \ No newline at end of file + return ["" for _ in field_map.get(doctype, [])] \ No newline at end of file From d55d33ec9e142c780595311152f722fb02f3a8e3 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 16 Jan 2019 18:57:22 +0530 Subject: [PATCH 07/24] fix: syntax-fix treat obj as list (#6776) --- frappe/core/doctype/activity_log/feed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/activity_log/feed.py b/frappe/core/doctype/activity_log/feed.py index 0004a2d219..ceed5cb9d9 100644 --- a/frappe/core/doctype/activity_log/feed.py +++ b/frappe/core/doctype/activity_log/feed.py @@ -75,8 +75,8 @@ def get_feed_match_conditions(user=None, force=True): if user_permissions: can_read_docs = [] for doctype, obj in user_permissions.items(): - for n in obj.get("docs", []): - can_read_docs.append('"{}|{}"'.format(doctype, frappe.db.escape(n))) + for n in obj: + can_read_docs.append('"{}|{}"'.format(doctype, frappe.db.escape(n.get('doc', '')))) if can_read_docs: conditions.append("concat_ws('|', `tabCommunication`.reference_doctype, `tabCommunication`.reference_name) in ({})".format( From a9b782b8618b6c657c4ae4497fb425cf3d9689f3 Mon Sep 17 00:00:00 2001 From: Saif Date: Thu, 17 Jan 2019 11:51:41 +0500 Subject: [PATCH 08/24] fix(Caching): Clear document_cache in clear_doctype_cache (which is called from bench migrate) (#6772) --- frappe/cache_manager.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index a3864a9d0c..2c18064580 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -49,6 +49,10 @@ def clear_defaults_cache(user=None): elif frappe.flags.in_install!="frappe": frappe.cache().delete_key("defaults") +def clear_document_cache(): + frappe.local.document_cache = {} + frappe.cache().delete_key("document_cache") + def clear_doctype_cache(doctype=None): cache = frappe.cache() @@ -81,3 +85,6 @@ def clear_doctype_cache(doctype=None): for name in groups: cache.delete_value(name) + # Clear all document's cache. To clear documents of a specific DocType document_cache should be restructured + clear_document_cache() + From e9b33630e97b9c25a159a62bcb86b1718cee9595 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 17 Jan 2019 18:04:15 +0530 Subject: [PATCH 09/24] fix(timeline-item): User images dont load if they have space in the url --- frappe/public/js/frappe/form/footer/timeline_item.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/timeline_item.html b/frappe/public/js/frappe/form/footer/timeline_item.html index 92f039b4e4..0815481030 100755 --- a/frappe/public/js/frappe/form/footer/timeline_item.html +++ b/frappe/public/js/frappe/form/footer/timeline_item.html @@ -2,7 +2,7 @@ {% if (data.user_content) { %}