X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=tools%2Fmanage-marc-import.pl;h=ef0bd36d332ed43652c1064e6e7ab48522d836cd;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=8a8d9e893b07a2bb384a4da1487619032b40c81e;hpb=0ffd765824644e9975b6854616b745922eee393c;p=srvgit diff --git a/tools/manage-marc-import.pl b/tools/manage-marc-import.pl index 8a8d9e893b..ef0bd36d33 100755 --- a/tools/manage-marc-import.pl +++ b/tools/manage-marc-import.pl @@ -4,42 +4,40 @@ # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; # standard or CPAN modules used -use CGI; +use CGI qw ( -utf8 ); use CGI::Cookie; use MARC::File::USMARC; # Koha modules used use C4::Context; use C4::Koha; -use C4::Auth; -use C4::Output; -use C4::Biblio; -use C4::ImportBatch; +use C4::Auth qw( get_template_and_user ); +use C4::Output qw( output_html_with_http_headers ); +use C4::ImportBatch qw( CleanBatch DeleteBatch GetImportBatch GetImportBatchOverlayAction GetImportBatchNoMatchAction GetImportBatchItemAction SetImportBatchOverlayAction SetImportBatchNoMatchAction SetImportBatchItemAction BatchFindDuplicates SetImportBatchMatcher GetItemNumbersFromImportBatch GetImportBatchRangeDesc GetNumberOfNonZ3950ImportBatches BatchCommitRecords BatchRevertRecords ); use C4::Matcher; use C4::BackgroundJob; -use C4::Labels::Batch 1.000000; -use C4::Branch qw(get_branch_code_from_name); +use C4::Labels::Batch; +use Koha::BiblioFrameworks; my $script_name = "/cgi-bin/koha/tools/manage-marc-import.pl"; -my $input = new CGI; +my $input = CGI->new; my $op = $input->param('op') || ''; my $completedJobID = $input->param('completedJobID'); our $runinbackground = $input->param('runinbackground'); @@ -50,38 +48,29 @@ my $offset = $input->param('offset') || 0; my $results_per_page = $input->param('results_per_page') || 25; my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "tools/manage-marc-import.tmpl", + = get_template_and_user({template_name => "tools/manage-marc-import.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => {tools => 'manage_staged_marc'}, - debug => 1, }); my %cookies = parse CGI::Cookie($cookie); -my $sessionID = $cookies{'CGISESSID'}->value; +our $sessionID = $cookies{'CGISESSID'}->value; our $dbh = C4::Context->dbh; -# Frameworks selection loop -{ - my $frameworks = getframeworks; - my $arrayref = []; - while ( my ($key, $value) = each %$frameworks ) { - push @$arrayref, { value => $key, label => $value->{frameworktext} }; - } - $template->param( frameworks => $arrayref ); -} +my $frameworks = Koha::BiblioFrameworks->search({ tagfield => { 'not' => undef } }, { join => 'marc_tag_structure', distinct => 'frameworkcode', order_by => ['frameworktext'] }); +$template->param( frameworks => $frameworks ); if ($op eq "create_labels") { #create a batch of labels, then lose $op & $import_batch_id so we get back to import batch list. my $label_batch_id = create_labelbatch_from_importbatch($import_batch_id); if ($label_batch_id == -1) { - $template->param( label_batch_msg => "Error attempting to create label batch. Please ask your system administrator to check the log for more details.", + $template->param( label_batch_msg => "error", message_type => 'alert', ); } else { - $template->param( label_batch_msg => "Label batch #$label_batch_id created.", + $template->param( label_batch_msg => $label_batch_id, message_type => 'dialog', ); } @@ -99,7 +88,7 @@ if ($op eq "") { if ($import_batch_id eq '') { import_batches_list($template, $offset, $results_per_page); } else { - import_biblios_list($template, $import_batch_id, $offset, $results_per_page); + import_records_list($template, $import_batch_id, $offset, $results_per_page); } } elsif ($op eq "commit-batch") { if ($completedJobID) { @@ -108,14 +97,14 @@ if ($op eq "") { my $framework = $input->param('framework'); commit_batch($template, $import_batch_id, $framework); } - import_biblios_list($template, $import_batch_id, $offset, $results_per_page); + import_records_list($template, $import_batch_id, $offset, $results_per_page); } elsif ($op eq "revert-batch") { if ($completedJobID) { add_saved_job_results_to_template($template, $completedJobID); } else { revert_batch($template, $import_batch_id); } - import_biblios_list($template, $import_batch_id, $offset, $results_per_page); + import_records_list($template, $import_batch_id, $offset, $results_per_page); } elsif ($op eq "clean-batch") { CleanBatch($import_batch_id); import_batches_list($template, $offset, $results_per_page); @@ -123,6 +112,12 @@ if ($op eq "") { did_clean => 1, import_batch_id => $import_batch_id, ); +} elsif ($op eq "delete-batch") { + DeleteBatch($import_batch_id); + import_batches_list($template, $offset, $results_per_page); + $template->param( + did_delete => 1, + ); } elsif ($op eq "redo-matching") { my $new_matcher_id = $input->param('new_matcher_id'); my $current_matcher_id = $input->param('current_matcher_id'); @@ -131,7 +126,7 @@ if ($op eq "") { my $item_action = $input->param('item_action'); redo_matching($template, $import_batch_id, $new_matcher_id, $current_matcher_id, $overlay_action, $nomatch_action, $item_action); - import_biblios_list($template, $import_batch_id, $offset, $results_per_page); + import_records_list($template, $import_batch_id, $offset, $results_per_page); } output_html_with_http_headers $input, $cookie, $template->output; @@ -163,21 +158,17 @@ sub redo_matching { $template->param('changed_item_action' => 1); } - if ($new_matcher_id eq $current_matcher_id) { - return; - } - my $num_with_matches = 0; if (defined $new_matcher_id and $new_matcher_id ne "") { my $matcher = C4::Matcher->fetch($new_matcher_id); if (defined $matcher) { - $num_with_matches = BatchFindBibDuplicates($import_batch_id, $matcher); + $num_with_matches = BatchFindDuplicates($import_batch_id, $matcher); SetImportBatchMatcher($import_batch_id, $new_matcher_id); } else { $rematch_failed = 1; } } else { - $num_with_matches = BatchFindBibDuplicates($import_batch_id, undef); + $num_with_matches = BatchFindDuplicates($import_batch_id, undef); SetImportBatchMatcher($import_batch_id, undef); SetImportBatchOverlayAction('create_new'); } @@ -214,13 +205,15 @@ sub import_batches_list { foreach my $batch (@$batches) { push @list, { import_batch_id => $batch->{'import_batch_id'}, - num_biblios => $batch->{'num_biblios'}, + num_records => $batch->{'num_records'}, num_items => $batch->{'num_items'}, upload_timestamp => $batch->{'upload_timestamp'}, import_status => $batch->{'import_status'}, file_name => $batch->{'file_name'} || "($batch->{'batch_type'})", comments => $batch->{'comments'}, can_clean => ($batch->{'import_status'} ne 'cleaned') ? 1 : 0, + record_type => $batch->{'record_type'}, + profile => $batch->{'profile'}, }; } $template->param(batch_list => \@list); @@ -237,21 +230,31 @@ sub commit_batch { my ($template, $import_batch_id, $framework) = @_; my $job = undef; - $dbh->{AutoCommit} = 0; - my $callback = sub {}; - if ($runinbackground) { - $job = put_in_background($import_batch_id); - $callback = progress_callback($job, $dbh); - } - my ($num_added, $num_updated, $num_items_added, $num_items_errored, $num_ignored) = - BatchCommitBibRecords($import_batch_id, $framework, 50, $callback); - $dbh->commit(); + my ( $num_added, $num_updated, $num_items_added, + $num_items_replaced, $num_items_errored, $num_ignored ); + my $schema = Koha::Database->new->schema; + $schema->storage->txn_do( + sub { + my $callback = sub { }; + if ($runinbackground) { + $job = put_in_background($import_batch_id); + $callback = progress_callback( $job, $dbh ); + } + ( + $num_added, $num_updated, $num_items_added, + $num_items_replaced, $num_items_errored, $num_ignored + ) + = BatchCommitRecords( $import_batch_id, $framework, 50, + $callback ); + } + ); my $results = { did_commit => 1, num_added => $num_added, num_updated => $num_updated, num_items_added => $num_items_added, + num_items_replaced => $num_items_replaced, num_items_errored => $num_items_errored, num_ignored => $num_ignored }; @@ -265,16 +268,25 @@ sub commit_batch { sub revert_batch { my ($template, $import_batch_id) = @_; - $dbh->{AutoCommit} = 0; my $job = undef; - my $callback = sub {}; - if ($runinbackground) { - $job = put_in_background($import_batch_id); - $callback = progress_callback($job, $dbh); - } - my ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, $num_ignored) = - BatchRevertBibRecords($import_batch_id, 50, $callback); - $dbh->commit(); + my ( + $num_deleted, $num_errors, $num_reverted, + $num_items_deleted, $num_ignored + ); + my $schema = Koha::Database->new->schema; + $schema->txn_do( + sub { + my $callback = sub { }; + if ($runinbackground) { + $job = put_in_background($import_batch_id); + $callback = progress_callback( $job, $dbh ); + } + ( + $num_deleted, $num_errors, $num_reverted, + $num_items_deleted, $num_ignored + ) = BatchRevertRecords( $import_batch_id, 50, $callback ); + } + ); my $results = { did_revert => 1, @@ -295,7 +307,7 @@ sub put_in_background { my $import_batch_id = shift; my $batch = GetImportBatch($import_batch_id); - my $job = C4::BackgroundJob->new($sessionID, $batch->{'file_name'}, $ENV{'SCRIPT_NAME'}, $batch->{'num_biblios'}); + my $job = C4::BackgroundJob->new($sessionID, $batch->{'file_name'}, '/cgi-bin/koha/tools/manage-marc-import.pl', $batch->{'num_records'}); my $jobID = $job->id(); # fork off @@ -320,7 +332,7 @@ sub put_in_background { close STDERR; } else { # fork failed, so exit immediately - warn "fork failed while attempting to run $ENV{'SCRIPT_NAME'} as a background job"; + warn "fork failed while attempting to run tools/manage-marc-import.pl as a background job"; exit 0; } return $job; @@ -350,57 +362,24 @@ sub add_saved_job_results_to_template { add_results_to_template($template, $results); } -sub import_biblios_list { +sub import_records_list { my ($template, $import_batch_id, $offset, $results_per_page) = @_; my $batch = GetImportBatch($import_batch_id); - my $biblios = GetImportBibliosRange($import_batch_id, $offset, $results_per_page); - my @list = (); - foreach my $biblio (@$biblios) { - my $citation = $biblio->{'title'}; - $citation .= " $biblio->{'author'}" if $biblio->{'author'}; - $citation .= " (" if $biblio->{'issn'} or $biblio->{'isbn'}; - $citation .= $biblio->{'isbn'} if $biblio->{'isbn'}; - $citation .= ", " if $biblio->{'issn'} and $biblio->{'isbn'}; - $citation .= $biblio->{'issn'} if $biblio->{'issn'}; - $citation .= ")" if $biblio->{'issn'} or $biblio->{'isbn'}; - - my $match = GetImportRecordMatches($biblio->{'import_record_id'}, 1); - my $match_citation = ''; - if ($#$match > -1) { - $match_citation .= $match->[0]->{'title'} if defined($match->[0]->{'title'}); - $match_citation .= ' ' . $match->[0]->{'author'} if defined($match->[0]->{'author'}); - } - - push @list, - { import_record_id => $biblio->{'import_record_id'}, - final_match_biblionumber => $biblio->{'matched_biblionumber'}, - citation => $citation, - status => $biblio->{'status'}, - record_sequence => $biblio->{'record_sequence'}, - overlay_status => $biblio->{'overlay_status'}, - match_biblionumber => $#$match > -1 ? $match->[0]->{'biblionumber'} : 0, - match_citation => $match_citation, - match_score => $#$match > -1 ? $match->[0]->{'score'} : 0, - }; - } - my $num_biblios = $batch->{'num_biblios'}; - $template->param(biblio_list => \@list); - add_page_numbers($template, $offset, $results_per_page, $num_biblios); - $template->param(offset => $offset); - $template->param(range_top => $offset + $results_per_page - 1); - $template->param(num_results => $num_biblios); - $template->param(results_per_page => $results_per_page); $template->param(import_batch_id => $import_batch_id); + my $overlay_action = GetImportBatchOverlayAction($import_batch_id); $template->param("overlay_action_${overlay_action}" => 1); $template->param(overlay_action => $overlay_action); + my $nomatch_action = GetImportBatchNoMatchAction($import_batch_id); $template->param("nomatch_action_${nomatch_action}" => 1); $template->param(nomatch_action => $nomatch_action); + my $item_action = GetImportBatchItemAction($import_batch_id); $template->param("item_action_${item_action}" => 1); $template->param(item_action => $item_action); + batch_info($template, $batch); } @@ -409,15 +388,17 @@ sub batch_info { my ($template, $batch) = @_; $template->param(batch_info => 1); $template->param(file_name => $batch->{'file_name'}); + $template->param(profile => $batch->{'profile'}); $template->param(comments => $batch->{'comments'}); $template->param(import_status => $batch->{'import_status'}); $template->param(upload_timestamp => $batch->{'upload_timestamp'}); - $template->param(num_biblios => $batch->{'num_biblios'}); - $template->param(num_items => $batch->{'num_biblios'}); + $template->{VARS}->{'record_type'} = $batch->{'record_type'}; + $template->param(num_records => $batch->{'num_records'}); + $template->param(num_items => $batch->{'num_items'}); if ($batch->{'import_status'} ne 'cleaned') { $template->param(can_clean => 1); } - if ($batch->{'num_biblios'} > 0) { + if ($batch->{'num_records'} > 0) { if ($batch->{'import_status'} eq 'staged' or $batch->{'import_status'} eq 'reverted') { $template->param(can_commit => 1); }