X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=tools%2Fstage-marc-import.pl;h=1a7b587581fb3cf145debf0e6ab943309277bdca;hb=49f2837b2e75511becd09059db99d209917647a7;hp=b3b2aa48154d8f9b70cc99ca62e862ca1f7bd8b7;hpb=853aa657ba1891d804d0c8fbe9059317f2949fff;p=koha.git diff --git a/tools/stage-marc-import.pl b/tools/stage-marc-import.pl index b3b2aa4815..1a7b587581 100755 --- a/tools/stage-marc-import.pl +++ b/tools/stage-marc-import.pl @@ -3,7 +3,7 @@ # Script for handling import of MARC data into Koha db # and Z39.50 lookups -# Koha library project www.koha.org +# Koha library project www.koha-community.org # Licensed under the GPL @@ -11,97 +11,227 @@ # # 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., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; +#use warnings; FIXME - Bug 2505 # 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::Auth; -use C4::Input; use C4::Output; use C4::Biblio; use C4::ImportBatch; use C4::Matcher; - -#------------------ -# Constants - -my $includes = C4::Context->config('includes') || - "/usr/local/www/hdl/htdocs/includes"; - -# HTML colors for alternating lines -my $lc1='#dddddd'; -my $lc2='#ddaaaa'; - -#------------- -#------------- -# Initialize - -my $userid=$ENV{'REMOTE_USER'}; +use Koha::Upload; +use C4::BackgroundJob; +use C4::MarcModificationTemplates; +use Koha::Plugins; my $input = new CGI; -my $dbh = C4::Context->dbh; - -my $uploadmarc=$input->param('uploadmarc'); -my $check_for_matches = $input->param('check_for_matches'); -my $comments = $input->param('comments'); -my $syntax = $input->param('syntax'); -my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "tools/stage-marc-import.tmpl", - query => $input, - type => "intranet", - authnotrequired => 0, - flagsrequired => {tools => 1}, - debug => 1, - }); - -$template->param(SCRIPT_NAME => $ENV{'SCRIPT_NAME'}, - uploadmarc => $uploadmarc); -my $filename = $uploadmarc; -if ($uploadmarc && length($uploadmarc)>0) { + +my $fileID = $input->param('uploadedfileid'); +my $runinbackground = $input->param('runinbackground'); +my $completedJobID = $input->param('completedJobID'); +my $matcher_id = $input->param('matcher'); +my $overlay_action = $input->param('overlay_action'); +my $nomatch_action = $input->param('nomatch_action'); +my $parse_items = $input->param('parse_items'); +my $item_action = $input->param('item_action'); +my $comments = $input->param('comments'); +my $record_type = $input->param('record_type'); +my $encoding = $input->param('encoding'); +my $to_marc_plugin = $input->param('to_marc_plugin'); +my $marc_modification_template = $input->param('marc_modification_template_id'); + +my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "tools/stage-marc-import.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { tools => 'stage_marc_import' }, + debug => 1, + } +); + +$template->param( + SCRIPT_NAME => $ENV{'SCRIPT_NAME'}, + uploadmarc => $fileID, + record_type => $record_type, +); + +my %cookies = parse CGI::Cookie($cookie); +my $sessionID = $cookies{'CGISESSID'}->value; +if ($completedJobID) { + my $job = C4::BackgroundJob->fetch($sessionID, $completedJobID); + my $results = $job->results(); + $template->param(map { $_ => $results->{$_} } keys %{ $results }); +} elsif ($fileID) { + my $upload = Koha::Upload->new->get({ id => $fileID, filehandle => 1 }); + my $fh = $upload->{fh}; + my $filename = $upload->{name}; # filename only, no path my $marcrecord=''; - while (<$uploadmarc>) { + $/ = "\035"; + while (<$fh>) { + s/^\s+//; + s/\s+$//; $marcrecord.=$_; } + $fh->close; + + my $job = undef; + my $dbh; + if ($runinbackground) { + my $job_size = () = $marcrecord =~ /\035/g; + # if we're matching, job size is doubled + $job_size *= 2 if ($matcher_id ne ""); + $job = C4::BackgroundJob->new($sessionID, $filename, $ENV{'SCRIPT_NAME'}, $job_size); + my $jobID = $job->id(); + + # fork off + if (my $pid = fork) { + # parent + # return job ID as JSON + my $reply = CGI->new(""); + print $reply->header(-type => 'text/html'); + print '{"jobID":"' . $jobID . '"}'; + exit 0; + } elsif (defined $pid) { + # child + # close STDOUT to signal to Apache that + # we're now running in the background + close STDOUT; + # close STDERR; # there is no good reason to close STDERR + } else { + # fork failed, so exit immediately + warn "fork failed while attempting to run $ENV{'SCRIPT_NAME'} as a background job: $!"; + exit 0; + } + + # if we get here, we're a child that has detached + # itself from Apache + + } + # New handle, as we're a child. + $dbh = C4::Context->dbh({new => 1}); + $dbh->{AutoCommit} = 0; # FIXME branch code - my ($batch_id, $num_valid, @import_errors) = BatchStageMarcRecords($syntax, $marcrecord, $filename, $comments, '', 0); - my $matcher = C4::Matcher->new('biblio'); - $matcher->add_matchpoint("020", "a", '', 'isbn', 1000); + my ( $batch_id, $num_valid, $num_items, @import_errors ) = + BatchStageMarcRecords( + $record_type, $encoding, + $marcrecord, $filename, + $to_marc_plugin, $marc_modification_template, + $comments, '', + $parse_items, 0, + 50, staging_progress_callback( $job, $dbh ) + ); + my $num_with_matches = 0; my $checked_matches = 0; - if ($check_for_matches) { - $checked_matches = 1; - $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher); + my $matcher_failed = 0; + my $matcher_code = ""; + if ($matcher_id ne "") { + my $matcher = C4::Matcher->fetch($matcher_id); + if (defined $matcher) { + $checked_matches = 1; + $matcher_code = $matcher->code(); + $num_with_matches = + BatchFindDuplicates( $batch_id, $matcher, 10, 50, + matching_progress_callback( $job, $dbh ) ); + SetImportBatchMatcher($batch_id, $matcher_id); + SetImportBatchOverlayAction($batch_id, $overlay_action); + SetImportBatchNoMatchAction($batch_id, $nomatch_action); + SetImportBatchItemAction($batch_id, $item_action); + $dbh->commit(); + } else { + $matcher_failed = 1; + } + } else { + $dbh->commit(); + } + + my $results = { + staged => $num_valid, + matched => $num_with_matches, + num_items => $num_items, + import_errors => scalar(@import_errors), + total => $num_valid + scalar(@import_errors), + checked_matches => $checked_matches, + matcher_failed => $matcher_failed, + matcher_code => $matcher_code, + import_batch_id => $batch_id + }; + if ($runinbackground) { + $job->finish($results); + } else { + $template->param(staged => $num_valid, + matched => $num_with_matches, + num_items => $num_items, + import_errors => scalar(@import_errors), + total => $num_valid + scalar(@import_errors), + checked_matches => $checked_matches, + matcher_failed => $matcher_failed, + matcher_code => $matcher_code, + import_batch_id => $batch_id + ); + } + +} else { + # initial form + if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) { + $template->param( "UNIMARC" => 1 ); } - # FIXME we're not committing now - # my ($num_added, $num_updated, $num_ignored) = BatchCommitBibRecords($batch_id); + my @matchers = C4::Matcher::GetMatcherList(); + $template->param( available_matchers => \@matchers ); - $template->param(staged => $num_valid, - matched => $num_with_matches, - import_errors => scalar(@import_errors), - total => $num_valid + scalar(@import_errors), - checked_matches => $checked_matches, - import_batch_id => $batch_id - ); + my @templates = GetModificationTemplates(); + $template->param( MarcModificationTemplatesLoop => \@templates ); + if ( C4::Context->preference('UseKohaPlugins') && + C4::Context->config('enable_plugins') ) { + + my @plugins = Koha::Plugins->new()->GetPlugins('to_marc'); + $template->param( plugins => \@plugins ); + } } output_html_with_http_headers $input, $cookie, $template->output; +exit 0; + +sub staging_progress_callback { + my $job = shift; + my $dbh = shift; + return sub { + my $progress = shift; + $job->progress($progress); + } +} + +sub matching_progress_callback { + my $job = shift; + my $dbh = shift; + my $start_progress = $job->progress(); + return sub { + my $progress = shift; + $job->progress($start_progress + $progress); + } +}