From 68e3a482b262e51e20e4dbe359399a902c9fe251 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Mon, 11 Dec 2017 11:01:36 +0530 Subject: [PATCH 1/6] setup complete stages --- frappe/desk/page/setup_wizard/setup_wizard.js | 12 ++- frappe/desk/page/setup_wizard/setup_wizard.py | 75 ++++++++++++------- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index f3045a8ce03..5f66e859850 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -187,11 +187,19 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.update_values(); this.show_working_state(); this.disable_keyboard_nav(); + frappe.realtime.on("setup_task", (data) => { + if(data.progress) { + this.working_state_message.find('.setup-message') + // .html('Process '+ data.progress[0] + ' of ' + data.progress[1] + ': ' + data.stage_status); + .html(data.stage_status + ' ...'); + } + }) return frappe.call({ method: "frappe.desk.page.setup_wizard.setup_wizard.setup_complete", args: {args: this.values}, callback: function() { me.show_setup_complete_state(); + if(frappe.setup.welcome_page) { localStorage.setItem("session_last_route", frappe.setup.welcome_page); } @@ -238,7 +246,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.working_state_message = this.get_message( __("Setting Up"), - __("Sit tight while your system is being setup. This may take a few moments."), + __("Starting setup ..."), true ).appendTo(this.parent); @@ -271,7 +279,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { : `${title}` } -

${message}

+

${message}

${loading_html}
diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index a986d24d45a..faea8f3bde4 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -19,44 +19,70 @@ def setup_complete(args): and clears cache. If wizard breaks, calls `setup_wizard_exception` hook""" if cint(frappe.db.get_single_value('System Settings', 'setup_complete')): - # do not throw an exception if setup is already complete - # let the user continue to desk + # Setup complete: do not throw an exception, let the user continue to desk return - #frappe.throw(_('Setup already complete')) - args = process_args(args) + args = parse_args(args) - try: - if args.language and args.language != "english": - set_default_language(get_language_code(args.language)) - - frappe.clear_cache() - - # update system settings - update_system_settings(args) - update_user_name(args) - - for method in frappe.get_hooks("setup_wizard_complete"): - frappe.get_attr(method)(args) + update_global_settings(args) + run_setup_complete_hook(args) + try: disable_future_access() - frappe.db.commit() frappe.clear_cache() except: frappe.db.rollback() - if args: - traceback = frappe.get_traceback() - for hook in frappe.get_hooks("setup_wizard_exception"): - frappe.get_attr(hook)(traceback, args) - raise - else: for hook in frappe.get_hooks("setup_wizard_success"): frappe.get_attr(hook)(args) install_fixtures.install() +def update_global_settings(args): + try: + if args.language and args.language != "english": + set_default_language(get_language_code(args.lang)) + frappe.clear_cache() + + # update system settings + update_system_settings(args) + update_user_name(args) + except: + frappe.db.rollback() + frappe.throw("Error in updating system settings") + +def run_setup_complete_hook(args): + for method in frappe.get_hooks("setup_wizard_complete"): + stages = None + try: + stages = frappe.get_attr(method)(args) + except: + handle_setup_exception(args) + + if isinstance(stages, list): + run_setup_stages(stages, args) + +def run_setup_stages(stages, args): + for idx, stage in enumerate(stages): + # pass stage.get('status') to client + frappe.publish_realtime('setup_task', {"progress": [idx, len(stages)], + "stage_status": stage.get('status')}, user=frappe.session.user) + try: + current_task = None + for task in stage.get('tasks'): + current_task = task + task.get('f')(task.get('args')) + except: + handle_setup_exception(args) + frappe.throw(stage.get('error') + ': ' + current_task.get('error_msg')) + +def handle_setup_exception(args): + frappe.db.rollback() + if args: + traceback = frappe.get_traceback() + for hook in frappe.get_hooks("setup_wizard_exception"): + frappe.get_attr(hook)(traceback, args) def update_system_settings(args): number_format = get_country_info(args.get("country")).get("number_format", "#,###.##") @@ -126,7 +152,7 @@ def update_user_name(args): if args.get('name'): add_all_roles_to(args.get("name")) -def process_args(args): +def parse_args(args): if not args: args = frappe.local.form_dict if isinstance(args, string_types): @@ -275,7 +301,6 @@ def email_setup_wizard_exception(traceback, args): def get_language_code(lang): return frappe.db.get_value('Language', {'language_name':lang}) - def enable_twofactor_all_roles(): all_role = frappe.get_doc('Role',{'role_name':'All'}) all_role.two_factor_auth = True From 2684b3b5df9c2c3c1955130b101457ebc746a748 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Wed, 13 Dec 2017 02:15:26 +0530 Subject: [PATCH 2/6] [setup] better setup-in-progress card --- frappe/desk/page/setup_wizard/setup_wizard.js | 85 +++++++++---------- frappe/public/css/page.css | 10 +-- frappe/public/less/page.less | 11 +-- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index 5f66e859850..84f7690cb83 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -182,11 +182,45 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } action_on_complete() { - var me = this; if (!this.current_slide.set_values()) return; this.update_values(); this.show_working_state(); this.disable_keyboard_nav(); + this.listen_for_setup_stages(); + + return frappe.call({ + method: "frappe.desk.page.setup_wizard.setup_wizard.setup_complete", + args: {args: this.values}, + callback: this.post_setup_success.bind(this), + error: this.abort_setup.bind(this) + }); + } + + post_setup_success() { + this.show_setup_complete_state(); + + if(frappe.setup.welcome_page) { + localStorage.setItem("session_last_route", frappe.setup.welcome_page); + } + setTimeout(function() { + // Reload + window.location.href = ''; + }, 2000); + setTimeout(()=> { + $('body').removeClass('setup-state'); + }, 20000); + } + + abort_setup() { + var d = frappe.msgprint(__("There were errors.")); + d.custom_onhide = () => { + $(this.parent).find('.setup-in-progress').remove(); + this.container.show(); + frappe.set_route(this.page_name, this.slides.length - 1); + }; + } + + listen_for_setup_stages() { frappe.realtime.on("setup_task", (data) => { if(data.progress) { this.working_state_message.find('.setup-message') @@ -194,33 +228,6 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { .html(data.stage_status + ' ...'); } }) - return frappe.call({ - method: "frappe.desk.page.setup_wizard.setup_wizard.setup_complete", - args: {args: this.values}, - callback: function() { - me.show_setup_complete_state(); - - if(frappe.setup.welcome_page) { - localStorage.setItem("session_last_route", frappe.setup.welcome_page); - } - setTimeout(function() { - // Reload - window.location.href = ''; - }, 2000); - setTimeout(()=> { - $('body').removeClass('setup-state'); - }, 20000); - }, - error: function() { - var d = frappe.msgprint(__("There were errors.")); - d.custom_onhide = function() { - $(me.parent).find('.page-card-container').remove(); - $('body').removeClass('setup-state'); - me.container.show(); - frappe.set_route(me.page_name, me.slides.length - 1); - }; - } - }); } get_setup_slides_filtered_by_domain() { @@ -241,12 +248,11 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { show_working_state() { this.container.hide(); - $('body').addClass('setup-state'); frappe.set_route(this.page_name); this.working_state_message = this.get_message( - __("Setting Up"), - __("Starting setup ..."), + __("Setting up your system"), + __("Starting Frappé ..."), true ).appendTo(this.parent); @@ -271,18 +277,11 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { style="font-size: 64px; margin-top: -8px;"> `; - return $(`
-
-
- ${loading - ? `${title}` - : `${title}` - } -
-

${message}

-
- ${loading_html} -
+ return $(`
+
+

${title}

+
${loading_html}
+

${message}

`); } diff --git a/frappe/public/css/page.css b/frappe/public/css/page.css index c31886e1cdd..aa3aa4e29ba 100644 --- a/frappe/public/css/page.css +++ b/frappe/public/css/page.css @@ -338,20 +338,20 @@ select.input-sm { } .lds-rolling div { position: absolute; - width: 60px; - height: 60px; + width: 55px; + height: 55px; border: 3px solid #d1d8dd; border-top-color: transparent; border-radius: 50%; -webkit-animation: lds-rolling 1s linear infinite; animation: lds-rolling 1s linear infinite; - top: 50px; + top: 46px; left: 50px; } .lds-rolling div:after { position: absolute; - width: 60px; - height: 60px; + width: 55px; + height: 55px; border: 3px solid #d1d8dd; border-top-color: transparent; border-radius: 50%; diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index bd96d1e60e0..8d422352ebb 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -402,19 +402,20 @@ select.input-sm { transform: translate(-100px, -100px) scale(1) translate(100px, 100px); div { position: absolute; - width: 60px; - height: 60px; + width: 55px; + height: 55px; border: 3px solid #d1d8dd; border-top-color: transparent; border-radius: 50%; -webkit-animation: lds-rolling 1s linear infinite; animation: lds-rolling 1s linear infinite; - top: 50px; + // top: 50px; + top: 46px; // to align with icons of same size left: 50px; &:after { position: absolute; - width: 60px; - height: 60px; + width: 55px; + height: 55px; border: 3px solid #d1d8dd; border-top-color: transparent; border-radius: 50%; From 13c24509dbf64c53e322c2ac874711cb85b4fadb Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 14 Dec 2017 08:19:58 +0530 Subject: [PATCH 3/6] restructure setup exception flow --- frappe/desk/page/setup_wizard/setup_wizard.js | 92 ++++++++--- frappe/desk/page/setup_wizard/setup_wizard.py | 148 +++++++++++------- frappe/public/css/page.css | 46 ------ frappe/public/less/page.less | 47 ------ 4 files changed, 167 insertions(+), 166 deletions(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index 84f7690cb83..6fc9554fbb3 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -191,7 +191,13 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { return frappe.call({ method: "frappe.desk.page.setup_wizard.setup_wizard.setup_complete", args: {args: this.values}, - callback: this.post_setup_success.bind(this), + callback: (r) => { + if(r.message.status === 'ok') { + this.post_setup_success(); + } else if(r.message.error !== undefined) { + this.abort_setup(r.message.error) + } + }, error: this.abort_setup.bind(this) }); } @@ -211,25 +217,34 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { }, 20000); } - abort_setup() { - var d = frappe.msgprint(__("There were errors.")); - d.custom_onhide = () => { - $(this.parent).find('.setup-in-progress').remove(); - this.container.show(); - frappe.set_route(this.page_name, this.slides.length - 1); - }; + abort_setup(error_msg) { + this.$working_state.find('.state-icon-container').html(this.get_error_icon); + error_msg = error_msg ? error_msg : ""; + this.update_setup_message('Could not start up: ' + error_msg); + + this.$working_state.find('.title').html('Setup failed'); + + this.$abort_btn.show(); } listen_for_setup_stages() { frappe.realtime.on("setup_task", (data) => { - if(data.progress) { - this.working_state_message.find('.setup-message') - // .html('Process '+ data.progress[0] + ' of ' + data.progress[1] + ': ' + data.stage_status); - .html(data.stage_status + ' ...'); + // console.log('data', data); + if(data.stage_status) { + // .html('Process '+ data.progress[0] + ' of ' + data.progress[1] + ': ' + data.stage_status); + this.update_setup_message(data.stage_status); + this.set_setup_load_percent((data.progress[0]+1)/data.progress[1] * 100); + } + if(data.error_msg) { + this.abort_setup(data.error_msg); } }) } + update_setup_message(message) { + this.$working_state.find('.setup-message').html(message); + } + get_setup_slides_filtered_by_domain() { var filtered_slides = []; frappe.setup.slides.forEach(function(slide) { @@ -250,12 +265,14 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.container.hide(); frappe.set_route(this.page_name); - this.working_state_message = this.get_message( + this.$working_state = this.get_message( __("Setting up your system"), __("Starting Frappé ..."), true ).appendTo(this.parent); + this.attach_abort_button(); + this.current_id = this.slides.length; this.current_slide = null; this.completed_state_message = this.get_message( @@ -265,17 +282,42 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } show_setup_complete_state() { - this.working_state_message.hide(); + this.$working_state.hide(); this.completed_state_message.appendTo(this.parent); } + attach_abort_button() { + this.$abort_btn = $(``); + this.$working_state.find('.content').append(this.$abort_btn); + + this.$abort_btn.on('click', () => { + $(this.parent).find('.setup-in-progress').remove(); + this.container.show(); + frappe.set_route(this.page_name, this.slides.length - 1); + }); + + this.$abort_btn.hide(); + } + get_message(title, message="", loading=false) { + // let success_icon = `
+ // + //
`; + let success_icon = `
+ +
`; + //let load_icon = '
'; + let load_icon = `
+
+
+
+
`; const loading_html = loading - ? '
' - : `
- -
`; + ? load_icon + : success_icon; return $(`
@@ -285,6 +327,18 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides {
`); } + + set_setup_load_percent(percent) { + this.$working_state.find('.progress-bar').css({"width": percent + "%"}); + } + + get_error_icon() { + // return $(`
+ // + //
`); + return $(''); + } }; frappe.setup.SetupWizardSlide = class SetupWizardSlide extends frappe.ui.Slide { diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index faea8f3bde4..6b0205ab307 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -13,69 +13,108 @@ from . import install_fixtures from six import string_types +def get_setup_stages(args): + + stages = [ + { + 'status': 'Updating global settings', + 'error_msg': 'Failed to update global settings', + 'tasks': [ + { + 'fn': update_global_settings, + 'args': args, + 'error_msg': 'Failed to update global settings' + } + ] + } + ] + + stages += get_stages_hooks(args) + get_setup_complete_hooks(args) + + stages.append({ + # post executing hooks + 'status': 'Wrapping up', + 'error_msg': '', + 'tasks': [ + { + 'fn': run_post_setup_complete, + 'args': args, + 'error_msg': 'Failed to complete setup' + } + ] + }) + + return stages + @frappe.whitelist() def setup_complete(args): """Calls hooks for `setup_wizard_complete`, sets home page as `desktop` and clears cache. If wizard breaks, calls `setup_wizard_exception` hook""" + # Setup complete: do not throw an exception, let the user continue to desk if cint(frappe.db.get_single_value('System Settings', 'setup_complete')): - # Setup complete: do not throw an exception, let the user continue to desk return args = parse_args(args) - update_global_settings(args) - run_setup_complete_hook(args) + stages = get_setup_stages(args) try: - disable_future_access() - frappe.db.commit() - frappe.clear_cache() + current_task = None + for idx, stage in enumerate(stages): + frappe.publish_realtime('setup_task', {"progress": [idx, len(stages)], + "stage_status": stage.get('status')}, user=frappe.session.user) + + for task in stage.get('tasks'): + current_task = task + task.get('fn')(task.get('args')) + except: - frappe.db.rollback() - raise + handle_setup_exception(args) + return {'error': current_task.get('error_msg') or ''} else: - for hook in frappe.get_hooks("setup_wizard_success"): - frappe.get_attr(hook)(args) - install_fixtures.install() + run_setup_success(args) + return {'status': 'ok'} def update_global_settings(args): - try: - if args.language and args.language != "english": - set_default_language(get_language_code(args.lang)) - frappe.clear_cache() + if args.language and args.language != "english": + set_default_language(get_language_code(args.lang)) + frappe.clear_cache() - # update system settings - update_system_settings(args) - update_user_name(args) - except: - frappe.db.rollback() - frappe.throw("Error in updating system settings") + update_system_settings(args) + update_user_name(args) + +def run_post_setup_complete(args): + disable_future_access() + frappe.db.commit() + frappe.clear_cache() -def run_setup_complete_hook(args): +def run_setup_success(args): + for hook in frappe.get_hooks("setup_wizard_success"): + frappe.get_attr(hook)(args) + install_fixtures.install() + +def get_stages_hooks(args): + stages = [] + for method in frappe.get_hooks("setup_wizard_stages"): + stages += frappe.get_attr(method)(args) + return stages + +def get_setup_complete_hooks(args): + stages = [] for method in frappe.get_hooks("setup_wizard_complete"): - stages = None - try: - stages = frappe.get_attr(method)(args) - except: - handle_setup_exception(args) - - if isinstance(stages, list): - run_setup_stages(stages, args) - -def run_setup_stages(stages, args): - for idx, stage in enumerate(stages): - # pass stage.get('status') to client - frappe.publish_realtime('setup_task', {"progress": [idx, len(stages)], - "stage_status": stage.get('status')}, user=frappe.session.user) - try: - current_task = None - for task in stage.get('tasks'): - current_task = task - task.get('f')(task.get('args')) - except: - handle_setup_exception(args) - frappe.throw(stage.get('error') + ': ' + current_task.get('error_msg')) + stages.append({ + 'status': 'Executing method', + 'error_msg': 'Failed to execute method', + 'tasks': [ + { + 'fn': frappe.get_attr(method), + 'args': args, + 'error_msg': 'Failed to execute method' + } + ] + }) + return stages def handle_setup_exception(args): frappe.db.rollback() @@ -260,14 +299,6 @@ def email_setup_wizard_exception(traceback, args): user_agent = frappe._dict() message = """ -#### Basic Information - -- **Site:** {site} -- **User:** {user} -- **Browser:** {user_agent.platform} {user_agent.browser} version: {user_agent.version} language: {user_agent.language} -- **Browser Languages**: `{accept_languages}` - ---- #### Traceback @@ -283,7 +314,16 @@ def email_setup_wizard_exception(traceback, args): #### Request Headers -
{headers}
""".format( +
{headers}
+ +--- + +#### Basic Information + +- **Site:** {site} +- **User:** {user} +- **Browser:** {user_agent.platform} {user_agent.browser} version: {user_agent.version} language: {user_agent.language} +- **Browser Languages**: `{accept_languages}`""".format( site=frappe.local.site, traceback=traceback, args="\n".join(pretty_args), @@ -294,7 +334,7 @@ def email_setup_wizard_exception(traceback, args): frappe.sendmail(recipients=frappe.local.conf.setup_wizard_exception_email, sender=frappe.session.user, - subject="Exception in Setup Wizard - {}".format(frappe.local.site), + subject="Setup failed: {}".format(frappe.local.site), message=message, delayed=False) diff --git a/frappe/public/css/page.css b/frappe/public/css/page.css index aa3aa4e29ba..d015a0a5bdc 100644 --- a/frappe/public/css/page.css +++ b/frappe/public/css/page.css @@ -312,49 +312,3 @@ select.input-sm { justify-content: center; align-items: center; } -@keyframes lds-rolling { - 0% { - -webkit-transform: translate(-50%, -50%) rotate(0deg); - transform: translate(-50%, -50%) rotate(0deg); - } - 100% { - -webkit-transform: translate(-50%, -50%) rotate(360deg); - transform: translate(-50%, -50%) rotate(360deg); - } -} -@-webkit-keyframes lds-rolling { - 0% { - -webkit-transform: translate(-50%, -50%) rotate(0deg); - transform: translate(-50%, -50%) rotate(0deg); - } - 100% { - -webkit-transform: translate(-50%, -50%) rotate(360deg); - transform: translate(-50%, -50%) rotate(360deg); - } -} -.lds-rolling { - -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); - transform: translate(-100px, -100px) scale(1) translate(100px, 100px); -} -.lds-rolling div { - position: absolute; - width: 55px; - height: 55px; - border: 3px solid #d1d8dd; - border-top-color: transparent; - border-radius: 50%; - -webkit-animation: lds-rolling 1s linear infinite; - animation: lds-rolling 1s linear infinite; - top: 46px; - left: 50px; -} -.lds-rolling div:after { - position: absolute; - width: 55px; - height: 55px; - border: 3px solid #d1d8dd; - border-top-color: transparent; - border-radius: 50%; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); -} diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index 8d422352ebb..13213fc099e 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -376,51 +376,4 @@ select.input-sm { align-items: center; } -@keyframes lds-rolling { - 0% { - -webkit-transform: translate(-50%, -50%) rotate(0deg); - transform: translate(-50%, -50%) rotate(0deg); - } - 100% { - -webkit-transform: translate(-50%, -50%) rotate(360deg); - transform: translate(-50%, -50%) rotate(360deg); - } -} -@-webkit-keyframes lds-rolling { - 0% { - -webkit-transform: translate(-50%, -50%) rotate(0deg); - transform: translate(-50%, -50%) rotate(0deg); - } - 100% { - -webkit-transform: translate(-50%, -50%) rotate(360deg); - transform: translate(-50%, -50%) rotate(360deg); - } -} -.lds-rolling { - -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); - transform: translate(-100px, -100px) scale(1) translate(100px, 100px); - div { - position: absolute; - width: 55px; - height: 55px; - border: 3px solid #d1d8dd; - border-top-color: transparent; - border-radius: 50%; - -webkit-animation: lds-rolling 1s linear infinite; - animation: lds-rolling 1s linear infinite; - // top: 50px; - top: 46px; // to align with icons of same size - left: 50px; - &:after { - position: absolute; - width: 55px; - height: 55px; - border: 3px solid #d1d8dd; - border-top-color: transparent; - border-radius: 50%; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - } -} From 1efa737d2dbd14e5d9f19bec35728f6fd8030763 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Thu, 14 Dec 2017 09:00:37 +0530 Subject: [PATCH 4/6] use setup_stages hook --- frappe/desk/page/setup_wizard/setup_wizard.js | 56 +++++-------------- frappe/desk/page/setup_wizard/setup_wizard.py | 6 +- frappe/public/css/page.css | 3 + frappe/public/less/page.less | 4 ++ 4 files changed, 23 insertions(+), 46 deletions(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index 6fc9554fbb3..fae1ae569c2 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -195,7 +195,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { if(r.message.status === 'ok') { this.post_setup_success(); } else if(r.message.error !== undefined) { - this.abort_setup(r.message.error) + this.abort_setup(r.message.error); } }, error: this.abort_setup.bind(this) @@ -203,8 +203,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { } post_setup_success() { - this.show_setup_complete_state(); - + this.set_setup_complete_message(__("Setup Complete"), __("Refreshing...")); if(frappe.setup.welcome_page) { localStorage.setItem("session_last_route", frappe.setup.welcome_page); } @@ -212,14 +211,11 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { // Reload window.location.href = ''; }, 2000); - setTimeout(()=> { - $('body').removeClass('setup-state'); - }, 20000); } abort_setup(error_msg) { - this.$working_state.find('.state-icon-container').html(this.get_error_icon); - error_msg = error_msg ? error_msg : ""; + this.$working_state.find('.state-icon-container').html(''); + error_msg = error_msg ? error_msg : __("Failed to complete setup"); this.update_setup_message('Could not start up: ' + error_msg); this.$working_state.find('.title').html('Setup failed'); @@ -267,23 +263,12 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.$working_state = this.get_message( __("Setting up your system"), - __("Starting Frappé ..."), - true - ).appendTo(this.parent); + __("Starting Frappé ...")).appendTo(this.parent); this.attach_abort_button(); this.current_id = this.slides.length; this.current_slide = null; - this.completed_state_message = this.get_message( - __("Setup Complete"), - __("Refreshing...") - ); - } - - show_setup_complete_state() { - this.$working_state.hide(); - this.completed_state_message.appendTo(this.parent); } attach_abort_button() { @@ -300,24 +285,12 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.$abort_btn.hide(); } - get_message(title, message="", loading=false) { - // let success_icon = `
- // - //
`; - let success_icon = `
- -
`; - //let load_icon = '
'; - let load_icon = `
+ get_message(title, message="") { + const loading_html = `
-
+
`; - const loading_html = loading - ? load_icon - : success_icon; return $(`
@@ -328,16 +301,13 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides {
`); } - set_setup_load_percent(percent) { - this.$working_state.find('.progress-bar').css({"width": percent + "%"}); + set_setup_complete_message(title, message) { + this.$working_state.find('.title').html(title); + this.$working_state.find('.setup-message').html(message); } - get_error_icon() { - // return $(`
- // - //
`); - return $(''); + set_setup_load_percent(percent) { + this.$working_state.find('.progress-bar').css({"width": percent + "%"}); } }; diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 6b0205ab307..13bb68bcbfe 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -34,7 +34,7 @@ def get_setup_stages(args): stages.append({ # post executing hooks 'status': 'Wrapping up', - 'error_msg': '', + 'error_msg': 'Failed to complete setup', 'tasks': [ { 'fn': run_post_setup_complete, @@ -69,9 +69,9 @@ def setup_complete(args): current_task = task task.get('fn')(task.get('args')) - except: + except Exception: handle_setup_exception(args) - return {'error': current_task.get('error_msg') or ''} + return {'error': current_task.get('error_msg')} else: run_setup_success(args) return {'status': 'ok'} diff --git a/frappe/public/css/page.css b/frappe/public/css/page.css index d015a0a5bdc..9dd2c5b8663 100644 --- a/frappe/public/css/page.css +++ b/frappe/public/css/page.css @@ -279,6 +279,9 @@ select.input-sm { opacity: 1; cursor: pointer; } +.setup-wizard-slide .progress-bar { + background-color: #5e64ff; +} .page-card-container { padding: 70px; } diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index 13213fc099e..378f91e481d 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -335,6 +335,10 @@ select.input-sm { cursor: pointer; } } + + .progress-bar { + background-color: #5e64ff; + } } .page-card-container { From 9b6f67423665f956b1ab2343c73b065888749179 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Wed, 20 Dec 2017 13:06:01 +0530 Subject: [PATCH 5/6] Add message for non-dev mode, fail instead of error --- frappe/desk/page/setup_wizard/setup_wizard.js | 23 ++++++++++++------- frappe/desk/page/setup_wizard/setup_wizard.py | 14 +++++------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index fae1ae569c2..3b75c5cba44 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -194,11 +194,11 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { callback: (r) => { if(r.message.status === 'ok') { this.post_setup_success(); - } else if(r.message.error !== undefined) { - this.abort_setup(r.message.error); + } else if(r.message.fail !== undefined) { + this.abort_setup(r.message.fail); } }, - error: this.abort_setup.bind(this) + error: this.abort_setup.bind(this, "Error in setup", true) }); } @@ -213,10 +213,17 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { }, 2000); } - abort_setup(error_msg) { + abort_setup(fail_msg, error=false) { this.$working_state.find('.state-icon-container').html(''); - error_msg = error_msg ? error_msg : __("Failed to complete setup"); - this.update_setup_message('Could not start up: ' + error_msg); + fail_msg = fail_msg ? fail_msg : __("Failed to complete setup"); + + if(error && !frappe.boot.developer_mode) { + frappe.msgprint(`Don't worry. It's not you, it's us. We've + received the issue details and will get back to you on the solution. + Please feel free to contact us on support@erpnext.com in the meantime.`); + } + + this.update_setup_message('Could not start up: ' + fail_msg); this.$working_state.find('.title').html('Setup failed'); @@ -231,8 +238,8 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.update_setup_message(data.stage_status); this.set_setup_load_percent((data.progress[0]+1)/data.progress[1] * 100); } - if(data.error_msg) { - this.abort_setup(data.error_msg); + if(data.fail_msg) { + this.abort_setup(data.fail_msg); } }) } diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 13bb68bcbfe..9eaac38bc77 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -18,12 +18,12 @@ def get_setup_stages(args): stages = [ { 'status': 'Updating global settings', - 'error_msg': 'Failed to update global settings', + 'fail_msg': 'Failed to update global settings', 'tasks': [ { 'fn': update_global_settings, 'args': args, - 'error_msg': 'Failed to update global settings' + 'fail_msg': 'Failed to update global settings' } ] } @@ -34,12 +34,12 @@ def get_setup_stages(args): stages.append({ # post executing hooks 'status': 'Wrapping up', - 'error_msg': 'Failed to complete setup', + 'fail_msg': 'Failed to complete setup', 'tasks': [ { 'fn': run_post_setup_complete, 'args': args, - 'error_msg': 'Failed to complete setup' + 'fail_msg': 'Failed to complete setup' } ] }) @@ -71,7 +71,7 @@ def setup_complete(args): except Exception: handle_setup_exception(args) - return {'error': current_task.get('error_msg')} + return {'status': 'fail', 'fail': current_task.get('fail_msg')} else: run_setup_success(args) return {'status': 'ok'} @@ -105,12 +105,12 @@ def get_setup_complete_hooks(args): for method in frappe.get_hooks("setup_wizard_complete"): stages.append({ 'status': 'Executing method', - 'error_msg': 'Failed to execute method', + 'fail_msg': 'Failed to execute method', 'tasks': [ { 'fn': frappe.get_attr(method), 'args': args, - 'error_msg': 'Failed to execute method' + 'fail_msg': 'Failed to execute method' } ] }) From b8576c1e054a35a3701663817ce991dcf77da6e0 Mon Sep 17 00:00:00 2001 From: Prateeksha Singh Date: Wed, 20 Dec 2017 13:10:14 +0530 Subject: [PATCH 6/6] message to not include commits in app setup stages --- frappe/desk/page/setup_wizard/setup_wizard.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 9eaac38bc77..eef203ab04d 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -15,6 +15,8 @@ def get_setup_stages(args): + # App setup stage functions should not include frappe.db.commit + # That is done by frappe after successful completion of all stages stages = [ { 'status': 'Updating global settings',