From fd2f082e43e205b52701bf714c869f7fff4c1ded Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 20 Jan 2020 21:02:45 +0530 Subject: [PATCH 01/27] fix: don't format markdown in versions --- frappe/core/doctype/version/version.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py index 05cc102ab9..3e10f93c75 100644 --- a/frappe/core/doctype/version/version.py +++ b/frappe/core/doctype/version/version.py @@ -43,6 +43,8 @@ def get_diff(old, new, for_child=False): if not new: return None + whitelist_fields = ["Markdown Editor"] + # capture data import if set data_import = new.flags.via_data_import out = frappe._dict(changed = [], added = [], removed = [], row_changed = [], data_import=data_import) @@ -75,12 +77,12 @@ def get_diff(old, new, for_child=False): out.removed.append([df.fieldname, d.as_dict()]) elif (old_value != new_value): - # Check for None values - old_data = old.get_formatted(df.fieldname) if old_value else old_value - new_data = new.get_formatted(df.fieldname) if new_value else new_value + if df.fieldtype not in whitelist_fields: + old_value = old.get_formatted(df.fieldname) + new_value = new.get_formatted(df.fieldname) - if old_data != new_data: - out.changed.append((df.fieldname, old_data, new_data)) + if old_value != new_value: + out.changed.append((df.fieldname, old_value, new_value)) # docstatus if not for_child and old.docstatus != new.docstatus: From 3569bb3cf91ab09345294dd40982a3c9bd2eaa83 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Jan 2020 13:01:53 +0530 Subject: [PATCH 02/27] refactor: better variable naming --- frappe/core/doctype/version/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py index 3e10f93c75..5488e1a7a3 100644 --- a/frappe/core/doctype/version/version.py +++ b/frappe/core/doctype/version/version.py @@ -43,7 +43,7 @@ def get_diff(old, new, for_child=False): if not new: return None - whitelist_fields = ["Markdown Editor"] + blacklisted_fields = ["Markdown Editor"] # capture data import if set data_import = new.flags.via_data_import @@ -77,7 +77,7 @@ def get_diff(old, new, for_child=False): out.removed.append([df.fieldname, d.as_dict()]) elif (old_value != new_value): - if df.fieldtype not in whitelist_fields: + if df.fieldtype not in blacklisted_fields: old_value = old.get_formatted(df.fieldname) new_value = new.get_formatted(df.fieldname) From fd38ad457e34f3fa41716a4979c3b268fe6563bf Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 27 Jan 2020 10:58:47 +0530 Subject: [PATCH 03/27] feat: blacklist text editor, code and html editor --- frappe/core/doctype/version/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py index 5488e1a7a3..43530bc3bc 100644 --- a/frappe/core/doctype/version/version.py +++ b/frappe/core/doctype/version/version.py @@ -43,7 +43,7 @@ def get_diff(old, new, for_child=False): if not new: return None - blacklisted_fields = ["Markdown Editor"] + blacklisted_fields = ["Markdown Editor", "Text Editor", "Code", "HTML Editor"] # capture data import if set data_import = new.flags.via_data_import From ed33422511a882f9f954a5f4973bc369d325d1a7 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 6 Feb 2020 11:35:44 +0530 Subject: [PATCH 04/27] refactor: log error if theme creation breaks --- frappe/website/doctype/website_theme/website_theme.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index 180d9e876c..e2d946150c 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -112,4 +112,5 @@ def generate_theme_files_if_not_exist(): doc.generate_theme_if_not_exist() doc.save() except Exception: + frappe.log_error(frappe.get_traceback(), _("Theme File Generation Failed")) pass From 36506e010c17416539fb6ba8b2a558215cad08d6 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Sat, 8 Feb 2020 17:50:56 +0530 Subject: [PATCH 05/27] Revert "fix(security): invalidate reset_password_key on password reset" This reverts commit 35024c18fc86d51e0e414068c3494510d2ad14e3. --- frappe/core/doctype/user/user.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 6bbf042d8a..c246a7d7c5 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -98,8 +98,6 @@ class User(Document): clear_notifications(user=self.name) frappe.clear_cache(user=self.name) self.send_password_notification(self.__new_password) - if self.__new_password: - self.reset_password_key = '' create_contact(self, ignore_mandatory=True) if self.name not in ('Administrator', 'Guest') and not self.user_image: frappe.enqueue('frappe.core.doctype.user.user.update_gravatar', name=self.name) From 4b51508194f5207a40fa563ab15aff3211d76e79 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 10 Feb 2020 13:08:26 +0530 Subject: [PATCH 06/27] fix: Cypress run command --- frappe/commands/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index c48cd2f7b1..85a71ee2f6 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -523,7 +523,7 @@ def run_ui_tests(context, app, headless=False): # run for headless mode run_or_open = 'run' if headless else 'open' - command = '{site_env} {password_env} yarn run cypress:{run_or_open}' + command = '{site_env} {password_env} yarn run cypress {run_or_open}' formatted_command = command.format(site_env=site_env, password_env=password_env, run_or_open=run_or_open) frappe.commands.popen(formatted_command, cwd=app_base_path, raise_err=True) From d508ef258e17ca2adefdb1d2a264d0b93b29afa1 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 10 Feb 2020 17:23:42 +0530 Subject: [PATCH 07/27] fix: Remove translation method and pass statement --- frappe/website/doctype/website_theme/website_theme.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index e2d946150c..954891b4b1 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -112,5 +112,4 @@ def generate_theme_files_if_not_exist(): doc.generate_theme_if_not_exist() doc.save() except Exception: - frappe.log_error(frappe.get_traceback(), _("Theme File Generation Failed")) - pass + frappe.log_error(frappe.get_traceback(), "Theme File Generation Failed") From 8ff57cf78a247cff5dacf7205065a017ab1d1ae5 Mon Sep 17 00:00:00 2001 From: shrikant dixit Date: Sat, 15 Feb 2020 16:02:39 +0530 Subject: [PATCH 08/27] fix: Stock Balance Report Shows Fatal Error #20602 --- frappe/desk/query_report.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 0ecdc13b51..056407e744 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -185,7 +185,8 @@ def run(report_name, filters=None, user=None, ignore_prepared_report=False): else: result = generate_report_result(report, filters, user) - result["add_total_row"] = report.add_total_row and not result['skip_total_row'] + skip_total_row = result['skip_total_row'] if 'skip_total_row' in result else '' + result["add_total_row"] = report.add_total_row and not skip_total_row return result From 1353ef24b0a0589dde40068e3cbd830d78345308 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Mon, 17 Feb 2020 12:10:10 +0530 Subject: [PATCH 09/27] fix(Contact): Dont reroute from Contact to unrelated document (#9432) * fix:dont reroute to doc if unrelated * Update frappe/contacts/doctype/address/address.js Co-Authored-By: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> * Update frappe/contacts/doctype/contact/contact.js Co-Authored-By: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> * Update address.js * Update contact.js Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/contacts/doctype/address/address.js | 19 ++++++++++++++++--- frappe/contacts/doctype/contact/contact.js | 19 +++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/frappe/contacts/doctype/address/address.js b/frappe/contacts/doctype/address/address.js index face6a86a0..63574622c0 100644 --- a/frappe/contacts/doctype/address/address.js +++ b/frappe/contacts/doctype/address/address.js @@ -24,6 +24,15 @@ frappe.ui.form.on("Address", { } }); frm.refresh_field("links"); + + if (frm.doc.links) { + for (let i in frm.doc.links) { + let link = frm.doc.links[i]; + frm.add_custom_button(__("{0}: {1}", [__(link.link_doctype), __(link.link_name)]), function() { + frappe.set_route("Form", link.link_doctype, link.link_name); + }, __("Links")); + } + } }, validate: function(frm) { // clear linked customer / supplier / sales partner on saving... @@ -38,9 +47,13 @@ frappe.ui.form.on("Address", { () => frappe.timeout(1), () => { const last_doc = frappe.contacts.get_last_doc(frm); - if(frappe.dynamic_link && frappe.dynamic_link.doc - && frappe.dynamic_link.doc.name == last_doc.docname){ - frappe.set_route('Form', last_doc.doctype, last_doc.docname); + if (frappe.dynamic_link && frappe.dynamic_link.doc && frappe.dynamic_link.doc.name == last_doc.docname) { + for (let i in frm.doc.links) { + let link = frm.doc.links[i]; + if (last_doc.doctype == link.link_doctype && last_doc.docname == link.link_name) { + frappe.set_route('Form', last_doc.doctype, last_doc.docname); + } + } } } ]); diff --git a/frappe/contacts/doctype/contact/contact.js b/frappe/contacts/doctype/contact/contact.js index 7bbbbb1564..5285f8b85c 100644 --- a/frappe/contacts/doctype/contact/contact.js +++ b/frappe/contacts/doctype/contact/contact.js @@ -42,7 +42,7 @@ frappe.ui.form.on("Contact", { }); frm.refresh_field("links"); - if (frm.doc.links.length > 0) { + if (frm.doc.links) { frappe.call({ method: "frappe.contacts.doctype.contact.contact.address_query", args: {links: frm.doc.links}, @@ -58,6 +58,13 @@ frappe.ui.form.on("Contact", { } } }); + + for (let i in frm.doc.links) { + let link = frm.doc.links[i]; + frm.add_custom_button(__("{0}: {1}", [__(link.link_doctype), __(link.link_name)]), function() { + frappe.set_route("Form", link.link_doctype, link.link_name); + }, __("Links")); + } } }, validate: function(frm) { @@ -73,9 +80,13 @@ frappe.ui.form.on("Contact", { () => frappe.timeout(1), () => { const last_doc = frappe.contacts.get_last_doc(frm); - if(frappe.dynamic_link && frappe.dynamic_link.doc - && frappe.dynamic_link.doc.name == last_doc.docname){ - frappe.set_route('Form', last_doc.doctype, last_doc.docname); + if (frappe.dynamic_link && frappe.dynamic_link.doc && frappe.dynamic_link.doc.name == last_doc.docname) { + for (let i in frm.doc.links) { + let link = frm.doc.links[i]; + if (last_doc.doctype == link.link_doctype && last_doc.docname == link.link_name) { + frappe.set_route('Form', last_doc.doctype, last_doc.docname); + } + } } } ]); From 5be6ae555e87145c73e2fb4fdf21dee0a9b7ad06 Mon Sep 17 00:00:00 2001 From: shrikant9867 <41181281+shrikant9867@users.noreply.github.com> Date: Mon, 17 Feb 2020 12:21:48 +0530 Subject: [PATCH 10/27] fix: Stock Balance Report Shows Fatal Error #20602 -2 Old: skip_total_row = result['skip_total_row'] if 'skip_total_row' in result else '' result["add_total_row"] = report.add_total_row and not skip_total_row New: result["add_total_row"] = report.add_total_row and not result.get('skip_total_row') --- frappe/desk/query_report.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 056407e744..865e008923 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -185,8 +185,7 @@ def run(report_name, filters=None, user=None, ignore_prepared_report=False): else: result = generate_report_result(report, filters, user) - skip_total_row = result['skip_total_row'] if 'skip_total_row' in result else '' - result["add_total_row"] = report.add_total_row and not skip_total_row + result["add_total_row"] = report.add_total_row and not result.get('skip_total_row') return result From 84241e5b612fa160fe014e9f6c4d7b00742c47b9 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 14:06:06 +0530 Subject: [PATCH 11/27] feat: better only_for role message --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 12e5204001..e44ecb3420 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -544,7 +544,7 @@ def only_for(roles, message=False): myroles = set(get_roles()) if not roles.intersection(myroles): if message: - msgprint(_('Only for {}').format(', '.join(roles))) + msgprint(_('This action is only allowed for {}').format(bold(', '.join(roles))), _('Not Permitted')) raise PermissionError def get_domain_data(module): From 290d077572daae055f419eaedb55cf81d3922d39 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 14:07:18 +0530 Subject: [PATCH 12/27] feat: add save button only for script manager - Save option will only be shown to script manager. - The report name field is set to mandatory --- .../js/frappe/views/reports/query_report.js | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 365cbaa9db..cac03213d4 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1022,7 +1022,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } get_menu_items() { - return [ + let items = [ { label: __('Refresh'), action: () => this.refresh(), @@ -1153,6 +1153,18 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { standard: true }, { + label: __('User Permissions'), + action: () => frappe.set_route('List', 'User Permission', { + doctype: 'Report', + name: this.report_name + }), + condition: () => frappe.model.can_set_user_permissions('Report'), + standard: true + } + ]; + + if(frappe.user.is_report_manager()) { + items.push({ label: __('Save'), action: () => { let d = new frappe.ui.Dialog({ @@ -1163,6 +1175,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { fieldname: 'report_name', label: __("Report Name"), default: this.report_doc.is_standard == 'No' ? this.report_name : "", + reqd: true } ], primary_action: (values) => { @@ -1184,17 +1197,10 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { d.show(); }, standard: true - }, - { - label: __('User Permissions'), - action: () => frappe.set_route('List', 'User Permission', { - doctype: 'Report', - name: this.report_name - }), - condition: () => frappe.model.can_set_user_permissions('Report'), - standard: true - } - ]; + }) + } + + return items } add_portrait_warning(dialog) { From 67b9b0108774645d2323149354dc80b929e0cd12 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 14:38:16 +0530 Subject: [PATCH 13/27] fix: don't format none --- frappe/core/doctype/version/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py index 43530bc3bc..d7a3b62a2c 100644 --- a/frappe/core/doctype/version/version.py +++ b/frappe/core/doctype/version/version.py @@ -78,8 +78,8 @@ def get_diff(old, new, for_child=False): elif (old_value != new_value): if df.fieldtype not in blacklisted_fields: - old_value = old.get_formatted(df.fieldname) - new_value = new.get_formatted(df.fieldname) + old_value = old.get_formatted(df.fieldname) if old_value else old_value + new_value = new.get_formatted(df.fieldname) if new_value else new_value if old_value != new_value: out.changed.append((df.fieldname, old_value, new_value)) From 724564103cfcd16443f100be58e06df4461adee9 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 14:49:45 +0530 Subject: [PATCH 14/27] fix: better logging for slack (#9474) * fix: better logging for slack * chore: cleanup code and get from dict Signed-off-by: Chinmay D. Pai Co-authored-by: Chinmay Pai --- .../slack_webhook_url/slack_webhook_url.py | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py index de96582c64..b28a6c50e6 100644 --- a/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py +++ b/frappe/integrations/doctype/slack_webhook_url/slack_webhook_url.py @@ -10,9 +10,20 @@ from frappe import _ import requests import json + +error_messages = { + 400: "400: Invalid Payload or User not found", + 403: "403: Action Prohibited", + 404: "404: Channel not found", + 410: "410: The Channel is Archived", + 500: "500: Rollup Error, Slack seems to be down" +} + + class SlackWebhookURL(Document): pass + def send_slack_message(webhook_url, message, reference_doctype, reference_name): slack_url = frappe.db.get_value("Slack Webhook URL", webhook_url, "webhook_url") doc_url = get_url_to_form(reference_doctype, reference_name) @@ -21,10 +32,10 @@ def send_slack_message(webhook_url, message, reference_doctype, reference_name): "fallback": _("See the document at {0}").format(doc_url), "actions": [ { - "type": "button", - "text": _("Go to the document"), - "url": doc_url, - "style": "primary" + "type": "button", + "text": _("Go to the document"), + "url": doc_url, + "style": "primary" } ] } @@ -32,10 +43,9 @@ def send_slack_message(webhook_url, message, reference_doctype, reference_name): data = {"text": message, "attachments": attachments} r = requests.post(slack_url, data=json.dumps(data)) - - if r.ok == True: - return 'success' - - elif r.ok == False: - frappe.log_error(r.error, _('Slack Webhook Error')) + if not r.ok: + message = error_messages.get(r.status_code, r.status_code) + frappe.log_error(message, _('Slack Webhook Error')) return 'error' + + return 'success' From 4ee8b9d872495ba8a37cf0b9daf2bef8b30634fe Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 15:31:07 +0530 Subject: [PATCH 15/27] fix: skip columns not sent --- 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 0ecdc13b51..7d2429bc48 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -185,7 +185,7 @@ def run(report_name, filters=None, user=None, ignore_prepared_report=False): else: result = generate_report_result(report, filters, user) - result["add_total_row"] = report.add_total_row and not result['skip_total_row'] + result["add_total_row"] = report.add_total_row and not result.get('skip_total_row', False) return result From 0a55241389ea27de61b74d74d6b2065d32c037af Mon Sep 17 00:00:00 2001 From: gmplab Date: Mon, 17 Feb 2020 22:35:08 +0800 Subject: [PATCH 16/27] Fix property 'disable_auto_refresh' TypeError: Cannot read property 'disable_auto_refresh' of undefined --- frappe/public/js/frappe/list/list_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 377f668864..10542641c0 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -1044,7 +1044,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } setup_realtime_updates() { - if (this.list_view_settings.disable_auto_refresh) { + if (this.list_view_settings && this.list_view_settings.disable_auto_refresh) { return; } frappe.realtime.on('list_update', data => { From 86263496d5e541876f4b1f10525b4318a4fa6798 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 18 Feb 2020 09:01:24 +0530 Subject: [PATCH 17/27] fix: Remove unnecessary code from treeview --- frappe/desk/treeview.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/frappe/desk/treeview.py b/frappe/desk/treeview.py index 3b26ecd0a5..2944f20a37 100644 --- a/frappe/desk/treeview.py +++ b/frappe/desk/treeview.py @@ -57,9 +57,6 @@ def add_node(): args = make_tree_args(**frappe.form_dict) doc = frappe.get_doc(args) - if args.doctype == "Sales Person": - doc.employee = frappe.form_dict.get('employee') - doc.save() def make_tree_args(**kwarg): From 690611f6f85c06ca73e0b77605a61b5007040a22 Mon Sep 17 00:00:00 2001 From: Shridhar Date: Wed, 5 Feb 2020 09:56:55 +0530 Subject: [PATCH 18/27] scrub urls should only replace relative urls --- frappe/utils/data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 866b91ef72..61074e5aa2 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1026,8 +1026,7 @@ def expand_relative_urls(html): html = re.sub('(href|src){1}([\s]*=[\s]*[\'"]?)((?!http)[^\'" >]+)([\'"]?)', _expand_relative_urls, html) # background-image: url('/assets/...') - html = re.sub('(:[\s]?url)(\([\'"]?)([^\)]*)([\'"]?\))', _expand_relative_urls, html) - + html = re.sub('(:[\s]?url)(\([\'"]?)((?!http)[^\'" >]+)([\'"]?)', _expand_relative_urls, html) return html def quoted(url): From a68766261ad8ed591e54cd1c8400ae5026948093 Mon Sep 17 00:00:00 2001 From: Shridhar Date: Wed, 5 Feb 2020 11:31:18 +0530 Subject: [PATCH 19/27] workaround for wkhtmltopdf --- frappe/utils/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 61074e5aa2..e595c68ea2 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1026,7 +1026,7 @@ def expand_relative_urls(html): html = re.sub('(href|src){1}([\s]*=[\s]*[\'"]?)((?!http)[^\'" >]+)([\'"]?)', _expand_relative_urls, html) # background-image: url('/assets/...') - html = re.sub('(:[\s]?url)(\([\'"]?)((?!http)[^\'" >]+)([\'"]?)', _expand_relative_urls, html) + html = re.sub('(:[\s]?url)(\([\'"]?)((?!http)[^\'" >]+)([\'"]?\)', _expand_relative_urls, html) return html def quoted(url): From efa740efba2178217f44abeb84f81d3b3026e58a Mon Sep 17 00:00:00 2001 From: Shridhar Date: Mon, 10 Feb 2020 10:11:12 +0530 Subject: [PATCH 20/27] regular expression fixed --- frappe/utils/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index e595c68ea2..39c8c387eb 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -1026,7 +1026,7 @@ def expand_relative_urls(html): html = re.sub('(href|src){1}([\s]*=[\s]*[\'"]?)((?!http)[^\'" >]+)([\'"]?)', _expand_relative_urls, html) # background-image: url('/assets/...') - html = re.sub('(:[\s]?url)(\([\'"]?)((?!http)[^\'" >]+)([\'"]?\)', _expand_relative_urls, html) + html = re.sub('(:[\s]?url)(\([\'"]?)((?!http)[^\'" >]+)([\'"]?\))', _expand_relative_urls, html) return html def quoted(url): From 09b6010e5a1afa179c23e48b8251b0524f6f55c1 Mon Sep 17 00:00:00 2001 From: Priyanka Gangar <59438065+0925-pinka@users.noreply.github.com> Date: Tue, 18 Feb 2020 11:08:05 +0530 Subject: [PATCH 21/27] feat: add button to resend welcome email (#9464) * fix: Resend Welcome Email * fix: Removed Space in Resend Welcome Email * fix: Removed Space in Resend Welcome Email * Send welcome mail called from frm * Passing Parameter to msgprint * Passing Parameter to msgprint * Removed Unused Function * Removed Unused Space Co-authored-by: pinka0925 <44537026+pinka0925@users.noreply.github.com> --- frappe/core/doctype/user/user.js | 7 ++++++- frappe/core/doctype/user/user.py | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index c4873ee40e..adb98676a4 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -73,7 +73,12 @@ frappe.ui.form.on('User', { if(!frm.is_new()) { if(has_access_to_edit_user()) { - + frm.add_custom_button(__("Resend Welcome Email"), function() { + frm.call('send_welcome_mail_to_user').then(()=>{ + frappe.msgprint(__("Email has been sent to {0}", [frm.doc.email])); + }); + }); + frm.add_custom_button(__("Set User Permissions"), function() { frappe.route_options = { "user": doc.name diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index c246a7d7c5..b581cd7c37 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -174,7 +174,6 @@ class User(Document): and name in ({0}) limit 1""".format(', '.join(['%s'] * len(self.roles))), [d.role for d in self.roles])) - def share_with_self(self): if self.user_type=="System User": frappe.share.add(self.doctype, self.name, self.name, write=1, share=1, From 00901422321dc4dd3ee2d1c59e7971c7a7546e88 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Tue, 18 Feb 2020 11:38:47 +0530 Subject: [PATCH 22/27] style: fix formatting --- 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 cac03213d4..e356a7945b 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1163,7 +1163,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } ]; - if(frappe.user.is_report_manager()) { + if (frappe.user.is_report_manager()) { items.push({ label: __('Save'), action: () => { From 8c7a7942dc66df4f04006f4f2b56a85caf76a09f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 18 Feb 2020 12:20:52 +0530 Subject: [PATCH 23/27] 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 e356a7945b..22ae5d50c1 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1200,7 +1200,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { }) } - return items + return items; } add_portrait_warning(dialog) { From 59cc62b206b9387866186eadf18b80fe981cb89e Mon Sep 17 00:00:00 2001 From: Fab Date: Tue, 18 Feb 2020 08:03:01 +0100 Subject: [PATCH 24/27] fix(base_list): Verify that filters are not undefined/empty. #9468 (#9487) * fix(base_list): Verify that filters are not undefined/empty. #9468 Fixes an issue with empty filters in certain list views as referenced in #9467 * style: Fix formatting issue Co-Authored-By: Himanshu Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Co-authored-by: Himanshu --- frappe/public/js/frappe/list/base_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/list/base_list.js b/frappe/public/js/frappe/list/base_list.js index cbd0b1954c..8ebbe21692 100644 --- a/frappe/public/js/frappe/list/base_list.js +++ b/frappe/public/js/frappe/list/base_list.js @@ -230,7 +230,7 @@ frappe.views.BaseList = class BaseList { setup_filter_area() { this.filter_area = new FilterArea(this); - if (this.filters.length > 0) { + if (this.filters && this.filters.length > 0) { return this.filter_area.set(this.filters); } } From 80f9a5f9fe53df86e753d85f250e056c100011b5 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 18 Feb 2020 12:36:09 +0530 Subject: [PATCH 25/27] fix: don't try to export empty report (#9482) --- frappe/desk/query_report.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 7d2429bc48..25cf0b6865 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -303,6 +303,11 @@ def export_query(): if file_format_type == "Excel": data = run(report_name, filters) data = frappe._dict(data) + if not data.columns: + frappe.respond_as_web_page(_("No data to export"), + _("You can try changing the filters of your report.")) + return + columns = get_columns_dict(data.columns) from frappe.utils.xlsxutils import make_xlsx From 14fef7d01ea9d4eb000b5e49050379c9e942841d Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 18 Feb 2020 14:49:06 +0530 Subject: [PATCH 26/27] chore: Add github action to automate backporting (#9456) --- .github/workflows/backport.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/backport.yml diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml new file mode 100644 index 0000000000..26801ebbe8 --- /dev/null +++ b/.github/workflows/backport.yml @@ -0,0 +1,16 @@ +name: Backport +on: + pull_request: + types: + - closed + - labeled + +jobs: + backport: + runs-on: ubuntu-18.04 + name: Backport + steps: + - name: Backport + uses: tibdex/backport@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} From b1d42e13025bd9972a7cf85fe9a19847436699f2 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Tue, 18 Feb 2020 15:43:16 +0530 Subject: [PATCH 27/27] =?UTF-8?q?fix:=20consider=20Not=20Sent=20and=20Send?= =?UTF-8?q?ing=20status=20while=20pulling=20daily=20e=E2=80=A6=20(#9496)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Saurabh --- frappe/email/queue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index 62b0d9ea3f..b35f5944b2 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -256,7 +256,7 @@ def get_emails_sent_this_month(): def get_emails_sent_today(): return frappe.db.sql("""SELECT COUNT(`name`) FROM `tabEmail Queue` WHERE - `status`='Sent' AND `creation` > (NOW() - INTERVAL '24' HOUR)""")[0][0] + `status` in ('Sent', 'Not Sent', 'Sending') AND `creation` > (NOW() - INTERVAL '24' HOUR)""")[0][0] def get_unsubscribe_message(unsubscribe_message, expose_recipients): if unsubscribe_message: