From f3d1010de059cec8056255b26feceb612d848a85 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Wed, 6 Dec 2023 15:01:01 +0000 Subject: [PATCH] Bug 35104: Catch the failure on new and edited records We now catch the error and display it to the end user so they can fix the issues before attempting to save again. Signed-off-by: baptiste --- C4/Biblio.pm | 10 +++- cataloguing/addbiblio.pl | 123 +++++++++++++++++++++++---------------- 2 files changed, 81 insertions(+), 52 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 0d6feb8aed..eb79c397a5 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -306,8 +306,14 @@ sub AddBiblio { $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" ); } } catch { - warn $_; - ( $biblionumber, $biblioitemnumber ) = ( undef, undef ); + my $error = $_; + if ( ref($error) eq 'Koha::Exceptions::Metadata::Invalid' ) { + ( $biblionumber, $biblioitemnumber ) = ( undef, undef ); + $error->rethrow; + } else { + warn $error; + ( $biblionumber, $biblioitemnumber ) = ( undef, undef ); + } }; return ( $biblionumber, $biblioitemnumber ); } diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index a11711afd3..c8dc30ea90 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -22,6 +22,8 @@ use Modern::Perl; use CGI; +use Try::Tiny; + use C4::Output qw( output_html_with_http_headers ); use C4::Auth qw( get_template_and_user haspermission ); use C4::Biblio qw( @@ -665,46 +667,56 @@ if ( $op eq "addbiblio" ) { # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate) if ( !$duplicatebiblionumber or $confirm_not_duplicate ) { my $oldbibitemnum; - if ( $is_a_modif ) { - my $member = Koha::Patrons->find($loggedinuser); - ModBiblio( - $record, - $biblionumber, - $frameworkcode, - { - overlay_context => { - source => $z3950 ? 'z3950' : 'intranet', - categorycode => $member->categorycode, - userid => $member->userid + my $encode_error = try { + if ($is_a_modif) { + my $member = Koha::Patrons->find($loggedinuser); + ModBiblio( + $record, + $biblionumber, + $frameworkcode, + { + overlay_context => { + source => $z3950 ? 'z3950' : 'intranet', + categorycode => $member->categorycode, + userid => $member->userid + } } - } - ); - } - else { - ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode ); - } - if ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view" && $redirect ne "just_save")){ + ); + } else { + ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode ); + } + return 0; + } catch { + my $exception = $_; + if ( ref($exception) eq 'Koha::Exceptions::Metadata::Invalid' ) { + $template->param( INVALID_METADATA => $exception ); + } else { + $exception->rethrow; + } + return 1; + }; + if (!$encode_error && ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view" && $redirect ne "just_save"))){ if ($frameworkcode eq 'FA'){ print $input->redirect( - '/cgi-bin/koha/cataloguing/additem.pl?' - .'biblionumber='.$biblionumber - .'&frameworkcode='.$frameworkcode - .'&circborrowernumber='.$fa_circborrowernumber - .'&branch='.$fa_branch - .'&barcode='.uri_escape_utf8($fa_barcode) - .'&stickyduedate='.$fa_stickyduedate - .'&duedatespec='.$fa_duedatespec + '/cgi-bin/koha/cataloguing/additem.pl?' + .'biblionumber='.$biblionumber + .'&frameworkcode='.$frameworkcode + .'&circborrowernumber='.$fa_circborrowernumber + .'&branch='.$fa_branch + .'&barcode='.uri_escape_utf8($fa_barcode) + .'&stickyduedate='.$fa_stickyduedate + .'&duedatespec='.$fa_duedatespec ); exit; } else { print $input->redirect( - "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid" + "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid" ); exit; } } - elsif(($is_a_modif || $redirect eq "view") && $redirect ne "just_save"){ + elsif(!$encode_error && (($is_a_modif || $redirect eq "view") && $redirect ne "just_save")){ my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); my $views = { C4::Search::enabled_staff_search_views }; if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { @@ -717,28 +729,39 @@ if ( $op eq "addbiblio" ) { print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); } exit; - - } - elsif ($redirect eq "just_save"){ - my $tab = $input->param('current_tab'); - print $input->redirect("/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"); - } - else { - $template->param( - biblionumber => $biblionumber, - done =>1, - popup =>1 - ); - if ( $record ne '-1' ) { - my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; - $template->param( title => $title ); - } - $template->param( - popup => $mode, - itemtype => $frameworkcode, - ); - output_html_with_http_headers $input, $cookie, $template->output; - exit; + } + elsif (!$encode_error && ($redirect eq "just_save")){ + my $tab = $input->param('current_tab'); + print $input->redirect("/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"); + } + elsif ($encode_error) { + build_tabs ($template, $record, $dbh,$encoding,$input); + $template->param( + biblionumber => $biblionumber, + popup => $mode, + frameworkcode => $frameworkcode, + itemtype => $frameworkcode, + borrowernumber => $loggedinuser, + tab => scalar $input->param('tab') + ); + output_html_with_http_headers $input, $cookie, $template->output; + exit; + } else { + $template->param( + biblionumber => $biblionumber, + done =>1, + popup =>1 + ); + if ( $record ne '-1' ) { + my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; + $template->param( title => $title ); + } + $template->param( + popup => $mode, + itemtype => $frameworkcode, + ); + output_html_with_http_headers $input, $cookie, $template->output; + exit; } } else { # it may be a duplicate, warn the user and do nothing -- 2.34.1