From 01d69b67c72e04d5ce1d57d86946e12fdc8e208f Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Fri, 17 Sep 2021 11:59:05 +0530 Subject: [PATCH 01/29] feat: automatically reload web pages whenever JS/CSS assets are rebuilt --- esbuild/esbuild.js | 10 ++++++++-- frappe/build.py | 3 +++ .../js/frappe/build_events/BuildSuccess.vue | 17 +++++++++++++---- .../frappe/build_events/build_events.bundle.js | 5 +++-- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/esbuild/esbuild.js b/esbuild/esbuild.js index 9074beae06..b0ed92f9ec 100644 --- a/esbuild/esbuild.js +++ b/esbuild/esbuild.js @@ -44,6 +44,11 @@ let argv = yargs type: "boolean", description: "Run in watch mode and rebuild on file changes" }) + .option("auto-reload", { + type: "boolean", + description: `Automatically reload webpages when assets are rebuilt. + Can only be used with the --watch flag.` + }) .option("production", { type: "boolean", description: "Run build in production mode" @@ -475,7 +480,8 @@ async function notify_redis({ error, success }) { } if (success) { payload = { - success: true + success: true, + autoreload: argv["auto-reload"] }; } @@ -528,4 +534,4 @@ function log_rebuilt_assets(prev_assets, new_assets) { log(" " + filename); } log(); -} \ No newline at end of file +} diff --git a/frappe/build.py b/frappe/build.py index dfbe20f31e..ec092d4b57 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -235,6 +235,9 @@ def watch(apps=None): if apps: command += " --apps {apps}".format(apps=apps) + if frappe.conf.autoreload_on_build: + command += " --auto-reload" + check_node_executable() frappe_app_path = frappe.get_app_path("frappe", "..") frappe.commands.popen(command, cwd=frappe_app_path, env=get_node_env()) diff --git a/frappe/public/js/frappe/build_events/BuildSuccess.vue b/frappe/public/js/frappe/build_events/BuildSuccess.vue index 75a365fdc2..d489c4a1a3 100644 --- a/frappe/public/js/frappe/build_events/BuildSuccess.vue +++ b/frappe/public/js/frappe/build_events/BuildSuccess.vue @@ -3,8 +3,11 @@ v-if="is_shown" class="flex justify-between build-success-message align-center" > -
Compiled successfully
- + Compiled successfully + Refresh @@ -14,11 +17,17 @@ export default { name: "BuildSuccess", data() { return { - is_shown: false + is_shown: false, + autoreload: false, }; }, methods: { - show() { + show(data) { + if (data.autoreload) { + this.autoreload = true; + this.reload(); + } + this.is_shown = true; if (this.timeout) { clearTimeout(this.timeout); diff --git a/frappe/public/js/frappe/build_events/build_events.bundle.js b/frappe/public/js/frappe/build_events/build_events.bundle.js index 6c8986af3f..13b9c7a334 100644 --- a/frappe/public/js/frappe/build_events/build_events.bundle.js +++ b/frappe/public/js/frappe/build_events/build_events.bundle.js @@ -13,10 +13,11 @@ frappe.realtime.on("build_event", data => { } }); -function show_build_success() { +function show_build_success(data) { if (error) { error.hide(); } + if (!success) { let target = $('
') .appendTo($container) @@ -27,7 +28,7 @@ function show_build_success() { }); success = vm.$children[0]; } - success.show(); + success.show(data); } function show_build_error(data) { From f7ad01cb64812b99f97866d9010aa216b5610a49 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 7 Oct 2021 19:38:42 +0530 Subject: [PATCH 02/29] fix: Update check all checkbox based on checked rows in List View --- frappe/public/js/frappe/list/list_view.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 1cf4b4c6ac..56c47d0d8a 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -302,9 +302,20 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { refresh(refresh_header=false) { super.refresh().then(() => { this.render_header(refresh_header); + this.update_checkbox(); }); } + update_checkbox(target) { + let $check_all_checkbox = this.$checkbox_actions.find(".list-check-all"); + + if ($check_all_checkbox.prop("checked") && target && !target.prop("checked")) { + $check_all_checkbox.prop("checked", false); + } + + $check_all_checkbox.prop("checked", this.$checks.length === this.data.length); + } + setup_freeze_area() { this.$freeze = $( `
${__( @@ -1253,6 +1264,8 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } this.$checkbox_cursor = $target; + + this.update_checkbox($target); }); } @@ -1398,6 +1411,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { this.$checkbox_actions.show(); this.$list_head_subject.hide(); } + this.update_checkbox(); this.toggle_actions_menu_button(this.$checks.length > 0); } From 096700a77aaf74e66c7e795a42ba69869d41bf96 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Tue, 12 Oct 2021 19:11:25 +0530 Subject: [PATCH 03/29] fix: Loading state for query reports --- .../js/frappe/views/reports/query_report.js | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 7d68919821..8a50a516af 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -107,7 +107,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } if (this.report_name !== frappe.get_route()[1]) { - // this.toggle_loading(true); // different report this.load_report(); } @@ -556,6 +555,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { refresh() { this.toggle_message(true); this.toggle_report(false); + this.show_loading_indicator(); let filters = this.get_filter_values(true); // only one refresh at a time @@ -645,6 +645,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.show_footer_message(); frappe.hide_progress(); + }).finally(() => { + this.hide_loading_indicator(); }); } @@ -869,6 +871,22 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } } + show_loading_indicator() { + this.$loading.find('div').html(`
+
+ Generic Empty State +
+

${__('Loading')}...

+
`); + this.$report.hide(); + this.$loading.show(); + } + + hide_loading_indicator() { + this.$loading.hide(); + this.$report.show(); + } + get_chart_options(data) { let options = this.report_settings.get_chart_data ? this.report_settings.get_chart_data(data.columns, data.result) @@ -1679,6 +1697,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { .hide().appendTo(this.page.main); this.$chart = $('
').hide().appendTo(this.page.main); + + this.$loading = $(this.message_div('')).hide().appendTo(this.page.main); + this.$report = $('
').appendTo(this.page.main); this.$message = $(this.message_div('')).hide().appendTo(this.page.main); } @@ -1738,11 +1759,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.refresh(); } - toggle_loading(flag) { - this.toggle_message(flag, __('Loading') + '...'); - } - - toggle_nothing_to_show(flag) { let message = this.prepared_report ? __('This is a background report. Please set the appropriate filters and then generate a new one.') From d257adc1302b720016cc3ed830ede379aee4403e Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 16 Oct 2021 16:48:33 +0530 Subject: [PATCH 04/29] fix: Rename loader functions --- .../js/frappe/views/reports/query_report.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 8a50a516af..4a3a953a01 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -555,7 +555,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { refresh() { this.toggle_message(true); this.toggle_report(false); - this.show_loading_indicator(); + this.show_loading_screen(); let filters = this.get_filter_values(true); // only one refresh at a time @@ -646,7 +646,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.show_footer_message(); frappe.hide_progress(); }).finally(() => { - this.hide_loading_indicator(); + this.hide_loading_screen(); }); } @@ -871,18 +871,20 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } } - show_loading_indicator() { - this.$loading.find('div').html(`
+ show_loading_screen() { + const loading_state = `
Generic Empty State

${__('Loading')}...

-
`); +
`; + + this.$loading.find('div').html(loading_state); this.$report.hide(); this.$loading.show(); } - hide_loading_indicator() { + hide_loading_screen() { this.$loading.hide(); this.$report.show(); } @@ -1699,7 +1701,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { this.$chart = $('
').hide().appendTo(this.page.main); this.$loading = $(this.message_div('')).hide().appendTo(this.page.main); - this.$report = $('
').appendTo(this.page.main); this.$message = $(this.message_div('')).hide().appendTo(this.page.main); } From 236c84ab8bbba439057149c9a20eb289f7b85b52 Mon Sep 17 00:00:00 2001 From: abhishek Date: Mon, 18 Oct 2021 16:35:13 +0530 Subject: [PATCH 05/29] feat: semgrep rule for db.sql --- .github/helper/semgrep_rules/frappe_correctness.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/helper/semgrep_rules/frappe_correctness.yml b/.github/helper/semgrep_rules/frappe_correctness.yml index d9603e89aa..04341b3430 100644 --- a/.github/helper/semgrep_rules/frappe_correctness.yml +++ b/.github/helper/semgrep_rules/frappe_correctness.yml @@ -131,3 +131,10 @@ rules: key `$X` is uselessly assigned twice. This could be a potential bug. languages: [python] severity: ERROR + +- id: frappe-using-db.sql + pattern-regex: \.sql.*\( + message: | + The PR contains a SQL query that may be re-written with frappe.qb (https://frappeframework.com/docs/user/en/api/query-builder) or the Database API (https://frappeframework.com/docs/user/en/api/database) + languages: [python] + severity: ERROR \ No newline at end of file From c560d67a5709320054b5b265f8f32ece5800ae6e Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Mon, 18 Oct 2021 16:47:11 +0530 Subject: [PATCH 06/29] fix: remove/update older whitelist calls --- frappe/core/doctype/navbar_settings/navbar_settings.py | 1 - frappe/core/doctype/user_permission/user_permission.py | 2 +- frappe/desk/form/load.py | 4 ++-- frappe/desk/listview.py | 2 +- frappe/desk/reportview.py | 2 +- .../integrations/doctype/dropbox_settings/dropbox_settings.py | 1 - frappe/sessions.py | 4 ++-- 7 files changed, 7 insertions(+), 9 deletions(-) diff --git a/frappe/core/doctype/navbar_settings/navbar_settings.py b/frappe/core/doctype/navbar_settings/navbar_settings.py index fd8db31d10..46eb5c3e7a 100644 --- a/frappe/core/doctype/navbar_settings/navbar_settings.py +++ b/frappe/core/doctype/navbar_settings/navbar_settings.py @@ -22,7 +22,6 @@ class NavbarSettings(Document): if not frappe.flags.in_patch and (len(before_save_items) > len(after_save_items)): frappe.throw(_("Please hide the standard navbar items instead of deleting them")) -@frappe.whitelist(allow_guest=True) def get_app_logo(): app_logo = frappe.db.get_single_value('Navbar Settings', 'app_logo', cache=True) if not app_logo: diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py index 66ffd48822..1366ace115 100644 --- a/frappe/core/doctype/user_permission/user_permission.py +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -54,7 +54,7 @@ class UserPermission(Document): ref_link = frappe.get_desk_link(self.doctype, overlap_exists[0].name) frappe.throw(_("{0} has already assigned default value for {1}.").format(ref_link, self.allow)) -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def get_user_permissions(user=None): '''Get all users permissions for the user as a dict of doctype''' # if this is called from client-side, diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index d276a9707f..89e6598859 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -13,7 +13,7 @@ from frappe.desk.form.document_follow import is_document_followed from frappe import _ from urllib.parse import quote -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def getdoc(doctype, name, user=None): """ Loads a doclist for a given document. This method is called directly from the client. @@ -52,7 +52,7 @@ def getdoc(doctype, name, user=None): frappe.response.docs.append(doc) -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def getdoctype(doctype, with_parent=False, cached_timestamp=None): """load doctype""" diff --git a/frappe/desk/listview.py b/frappe/desk/listview.py index f079205cb0..e733adf868 100644 --- a/frappe/desk/listview.py +++ b/frappe/desk/listview.py @@ -2,7 +2,7 @@ # License: MIT. See LICENSE import frappe -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def get_list_settings(doctype): try: return frappe.get_cached_doc("List View Settings", doctype) diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index 31eb224652..6c9fa2e937 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -14,7 +14,7 @@ from frappe.utils import cstr, format_duration from frappe.model.base_document import get_controller -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() @frappe.read_only() def get(): args = get_form_params() diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py index 90927e13f8..9ccd1c0210 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py @@ -336,7 +336,6 @@ def dropbox_auth_finish(return_access_token=False): _("Dropbox access is approved!") + close, indicator_color='green') -@frappe.whitelist(allow_guest=True) def set_dropbox_access_token(access_token): frappe.db.set_value("Dropbox Settings", None, 'dropbox_access_token', access_token) frappe.db.commit() diff --git a/frappe/sessions.py b/frappe/sessions.py index ce104968ad..bdf18f8d82 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -17,8 +17,8 @@ import redis from urllib.parse import unquote from frappe.cache_manager import clear_user_cache -@frappe.whitelist(allow_guest=True) -def clear(user=None): +@frappe.whitelist() +def clear(): frappe.local.session_obj.update(force=True) frappe.local.db.commit() clear_user_cache(frappe.session.user) From d99403393acfbdefefce406a0025a7811306e4d3 Mon Sep 17 00:00:00 2001 From: Pruthvi Patel Date: Mon, 18 Oct 2021 17:52:33 +0530 Subject: [PATCH 07/29] fix: rename `auto-reload` to `live-reload` --- esbuild/esbuild.js | 4 ++-- frappe/build.py | 8 ++++++-- frappe/public/js/frappe/build_events/BuildSuccess.vue | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/esbuild/esbuild.js b/esbuild/esbuild.js index b0ed92f9ec..c71fbc752c 100644 --- a/esbuild/esbuild.js +++ b/esbuild/esbuild.js @@ -44,7 +44,7 @@ let argv = yargs type: "boolean", description: "Run in watch mode and rebuild on file changes" }) - .option("auto-reload", { + .option("live-reload", { type: "boolean", description: `Automatically reload webpages when assets are rebuilt. Can only be used with the --watch flag.` @@ -481,7 +481,7 @@ async function notify_redis({ error, success }) { if (success) { payload = { success: true, - autoreload: argv["auto-reload"] + live_reload: argv["live-reload"] }; } diff --git a/frappe/build.py b/frappe/build.py index ec092d4b57..4472049ab7 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -235,8 +235,12 @@ def watch(apps=None): if apps: command += " --apps {apps}".format(apps=apps) - if frappe.conf.autoreload_on_build: - command += " --auto-reload" + live_reload = frappe.conf.live_reload + if "LIVE_RELOAD" in os.environ: + live_reload = os.environ["LIVE_RELOAD"] + + if live_reload: + command += " --live-reload" check_node_executable() frappe_app_path = frappe.get_app_path("frappe", "..") diff --git a/frappe/public/js/frappe/build_events/BuildSuccess.vue b/frappe/public/js/frappe/build_events/BuildSuccess.vue index d489c4a1a3..5ab40271bb 100644 --- a/frappe/public/js/frappe/build_events/BuildSuccess.vue +++ b/frappe/public/js/frappe/build_events/BuildSuccess.vue @@ -5,7 +5,7 @@ > Compiled successfully Refresh @@ -18,13 +18,13 @@ export default { data() { return { is_shown: false, - autoreload: false, + live_reload: false, }; }, methods: { show(data) { - if (data.autoreload) { - this.autoreload = true; + if (data.live_reload) { + this.live_reload = true; this.reload(); } From 3cec476cbc2f62d2ce4bd010657a7ec7455a7bc6 Mon Sep 17 00:00:00 2001 From: Pruthvi Patel Date: Mon, 18 Oct 2021 19:07:13 +0530 Subject: [PATCH 08/29] fix: add whitespace --- esbuild/esbuild.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esbuild/esbuild.js b/esbuild/esbuild.js index c71fbc752c..faccb36698 100644 --- a/esbuild/esbuild.js +++ b/esbuild/esbuild.js @@ -46,7 +46,7 @@ let argv = yargs }) .option("live-reload", { type: "boolean", - description: `Automatically reload webpages when assets are rebuilt. + description: `Automatically reload web pages when assets are rebuilt. Can only be used with the --watch flag.` }) .option("production", { From 059e5441c27baf0a81b2356359eabd1e3eb354ab Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 18 Oct 2021 21:33:06 +0530 Subject: [PATCH 09/29] ci: use semgrep pattern instead of regex --- .github/helper/semgrep_rules/frappe_correctness.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/helper/semgrep_rules/frappe_correctness.yml b/.github/helper/semgrep_rules/frappe_correctness.yml index 04341b3430..662e6e8022 100644 --- a/.github/helper/semgrep_rules/frappe_correctness.yml +++ b/.github/helper/semgrep_rules/frappe_correctness.yml @@ -132,8 +132,8 @@ rules: languages: [python] severity: ERROR -- id: frappe-using-db.sql - pattern-regex: \.sql.*\( +- id: frappe-using-db-sql + pattern: frappe.db.sql(...) message: | The PR contains a SQL query that may be re-written with frappe.qb (https://frappeframework.com/docs/user/en/api/query-builder) or the Database API (https://frappeframework.com/docs/user/en/api/database) languages: [python] From ac1bb636cf86490702dc6330d4c7e01937bb5d13 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 18 Oct 2021 22:11:38 +0530 Subject: [PATCH 10/29] ci: flag new instances of sql_ddl and sql_list --- .github/helper/semgrep_rules/frappe_correctness.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/helper/semgrep_rules/frappe_correctness.yml b/.github/helper/semgrep_rules/frappe_correctness.yml index 662e6e8022..1297d7fa67 100644 --- a/.github/helper/semgrep_rules/frappe_correctness.yml +++ b/.github/helper/semgrep_rules/frappe_correctness.yml @@ -133,8 +133,11 @@ rules: severity: ERROR - id: frappe-using-db-sql - pattern: frappe.db.sql(...) + pattern-either: + - pattern: frappe.db.sql(...) + - pattern: frappe.db.sql_ddl(...) + - pattern: frappe.db.sql_list(...) message: | The PR contains a SQL query that may be re-written with frappe.qb (https://frappeframework.com/docs/user/en/api/query-builder) or the Database API (https://frappeframework.com/docs/user/en/api/database) languages: [python] - severity: ERROR \ No newline at end of file + severity: ERROR From 770bda8cc624b9dc6a97113186701e8156b85034 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Tue, 19 Oct 2021 04:04:00 +0530 Subject: [PATCH 11/29] fix: use `cint`, as `os.environ` only contains string values --- frappe/build.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/build.py b/frappe/build.py index 4472049ab7..ddce94ac2f 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -235,9 +235,9 @@ def watch(apps=None): if apps: command += " --apps {apps}".format(apps=apps) - live_reload = frappe.conf.live_reload - if "LIVE_RELOAD" in os.environ: - live_reload = os.environ["LIVE_RELOAD"] + live_reload = frappe.utils.cint( + os.environ.get("LIVE_RELOAD", frappe.conf.live_reload) + ) if live_reload: command += " --live-reload" From 2e4f5e0796a202d5100c5de69ac9e11772029726 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Tue, 19 Oct 2021 01:41:02 +0200 Subject: [PATCH 12/29] fix: handle negative duration --- frappe/public/js/frappe/utils/utils.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 831538d255..065ae415f5 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1049,16 +1049,16 @@ Object.assign(frappe.utils, { return duration; }, - seconds_to_duration(value, duration_options) { - let secs = value; + seconds_to_duration(secs, duration_options) { + let round = secs > 0 ? Math.floor : Math.ceil; let total_duration = { - days: Math.floor(secs / (3600 * 24)), - hours: Math.floor(secs % (3600 * 24) / 3600), - minutes: Math.floor(secs % 3600 / 60), - seconds: Math.floor(secs % 60) + days: round(secs / (3600 * 24)), + hours: round(secs % (3600 * 24) / 3600), + minutes: round(secs % 3600 / 60), + seconds: round(secs % 60) }; if (duration_options.hide_days) { - total_duration.hours = Math.floor(secs / 3600); + total_duration.hours = round(secs / 3600); total_duration.days = 0; } return total_duration; From a575cff8a7f55fc5550bd6a519e3e6288b9200ee Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Tue, 19 Oct 2021 12:35:55 +0530 Subject: [PATCH 13/29] fix: Retry flaky test_printview_page if errored --- frappe/tests/test_website.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frappe/tests/test_website.py b/frappe/tests/test_website.py index 818dc8bce6..688679a80f 100644 --- a/frappe/tests/test_website.py +++ b/frappe/tests/test_website.py @@ -4,6 +4,7 @@ import frappe from frappe.utils import set_request from frappe.website.serve import get_response, get_response_content from frappe.website.utils import (build_response, clear_website_cache, get_home_page) +from tenacity import retry, stop_after_attempt, retry_if_exception_type class TestWebsite(unittest.TestCase): @@ -196,6 +197,11 @@ class TestWebsite(unittest.TestCase): delattr(frappe.hooks, 'page_renderer') frappe.cache().delete_key('app_hooks') + # TODO: Get rid of this retry logic + # Added since test is flaky and we can't figure out why at this point + @retry( + stop=stop_after_attempt(5), retry=retry_if_exception_type(AssertionError), + ) def test_printview_page(self): content = get_response_content('/Language/en') self.assertIn('