Handle backend errors properly and display them correctly on GUI for Grant Wizard

This commit is contained in:
Murtuza Zabuawala 2019-01-30 16:39:34 +05:30 committed by Akshay Joshi
parent 0e489df7b0
commit 317a04eafc
3 changed files with 59 additions and 24 deletions

View File

@ -21,7 +21,8 @@
display: inline-block; display: inline-block;
} }
.alert.alert-info { .alert.alert-info,
.alert.alert-danger {
padding: 0.5rem; padding: 0.5rem;
} }

View File

@ -191,6 +191,7 @@ def properties(sid, did, node_id, node_type):
server_prop = server_info server_prop = server_info
res_data = [] res_data = []
failed_objects = []
manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
conn = manager.connection(did=did) conn = manager.connection(did=did)
@ -231,11 +232,11 @@ def properties(sid, did, node_id, node_type):
node_id=node_id, type='function') node_id=node_id, type='function')
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('function')
res_data.extend(res['rows']) else:
res_data.extend(res['rows'])
# Fetch procedures only if server type is EPAS or PG >= 11 # Fetch procedures only if server type is EPAS or PG >= 11
if (len(server_prop) > 0 and if (len(server_prop) > 0 and
@ -250,9 +251,10 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('procedure')
res_data.extend(res['rows']) else:
res_data.extend(res['rows'])
# Fetch trigger functions # Fetch trigger functions
if ntype in ['schema', 'trigger_function']: if ntype in ['schema', 'trigger_function']:
@ -262,9 +264,10 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('trigger function')
res_data.extend(res['rows']) else:
res_data.extend(res['rows'])
# Fetch Sequences against schema # Fetch Sequences against schema
if ntype in ['schema', 'sequence']: if ntype in ['schema', 'sequence']:
@ -274,8 +277,10 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
res_data.extend(res['rows']) failed_objects.append('sequence')
else:
res_data.extend(res['rows'])
# Fetch Tables against schema # Fetch Tables against schema
if ntype in ['schema', 'table']: if ntype in ['schema', 'table']:
@ -285,9 +290,10 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('table')
res_data.extend(res['rows']) else:
res_data.extend(res['rows'])
# Fetch Views against schema # Fetch Views against schema
if ntype in ['schema', 'view']: if ntype in ['schema', 'view']:
@ -297,9 +303,10 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('view')
res_data.extend(res['rows']) else:
res_data.extend(res['rows'])
# Fetch Materialzed Views against schema # Fetch Materialzed Views against schema
if ntype in ['schema', 'mview']: if ntype in ['schema', 'mview']:
@ -309,12 +316,20 @@ def properties(sid, did, node_id, node_type):
status, res = conn.execute_dict(SQL) status, res = conn.execute_dict(SQL)
if not status: if not status:
return internal_server_error(errormsg=res) current_app.logger.error(res)
failed_objects.append('materialized view')
else:
res_data.extend(res['rows'])
res_data.extend(res['rows']) msg = None
if len(failed_objects) > 0:
msg = gettext('Unable to fetch the {} objects'.format(
", ".join(failed_objects))
)
return ajax_response( return make_json_response(
response=res_data, result=res_data,
info=msg,
status=200 status=200
) )

View File

@ -608,9 +608,28 @@ define([
$('.wizard-progress-bar p').show(); $('.wizard-progress-bar p').show();
coll.fetch({ coll.fetch({
success: function() { success: function(c, xhr) {
$('.wizard-progress-bar p').html(''); $('.wizard-progress-bar p').html('');
$('.wizard-progress-bar').hide(); $('.wizard-progress-bar').hide();
c.set(xhr.result, {parse: true});
// If some objects failed while fetching then we will notify the user
if (xhr && xhr.info && xhr.info !== '') {
$('.pg-prop-status-bar .alert-text').html(xhr.info);
$('.pg-prop-status-bar').css('visibility', 'visible');
}
},
error: function(m, xhr) {
// If the main request fails as whole then
let msg;
if (xhr && xhr.responseJSON && xhr.responseJSON.errormsg) {
msg = xhr.responseJSON.errormsg;
}
if(!msg) {
msg = gettext('Unable to fetch the database objects due to an error');
}
$('.wizard-progress-bar p').removeClass('alert-info').addClass('alert-danger');
$('.wizard-progress-bar p').text(msg);
}, },
reset: true, reset: true,
}, this); }, this);