Marcel de Rooy
83ea49a009
This patch makes the following changes to achieve that: [1] Use Upload.pm in stage-marc-import.pl, upload-cover-image.pl, offline_circ/process_koc.pl and enqueue_koc.pl. [2] A new file-upload.js replaces file-upload.inc in the associated template. We now use ajax to get progress figures instead of launching perl script upload-file-progress. The js changes now also allow for aborting a file upload. [3] Adds a tools/upload script and template. It allows to upload multiple files at once. [4] Makes upload-file return error messages in JSON. For a multiple upload, we could have some files with errors and others without errors. The upload is now marked as Failed only if there was no upload at all. [5] The upload plugin is converted to use tools/upload with plugin param. Deleting an upload is now presented via the search results form. NOTE: In editing the process_koc.tt I noticed that the form enqueuefile was hidden and no longer used (with associated code in process_koc.pl). When a file has been uploaded, I display the form again (with the Apply directly button). The code still works. NOTE: We fix an error in upload-file from one of the patches of bug 6874. The userid of the Koha admin user is passed to haspermission, but we should pick the userid from the session. NOTE: Bug 14686 will add a specific permission for tools/upload.pl, and will add the tools/upload script to the Tools menu. For now, you need edit_catalogue to start upload.pl and you will additionally need a permission like upload_local_cover_images to successfully upload a new file. Test plan: [1] Upload a marc file in stage-marc-import. (This is temp storage.) [2] Check new entry in table uploaded_files. Look for the file in your temporary directory (/tmp ?), subfolder koha_upload. Bonus: Remove permissions on this subfolder. Retry, check error and restore permissions again. [3] Upload another (larger) file and abort the upload. Check table and directory again. You should have a partial file, but no record. [4] Verify that Stage for import still works as expected. [5] Test Upload local cover image. (Enable OPACLocalCoverImages.) You can test an individual image or a zip file including images and a file called datalink.txt (with lines biblionumber,filename). [6] Test uploading a offline circulation file: Enable AllowOfflineCirculation, and create a koc file (plain text): Line1: Version=1.0\tA=1\tB=2 Line2: 2015-08-06 08:00:00 345\treturn\t[barcode] Note: Replace tabs and barcode. The number of tabs is essential! Checkout the item with your barcode. Go to Offline circulation file upload. Upload and click Apply directly. Checkout again. Upload again, click Add to offline circulation queue. [7] Upload three files via tools/upload.pl with a category and marked as public. Check the results in the table. Verify that you can download the file in OPAC without being logged in. [8] Pick one new file and one of the files of step 7. Upload them in the same category. One upload should succeed. Check for reported error. [9] Connect upload.pl to field 856$u. Goto Cataloguing editor. In an empty 856$u, click the tag editor. Upload a file and click Choose. Save the record. Open the record in the OPAC and click the link. Copy this link to your clipboard for next step. [A] Go back to editor. Click the tag editor on the same 856 field. Choose for Delete. Open the link in your clipboard again. Error message? [B] Check the process of upload, search, download and delete of an upload with some diacritical characters in the filename. (Bonus points for adding special chars in the category code.) Note: You can add categories via authorized values, UPLOAD key. Signed-off-by: Mirko Tietgen <mirko@abunchofthings.net> Signed-off-by: Julian Maurice <julian.maurice@biblibre.com> Bug 14321: [QA Follow-up] Perltidy upload.pl Run perltidy -pro=xt/perltidyrc on tools/upload.pl. No other changes. Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Julian Maurice <julian.maurice@biblibre.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
197 lines
5.2 KiB
Perl
Executable file
197 lines
5.2 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
# 2008 Kyle Hall <kyle.m.hall@gmail.com>
|
|
|
|
# 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 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.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
#
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use CGI qw ( -utf8 );
|
|
use C4::Output;
|
|
use C4::Auth;
|
|
use C4::Koha;
|
|
use C4::Context;
|
|
use C4::Biblio;
|
|
use C4::Accounts;
|
|
use C4::Circulation;
|
|
use C4::Items;
|
|
use C4::Members;
|
|
use C4::Stats;
|
|
use Koha::Upload;
|
|
|
|
use Date::Calc qw( Add_Delta_Days Date_to_Days );
|
|
|
|
use constant DEBUG => 0;
|
|
|
|
# this is the file version number that we're coded against.
|
|
my $FILE_VERSION = '1.0';
|
|
|
|
my $query = CGI->new;
|
|
my @output;
|
|
|
|
my ($template, $loggedinuser, $cookie) = get_template_and_user({
|
|
template_name => "offline_circ/enqueue_koc.tt",
|
|
query => $query,
|
|
type => "intranet",
|
|
authnotrequired => 0,
|
|
flagsrequired => { circulate => "circulate_remaining_permissions" },
|
|
});
|
|
|
|
|
|
my $fileID=$query->param('uploadedfileid');
|
|
my %cookies = parse CGI::Cookie($cookie);
|
|
my $sessionID = $cookies{'CGISESSID'}->value;
|
|
## 'Local' globals.
|
|
our $dbh = C4::Context->dbh();
|
|
|
|
if ($fileID) {
|
|
my $upload = Koha::Upload->new->get({ id => $fileID, filehandle => 1 });
|
|
my $fh = $upload->{fh};
|
|
my @input_lines = <$fh>;
|
|
|
|
my $header_line = shift @input_lines;
|
|
my $file_info = parse_header_line($header_line);
|
|
if ($file_info->{'Version'} ne $FILE_VERSION) {
|
|
push @output, {
|
|
message => 1,
|
|
ERROR_file_version => 1,
|
|
upload_version => $file_info->{'Version'},
|
|
current_version => $FILE_VERSION
|
|
};
|
|
}
|
|
|
|
my $userid = C4::Context->userenv->{id};
|
|
my $branchcode = C4::Context->userenv->{branch};
|
|
|
|
foreach my $line (@input_lines) {
|
|
my $command_line = parse_command_line($line);
|
|
my $timestamp = $command_line->{'date'} . ' ' . $command_line->{'time'};
|
|
my $action = $command_line->{'command'};
|
|
my $barcode = $command_line->{'barcode'};
|
|
my $cardnumber = $command_line->{'cardnumber'};
|
|
my $amount = $command_line->{'amount'};
|
|
|
|
AddOfflineOperation( $userid, $branchcode, $timestamp, $action, $barcode, $cardnumber, $amount );
|
|
}
|
|
|
|
}
|
|
|
|
$template->param( messages => \@output );
|
|
|
|
output_html_with_http_headers $query, $cookie, $template->output;
|
|
|
|
=head1 FUNCTIONS
|
|
|
|
=head2 parse_header_line
|
|
|
|
parses the header line from a .koc file. This is the line that
|
|
specifies things such as the file version, and the name and version of
|
|
the offline circulation tool that generated the file. See
|
|
L<http://wiki.koha-community.org/wiki/Koha_offline_circulation_file_format>
|
|
for more information.
|
|
|
|
pass in a string containing the header line (the first line from th
|
|
file).
|
|
|
|
returns a hashref containing the information from the header.
|
|
|
|
=cut
|
|
|
|
sub parse_header_line {
|
|
my $header_line = shift;
|
|
chomp($header_line);
|
|
$header_line =~ s/\r//g;
|
|
|
|
my @fields = split( /\t/, $header_line );
|
|
my %header_info = map { split( /=/, $_ ) } @fields;
|
|
return \%header_info;
|
|
}
|
|
|
|
=head2 parse_command_line
|
|
|
|
=cut
|
|
|
|
sub parse_command_line {
|
|
my $command_line = shift;
|
|
chomp($command_line);
|
|
$command_line =~ s/\r//g;
|
|
|
|
my ( $timestamp, $command, @args ) = split( /\t/, $command_line );
|
|
my ( $date, $time, $id ) = split( /\s/, $timestamp );
|
|
|
|
my %command = (
|
|
date => $date,
|
|
time => $time,
|
|
id => $id,
|
|
command => $command,
|
|
);
|
|
|
|
# set the rest of the keys using a hash slice
|
|
my $argument_names = arguments_for_command($command);
|
|
@command{@$argument_names} = @args;
|
|
|
|
return \%command;
|
|
|
|
}
|
|
|
|
=head2 arguments_for_command
|
|
|
|
fetches the names of the columns (and function arguments) found in the
|
|
.koc file for a particular command name. For instance, the C<issue>
|
|
command requires a C<cardnumber> and C<barcode>. In that case this
|
|
function returns a reference to the list C<qw( cardnumber barcode )>.
|
|
|
|
parameters: the command name
|
|
|
|
returns: listref of column names.
|
|
|
|
=cut
|
|
|
|
sub arguments_for_command {
|
|
my $command = shift;
|
|
|
|
# define the fields for this version of the file.
|
|
my %format = (
|
|
issue => [qw( cardnumber barcode )],
|
|
return => [qw( barcode )],
|
|
payment => [qw( cardnumber amount )],
|
|
);
|
|
|
|
return $format{$command};
|
|
}
|
|
|
|
=head2 _get_borrowernumber_from_barcode
|
|
|
|
pass in a barcode
|
|
get back the borrowernumber of the patron who has it checked out.
|
|
undef if that can't be found
|
|
|
|
=cut
|
|
|
|
sub _get_borrowernumber_from_barcode {
|
|
my $barcode = shift;
|
|
|
|
return unless $barcode;
|
|
|
|
my $item = GetBiblioFromItemNumber( undef, $barcode );
|
|
return unless $item->{'itemnumber'};
|
|
|
|
my $issue = C4::Circulation::GetItemIssue( $item->{'itemnumber'} );
|
|
return unless $issue->{'borrowernumber'};
|
|
return $issue->{'borrowernumber'};
|
|
}
|