From f243a685cca895a0164048c9e68865666498997b Mon Sep 17 00:00:00 2001 From: Lari Taskula Date: Mon, 25 Jun 2018 17:20:44 +0300 Subject: [PATCH] Bug 20930: Display human readable errors in preferences page Displays human readable error when YAML/JSON preference has invalid syntax. If multiple preferences are modified at the same time, notifies librarian of the preferences that were saved and the ones that had errors. To test: 1. Apply patches 2. Write invalid YAML syntax to OpacHiddenItems system preference 3. Observe "Error; Preference OpacHiddenItems has invalid syntax" error 4. Write valid YAML syntax to OpacHiddenItems system preference 5. Observe "Saved preference OpacHiddenItems" message 6. Test steps 2-5 for both single preference modification and together with other system preferences. --- invalid: yaml syntax --- valid: yaml: syntax --- .../prog/en/modules/admin/preferences.tt | 1 + .../intranet-tmpl/prog/js/pages/preferences.js | 22 ++++++++++++++++- svc/config/systempreferences | 28 +++++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt index 2db4b2d..6ff9e13 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences.tt @@ -189,6 +189,7 @@ var MSG_SESSION_TIMED_OUT = _( "You need to log in again, your session has timed out" ); var MSG_DATA_NOT_SAVED = _( "Error; your data might not have been saved" ); var MSG_LOADING = _( "Loading..." ); + var MSG_INVALID_SYNTAX = _( "Error; Preference %s has invalid syntax" ); diff --git a/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js b/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js index f7ed5e1..dd5a6ad 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js +++ b/koha-tmpl/intranet-tmpl/prog/js/pages/preferences.js @@ -24,7 +24,8 @@ KOHA.Preferences = { data: data, url: '/cgi-bin/koha/svc/config/systempreferences/', success: function ( data ) { KOHA.Preferences.Success( form ) }, - complete: function () { KOHA.AJAX.MarkDone( $( form ).find( '.save-all' ) ) } + complete: function () { KOHA.AJAX.MarkDone( $( form ).find( '.save-all' ) ) }, + error: function( data ) { KOHA.Preferences.Error( data ) } } ); }, Success: function ( form ) { @@ -40,6 +41,25 @@ KOHA.Preferences = { .find( '.modified-warning' ).remove().end() .find( '.modified' ).removeClass('modified'); KOHA.Preferences.Modified = false; + }, + Error: function ( form ) { + msg = ""+ MSG_DATA_NOT_SAVED + "\n"; + modified_prefs.each(function(){ + var modified_pref = $(this).attr("id"); + modified_pref = modified_pref.replace("pref_",""); + if (modified_pref in form.sysprefs) { + if (form.sysprefs[modified_pref].error === 'Koha::Exceptions::Config::InvalidSyntax') { + msg += ""+ MSG_INVALID_SYNTAX.format(modified_pref) + "\n"; + } else { + msg += ""+ form.type + "\n"; + } + } else { + msg += ""+ MSG_SAVED_PREFERENCE.format(modified_pref) + "\n"; + } + }); + humanMsg.displayAlert(msg); + + KOHA.Preferences.Modified = true; } }; diff --git a/svc/config/systempreferences b/svc/config/systempreferences index 675c160..e6c5748 100755 --- a/svc/config/systempreferences +++ b/svc/config/systempreferences @@ -24,6 +24,13 @@ use C4::Context; use C4::Service; use C4::Log; +use Koha::Logger; + +use Scalar::Util qw( blessed ); +use Try::Tiny; + +our $logger = Koha::Logger->get({ interface => 'intranet' }); + =head1 NAME svc/config/systempreferences - Web service for setting system preferences @@ -87,6 +94,7 @@ pref_virtualshelves=0 =cut sub set_preferences { + my $errors; unless ( C4::Context->config( 'demo' ) ) { foreach my $param ( $query->param() ) { my ( $pref ) = ( $param =~ /pref_(.*)/ ); @@ -94,12 +102,26 @@ sub set_preferences { next if ( !defined( $pref ) ); my $value = join( ',', $query->multi_param( $param ) ); - - C4::Context->set_preference( $pref, $value ); + try { + C4::Context->set_preference( $pref, $value ); + } catch { + unless (blessed $_ && $_->can('rethrow')) { + $logger->error( "Error saving system preference $pref, $_" ); + $errors->{$pref} = { error => $_ }; + } else { + $logger->error( "Error saving system preference $pref (" . + ref($_) . ')' ); + $errors->{$pref} = { error => ref($_) }; + } + }; } } - C4::Service->return_success( $response ); + if ($errors) { + return C4::Service->return_error( 'input', undef, sysprefs => $errors ); + } + + C4::Service->return_success( $response ) } C4::Service->dispatch( -- 2.7.4