Bugzilla – Attachment 38926 Details for
Bug 6874
Attach files to bibliographic records
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 6874: File upload in MARC
Bug-6874-File-upload-in-MARC.patch (text/plain), 30.09 KB, created by
Mark Tompsett
on 2015-05-06 21:21:33 UTC
(
hide
)
Description:
Bug 6874: File upload in MARC
Filename:
MIME Type:
Creator:
Mark Tompsett
Created:
2015-05-06 21:21:33 UTC
Size:
30.09 KB
patch
obsolete
>From 33bf7e106f482a18b83a77671b98785abf3f0773 Mon Sep 17 00:00:00 2001 >From: Julian Maurice <julian.maurice@biblibre.com> >Date: Wed, 18 Jul 2012 16:47:54 +0200 >Subject: [PATCH] Bug 6874: File upload in MARC > >New cataloging plugin upload.pl and new system preference 'uploadPath'. > >upload.pl provide a way to upload files on the server and store a link >(url) to it in MARC >uploadPath is the absolute path on the server where the files will be >stored. It's possible to have a hierarchy of directories under this path >and the plugin will allow to choose in which directory to store the >file. >Stored value in MARC subfield looks like this: ><OPACBaseURL>/cgi-bin/koha/opac-retrieve-file.pl?id=<SHA-1 of the file> >So both 'uploadPath' and 'OPACBaseURL' sysprefs have to be set for this >plugin to work correctly > >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> >Signed-off-by: Paul Poulain <paul.poulain@biblibre.com> >Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com> >Signed-off-by: Mark Tompsett <mtompset@hotmail.com> >--- > C4/Biblio.pm | 29 ++- > C4/UploadedFiles.pm | 226 +++++++++++++++++++++ > basket/basket.pl | 2 +- > catalogue/MARCdetail.pl | 1 - > catalogue/detail.pl | 2 +- > cataloguing/value_builder/upload.pl | 178 ++++++++++++++++ > installer/data/mysql/kohastructure.sql | 11 + > installer/data/mysql/sysprefs.sql | 1 + > installer/data/mysql/updatedatabase.pl | 21 ++ > .../en/modules/admin/preferences/cataloguing.pref | 4 + > .../en/modules/cataloguing/value_builder/upload.tt | 71 +++++++ > .../value_builder/upload_delete_file.tt | 60 ++++++ > opac/opac-basket.pl | 2 +- > opac/opac-detail.pl | 2 +- > opac/opac-retrieve-file.pl | 47 +++++ > 15 files changed, 646 insertions(+), 11 deletions(-) > create mode 100644 C4/UploadedFiles.pm > create mode 100755 cataloguing/value_builder/upload.pl > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt > create mode 100755 opac/opac-retrieve-file.pl > >diff --git a/C4/Biblio.pm b/C4/Biblio.pm >index fb4d4e8..39d1fec 100644 >--- a/C4/Biblio.pm >+++ b/C4/Biblio.pm >@@ -38,6 +38,7 @@ use C4::ClassSource; > use C4::Charset; > use C4::Linker; > use C4::OAI::Sets; >+use C4::UploadedFiles; > > use Koha::Cache; > >@@ -1973,7 +1974,7 @@ sub GetMarcAuthors { > > =head2 GetMarcUrls > >- $marcurls = GetMarcUrls($record,$marcflavour); >+ $marcurls = GetMarcUrls($record,$marcflavour,$frameworkcode); > > Returns arrayref of URLs from MARC data, suitable to pass to tmpl loop. > Assumes web resources (not uncommon in MARC21 to omit resource type ind) >@@ -1981,19 +1982,23 @@ Assumes web resources (not uncommon in MARC21 to omit resource type ind) > =cut > > sub GetMarcUrls { >- my ( $record, $marcflavour ) = @_; >+ my ( $record, $marcflavour, $frameworkcode ) = @_; > if (!$record) { > carp 'GetMarcUrls called on undefined record'; > return; > } > >+ my $tagslib = &GetMarcStructure(1, $frameworkcode); >+ my $urltag = '856'; >+ my $urlsubtag = 'u'; >+ > my @marcurls; >- for my $field ( $record->field('856') ) { >+ for my $field ( $record->field($urltag) ) { > my @notes; > for my $note ( $field->subfield('z') ) { > push @notes, { note => $note }; > } >- my @urls = $field->subfield('u'); >+ my @urls = $field->subfield($urlsubtag); > foreach my $url (@urls) { > my $marcurl; > if ( $marcflavour eq 'MARC21' ) { >@@ -2021,8 +2026,20 @@ sub GetMarcUrls { > $marcurl->{'part'} = $s3 if ($link); > $marcurl->{'toc'} = 1 if ( defined($s3) && $s3 =~ /^[Tt]able/ ); > } else { >- $marcurl->{'linktext'} = $field->subfield('2') || C4::Context->preference('URLLinkText') || $url; >- $marcurl->{'MARCURL'} = $url; >+ if ($tagslib->{ $urltag }->{ $urlsubtag }->{value_builder} eq "upload.pl" >+ and $url =~ /id=([0-9a-f]+)/) { >+ my $file = C4::UploadedFiles::GetUploadedFile($1); >+ my $text = $file ? $file->{filename} : $url; >+ $marcurl->{'linktext'} = $field->subfield('2') >+ || C4::Context->preference('URLLinkText') >+ || $file->{filename}; >+ $marcurl->{'MARCURL'} = $url; >+ } else { >+ $marcurl->{'linktext'} = $field->subfield('2') >+ || C4::Context->preference('URLLinkText') >+ || $url; >+ $marcurl->{'MARCURL'} = $url; >+ } > } > push @marcurls, $marcurl; > } >diff --git a/C4/UploadedFiles.pm b/C4/UploadedFiles.pm >new file mode 100644 >index 0000000..246b02b >--- /dev/null >+++ b/C4/UploadedFiles.pm >@@ -0,0 +1,226 @@ >+package C4::UploadedFiles; >+ >+# Copyright 2011-2012 BibLibre >+# >+# 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 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. >+ >+=head1 NAME >+ >+C4::UploadedFiles - Functions to deal with files uploaded with cataloging plugin upload.pl >+ >+=head1 SYNOPSIS >+ >+ use C4::UploadedFiles; >+ >+ my $filename = $cgi->param('uploaded_file'); >+ my $file = $cgi->upload('uploaded_file'); >+ my $dir = $input->param('dir'); >+ >+ # upload file >+ my $id = C4::UploadedFiles::UploadFile($filename, $dir, $file->handle); >+ >+ # retrieve file infos >+ my $uploaded_file = C4::UploadedFiles::GetUploadedFile($id); >+ >+ # delete file >+ C4::UploadedFiles::DelUploadedFile($id); >+ >+=head1 DESCRIPTION >+ >+This module provides basic functions for adding, retrieving and deleting files related to >+cataloging plugin upload.pl. >+ >+It uses uploaded_files table. >+ >+It is not related to C4::UploadedFile >+ >+=head1 FUNCTIONS >+ >+=cut >+ >+use Modern::Perl; >+use Digest::SHA; >+use Fcntl; >+use Encode; >+ >+use C4::Context; >+ >+sub _get_file_path { >+ my ($id, $dirname, $filename) = @_; >+ >+ my $uploadPath = C4::Context->preference('uploadPath'); >+ my $filepath = "$uploadPath/$dirname/${id}_$filename"; >+ $filepath =~ s|/+|/|g; >+ >+ return $filepath; >+} >+ >+=head2 GetUploadedFile >+ >+ my $file = C4::UploadedFiles::GetUploadedFile($id); >+ >+Returns a hashref containing infos on uploaded files. >+Hash keys are: >+ >+=over 2 >+ >+=item * id: id of the file (same as given in argument) >+ >+=item * filename: name of the file >+ >+=item * dir: directory where file is stored (relative to syspref 'uploadPath') >+ >+=back >+ >+It returns undef if file is not found >+ >+=cut >+ >+sub GetUploadedFile { >+ my ($id) = @_; >+ >+ return unless $id; >+ >+ my $dbh = C4::Context->dbh; >+ my $query = qq{ >+ SELECT id, filename, dir >+ FROM uploaded_files >+ WHERE id = ? >+ }; >+ my $sth = $dbh->prepare($query); >+ $sth->execute($id); >+ my $file = $sth->fetchrow_hashref; >+ if ($file) { >+ $file->{filepath} = _get_file_path($file->{id}, $file->{dir}, >+ $file->{filename}); >+ } >+ >+ return $file; >+} >+ >+=head2 UploadFile >+ >+ my $id = C4::UploadedFiles::UploadFile($filename, $dir, $io_handle); >+ >+Upload a new file and returns its id (its SHA-1 sum, actually). >+ >+Parameters: >+ >+=over 2 >+ >+=item * $filename: name of the file >+ >+=item * $dir: directory where to store the file (path relative to syspref 'uploadPath' >+ >+=item * $io_handle: valid IO::Handle object, can be retrieved with >+$cgi->upload('uploaded_file')->handle; >+ >+=back >+ >+=cut >+ >+sub UploadFile { >+ my ($filename, $dir, $handle) = @_; >+ >+ $filename = decode_utf8($filename); >+ if($filename =~ m#(^|/)\.\.(/|$)# or $dir =~ m#(^|/)\.\.(/|$)#) { >+ warn "Filename or dirname contains '..'. Aborting upload"; >+ return; >+ } >+ >+ my $buffer; >+ my $data = ''; >+ while($handle->read($buffer, 1024)) { >+ $data .= $buffer; >+ } >+ $handle->close; >+ >+ my $sha = new Digest::SHA; >+ $sha->add($data); >+ my $id = $sha->hexdigest; >+ >+ # Test if this id already exist >+ my $file = GetUploadedFile($id); >+ if ($file) { >+ return $file->{id}; >+ } >+ >+ my $file_path = _get_file_path($id, $dir, $filename); >+ >+ my $out_fh; >+ # Create the file only if it doesn't exist >+ unless( sysopen($out_fh, $file_path, O_WRONLY|O_CREAT|O_EXCL) ) { >+ warn "Failed to open file '$file_path': $!"; >+ return; >+ } >+ >+ print $out_fh $data; >+ close $out_fh; >+ >+ my $dbh = C4::Context->dbh; >+ my $query = qq{ >+ INSERT INTO uploaded_files (id, filename, dir) >+ VALUES (?,?, ?); >+ }; >+ my $sth = $dbh->prepare($query); >+ if($sth->execute($id, $filename, $dir)) { >+ return $id; >+ } >+ >+ return undef; >+} >+ >+=head2 DelUploadedFile >+ >+ C4::UploadedFiles::DelUploadedFile($id); >+ >+Remove a previously uploaded file, given its id. >+ >+Returns a false value if an error occurs. >+ >+=cut >+ >+sub DelUploadedFile { >+ my ($id) = @_; >+ >+ my $file = GetUploadedFile($id); >+ if($file) { >+ my $file_path = $file->{filepath}; >+ my $file_deleted = 0; >+ unless( -f $file_path ) { >+ warn "Id $file->{id} is in database but not in filesystem, removing id from database"; >+ $file_deleted = 1; >+ } else { >+ if(unlink $file_path) { >+ $file_deleted = 1; >+ } >+ } >+ >+ unless($file_deleted) { >+ warn "File $file_path cannot be deleted: $!"; >+ } >+ >+ my $dbh = C4::Context->dbh; >+ my $query = qq{ >+ DELETE FROM uploaded_files >+ WHERE id = ? >+ }; >+ my $sth = $dbh->prepare($query); >+ return $sth->execute($id); >+ } >+} >+ >+1; >diff --git a/basket/basket.pl b/basket/basket.pl >index 8d085a9..f45135d 100755 >--- a/basket/basket.pl >+++ b/basket/basket.pl >@@ -67,7 +67,7 @@ foreach my $biblionumber ( @bibs ) { > my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); > my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); > my $marcseriesarray = GetMarcSeries ($record,$marcflavour); >- my $marcurlsarray = GetMarcUrls ($record,$marcflavour); >+ my $marcurlsarray = GetMarcUrls ($record,$marcflavour, GetFrameworkCode($biblionumber)); > my @items = GetItemsInfo( $biblionumber ); > > my $hasauthors = 0; >diff --git a/catalogue/MARCdetail.pl b/catalogue/MARCdetail.pl >index e8f6949..3455741 100755 >--- a/catalogue/MARCdetail.pl >+++ b/catalogue/MARCdetail.pl >@@ -216,7 +216,6 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { > $subfield_data{marc_value} = > GetAuthorisedValueDesc( $fields[$x_i]->tag(), > $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1]; >- > } > $subfield_data{marc_subfield} = $subf[$i][0]; > $subfield_data{marc_tag} = $fields[$x_i]->tag(); >diff --git a/catalogue/detail.pl b/catalogue/detail.pl >index b7ba9a4..c305537 100755 >--- a/catalogue/detail.pl >+++ b/catalogue/detail.pl >@@ -113,7 +113,7 @@ my $marcisbnsarray = GetMarcISBN( $record, $marcflavour ); > my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); > my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); > my $marcseriesarray = GetMarcSeries($record,$marcflavour); >-my $marcurlsarray = GetMarcUrls ($record,$marcflavour); >+my $marcurlsarray = GetMarcUrls ($record, $marcflavour, $fw); > my $marchostsarray = GetMarcHosts($record,$marcflavour); > my $subtitle = GetRecordValue('subtitle', $record, $fw); > >diff --git a/cataloguing/value_builder/upload.pl b/cataloguing/value_builder/upload.pl >new file mode 100755 >index 0000000..0cb33f4 >--- /dev/null >+++ b/cataloguing/value_builder/upload.pl >@@ -0,0 +1,178 @@ >+#!/usr/bin/perl >+ >+# Copyright 2011-2012 BibLibre >+# >+# 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 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. >+ >+use Modern::Perl; >+use CGI qw/-utf8/; >+use File::Basename; >+ >+use C4::Auth; >+use C4::Context; >+use C4::Output; >+use C4::UploadedFiles; >+ >+my $upload_path = C4::Context->preference('uploadPath'); >+ >+sub plugin_parameters { >+ my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_; >+ return ""; >+} >+ >+sub plugin_javascript { >+ my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_; >+ my $function_name = $field_number; >+ my $res = " >+ <script type=\"text/javascript\"> >+ function Focus$function_name(subfield_managed) { >+ return 1; >+ } >+ >+ function Blur$function_name(subfield_managed) { >+ return 1; >+ } >+ >+ function Clic$function_name(index) { >+ var id = document.getElementById(index).value; >+ if(id.match(/id=([0-9a-f]+)/)){ >+ id = RegExp.\$1; >+ } >+ window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=upload.pl&index=\"+index+\"&id=\"+id, 'upload', 'width=600,height=400,toolbar=false,scrollbars=no'); >+ >+ } >+ </script> >+"; >+ >+ return ( $function_name, $res ); >+} >+ >+sub plugin { >+ my ($input) = @_; >+ my $index = $input->param('index'); >+ my $id = $input->param('id'); >+ my $delete = $input->param('delete'); >+ my $uploaded_file = $input->param('uploaded_file'); >+ >+ my $template_name = ($id || $delete) >+ ? "upload_delete_file.tt" >+ : "upload.tt"; >+ >+ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+ { template_name => "cataloguing/value_builder/$template_name", >+ query => $input, >+ type => "intranet", >+ authnotrequired => 0, >+ flagsrequired => { editcatalogue => '*' }, >+ debug => 1, >+ } >+ ); >+ >+ # Dealing with the uploaded file >+ if ($uploaded_file) { >+ my $fh = $input->upload('uploaded_file'); >+ my $dir = $input->param('dir'); >+ >+ $id = C4::UploadedFiles::UploadFile($uploaded_file, $dir, $fh->handle); >+ if($id) { >+ my $OPACBaseURL = C4::Context->preference('OPACBaseURL'); >+ $OPACBaseURL =~ s#/$##; >+ my $return = "$OPACBaseURL/cgi-bin/koha/opac-retrieve-file.pl?id=$id"; >+ $template->param( >+ success => 1, >+ return => $return, >+ uploaded_file => $uploaded_file, >+ ); >+ } else { >+ $template->param(error => 1); >+ } >+ } elsif ($delete || $id) { >+ # If there's already a file uploaded for this field, >+ # We handle its deletion >+ if ($delete) { >+ if(C4::UploadedFiles::DelUploadedFile($id)) {; >+ $template->param(success => 1); >+ } else { >+ $template->param(error => 1); >+ } >+ } >+ } else { >+ my $filefield = CGI::filefield( >+ -name => 'uploaded_file', >+ -size => 50, >+ ); >+ >+ my $dirs_tree = [ { >+ name => '/', >+ value => '/', >+ dirs => finddirs($upload_path) >+ } ]; >+ >+ $template->param( >+ dirs_tree => $dirs_tree, >+ filefield => $filefield >+ ); >+ } >+ >+ $template->param( >+ index => $index, >+ id => $id >+ ); >+ >+ output_html_with_http_headers $input, $cookie, $template->output; >+} >+ >+# Build a hierarchy of directories >+sub finddirs { >+ my $base = shift || $upload_path; >+ my $found = 0; >+ my @dirs; >+ my @files = <$base/*>; >+ foreach (@files) { >+ if (-d $_ and -w $_) { >+ my $lastdirname = basename($_); >+ my $dirname = $_; >+ $dirname =~ s/^$upload_path//g; >+ push @dirs, { >+ value => $dirname, >+ name => $lastdirname, >+ dirs => finddirs($_) >+ }; >+ $found = 1; >+ }; >+ } >+ return \@dirs; >+} >+ >+1; >+ >+ >+__END__ >+ >+=head1 upload.pl >+ >+This plugin allow to upload files on the server and reference it in a marc >+field. >+ >+Two system preference are used: >+ >+=over 4 >+ >+=item * uploadPath: the real absolute path where files will be stored >+ >+=item * OPACBaseURL: for building URLs to be stored in MARC >+ >+=back >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index dd6bac9..0405f01 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -3348,6 +3348,17 @@ CREATE TABLE IF NOT EXISTS `borrower_modifications` ( > ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; > > -- >+-- Table structure for table uploaded_files >+-- >+ >+DROP TABLE IF EXISTS uploaded_files >+CREATE TABLE uploaded_files ( >+ id CHAR(40) NOT NULL PRIMARY KEY, >+ filename TEXT NOT NULL, >+ dir TEXT NOT NULL >+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; >+ >+-- > -- Table structure for table linktracker > -- This stores clicks to external links > -- >diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql >index 9fc5c83..ea096f3 100644 >--- a/installer/data/mysql/sysprefs.sql >+++ b/installer/data/mysql/sysprefs.sql >@@ -447,6 +447,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('UniqueItemFields','barcode','','Space-separated list of fields that should be unique (used in acquisition module for item creation). Fields must be valid SQL column names of items table','Free'), > ('UpdateNotForLoanStatusOnCheckin', '', 'NULL', 'This is a list of value pairs. When an item is checked in, if the not for loan value on the left matches the items not for loan value it will be updated to the right-hand value. E.g. ''-1: 0'' will cause an item that was set to ''Ordered'' to now be available for loan. Each pair of values should be on a separate line.', 'Free'), > ('UpdateTotalIssuesOnCirc','0',NULL,'Whether to update the totalissues field in the biblio on each circ.','YesNo'), >+('uploadPath','',NULL,'Sets the upload path for the upload.pl plugin. For security reasons, the upload path MUST NOT be a public, webserver accessible directory.','Free') > ('uppercasesurnames','0',NULL,'If ON, surnames are converted to upper case in patron entry form','YesNo'), > ('URLLinkText','',NULL,'Text to display as the link anchor in the OPAC','free'), > ('UsageStats', 0, NULL, 'Share anonymous usage data on the Hea Koha community website.', 'YesNo'), >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 41d0b2e..992926f 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -10413,6 +10413,27 @@ if ( CheckVersion($DBversion) ) { > SetVersion($DBversion); > } > >+$DBversion = "XXX"; >+if ( CheckVersion($DBversion) ) { >+ $dbh->do(" >+ INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) >+ VALUES('uploadPath','','Sets the upload path for the upload.pl plugin','',''); >+ "); >+ >+ $dbh->do(" >+ CREATE TABLE uploaded_files ( >+ id CHAR(40) NOT NULL PRIMARY KEY, >+ filename TEXT NOT NULL, >+ dir TEXT NOT NULL >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; >+ "); >+ >+ print "Upgrade to $DBversion done (Bug 6874: New cataloging plugin upload.pl)\n"; >+ print "This plugin comes with a new syspref (uploadPath) and a new table (uploaded_files)\n"; >+ print "To use it, set 'uploadPath' and 'OPACBaseURL' system preferences and link this plugin to a subfield (856\$u for instance)\n"; >+ SetVersion($DBversion); >+} >+ > # DEVELOPER PROCESS, search for anything to execute in the db_update directory > # SEE bug 13068 > # if there is anything in the atomicupdate, read and execute it. >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >index bc35aad..e8ddf3c 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref >@@ -125,6 +125,10 @@ Cataloging: > - 'MARC21: "952$a 952$b 952$c"' > - Note that the FA framework is excluded from the permission. > - If the pref is empty, no fields are restricted. >+ - >+ - Absolute path where to store files uploaded in MARC record (plugin upload.pl) >+ - pref: uploadPath >+ class: multi > Display: > - > - 'Separate multiple displayed authors, series or subjects with ' >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt >new file mode 100644 >index 0000000..4fae58a >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt >@@ -0,0 +1,71 @@ >+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> >+<html xmlns="http://www.w3.org/1999/xhtml"> >+<head> >+ <title>Upload plugin</title> >+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> >+ <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script> >+ <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" /> >+ >+</head> >+<body> >+[% IF ( success ) %] >+ >+ <script type="text/javascript"> >+ function report() { >+ var doc = opener.document; >+ var field = doc.getElementById("[% index %]"); >+ field.value = "[% return %]"; >+ } >+ $(document).ready(function() { >+ report(); >+ }); >+ </script> >+ >+ >+ The file [% uploaded_file | html %] has been successfully uploaded. >+ <p><input type="button" value="close" onclick="window.close();" /></p> >+ >+[% ELSE %] >+ >+ [% IF ( error ) %] >+ <p>Error: Failed to upload file. See logs for details.</p> >+ <input type="button" value="close" onclick="window.close();" /> >+ [% ELSE %] >+ [%# This block display recursively a directory tree in variable 'dirs' %] >+ [% BLOCK list_dirs %] >+ [% IF dirs.size %] >+ <ul> >+ [% FOREACH dir IN dirs %] >+ <li style="list-style-type:none"> >+ <input type="radio" name="dir" id="[% dir.value %]" value="[% dir.value %]"> >+ <label for="[% dir.value %]"> >+ [% IF (dir.name == '/') %] >+ <em>(root)</em> >+ [% ELSE %] >+ [% dir.name %] >+ [% END %] >+ </label> >+ </input> >+ [% INCLUDE list_dirs dirs=dir.dirs %] >+ </li> >+ [% END %] >+ </ul> >+ [% END %] >+ [% END %] >+ >+ <h2>Please select the file to upload : </h2> >+ <form method="post" enctype="multipart/form-data" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl"> >+ [% filefield %] >+ <h3>Choose where to upload file</h3> >+ [% INCLUDE list_dirs dirs = dirs_tree %] >+ <input type="hidden" name="plugin_name" value="upload.pl" /> >+ <input type="hidden" name="index" value="[% index %]" /> >+ <input type="submit"> >+ </form> >+ [% END %] >+ >+[% END %] >+ >+</body> >+</html> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt >new file mode 100644 >index 0000000..7817bbe >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt >@@ -0,0 +1,60 @@ >+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> >+<html xmlns="http://www.w3.org/1999/xhtml"> >+<head> >+ <title>Upload plugin</title> >+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> >+ <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script> >+ <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" /> >+ <script type="text/javascript"> >+ //<![CDATA[ >+ function goToUploadPage() { >+ var url = "/cgi-bin/koha/cataloguing/plugin_launcher.pl?" >+ + "plugin_name=upload.pl&index=[% index %]"; >+ window.location.href = url; >+ } >+ //]]> >+ </script> >+ >+</head> >+<body> >+[% IF ( success ) %] >+ >+ <script type="text/javascript"> >+ function report() { >+ var doc = opener.document; >+ var field = doc.getElementById("[% index %]"); >+ field.value = ""; >+ } >+ $(document).ready(function() { >+ report(); >+ }); >+ </script> >+ >+ <p>The file has been successfully deleted.</p> >+ >+ <input type="button" value="Upload a new file" onclick="goToUploadPage();" /> >+ <input type="button" value="Close" onclick="window.close();" /> >+ >+[% ELSE %] >+ >+ [% IF ( error ) %] >+ Error: Unable to delete the file. >+ <p><input type="button" value="close" onclick="window.close();" /></p> >+ [% ELSE %] >+ <h2>File deletion</h2> >+ <p>A file has already been uploaded for this field. Do you want to delete it?</p> >+ <form method="post" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl"> >+ <input type="hidden" name="plugin_name" value="upload.pl" /> >+ <input type="hidden" name="delete" value="delete" /> >+ <input type="hidden" name="id" value="[% id %]" /> >+ <input type="hidden" name="index" value="[% index %]" /> >+ <input type="button" value="Cancel" onclick="javascript:window.close();" /> >+ <input type="submit" value="Delete" /> >+ </form> >+ [% END %] >+ >+[% END %] >+ >+</body> >+</html> >diff --git a/opac/opac-basket.pl b/opac/opac-basket.pl >index 89e1228..971a811 100755 >--- a/opac/opac-basket.pl >+++ b/opac/opac-basket.pl >@@ -70,7 +70,7 @@ foreach my $biblionumber ( @bibs ) { > my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour ); > my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); > my $marcseriesarray = GetMarcSeries ($record,$marcflavour); >- my $marcurlsarray = GetMarcUrls ($record,$marcflavour); >+ my $marcurlsarray = GetMarcUrls ($record,$marcflavour, GetFrameworkCode($biblionumber)); > my @items = &GetItemsInfo( $biblionumber ); > my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber)); > >diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl >index ca882ea..76423ea 100755 >--- a/opac/opac-detail.pl >+++ b/opac/opac-detail.pl >@@ -710,7 +710,7 @@ my $marcisbnsarray = GetMarcISBN ($record,$marcflavour); > my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour); > my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour); > my $marcseriesarray = GetMarcSeries ($record,$marcflavour); >-my $marcurlsarray = GetMarcUrls ($record,$marcflavour); >+my $marcurlsarray = GetMarcUrls ($record, $marcflavour, $dat->{'frameworkcode'}); > my $marchostsarray = GetMarcHosts($record,$marcflavour); > my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber)); > >diff --git a/opac/opac-retrieve-file.pl b/opac/opac-retrieve-file.pl >new file mode 100755 >index 0000000..ddbf1ac >--- /dev/null >+++ b/opac/opac-retrieve-file.pl >@@ -0,0 +1,47 @@ >+#!/usr/bin/perl >+ >+# Copyright 2011-2012 BibLibre >+# >+# 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 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. >+ >+use Modern::Perl; >+use CGI; >+ >+use C4::Context; >+use C4::UploadedFiles; >+ >+my $input = new CGI; >+ >+my $id = $input->param('id'); >+my $file = C4::UploadedFiles::GetUploadedFile($id); >+exit 1 if not $file; >+ >+my $file_path = $file->{filepath}; >+ >+if( -f $file_path ) { >+ open FH, '<', $file_path or die "Can't open file: $!"; >+ print $input->header( >+ -type => "application/octet-stream", >+ -attachment => $file->{filename} >+ ); >+ while(<FH>) { >+ print $_; >+ } >+} else { >+ exit 1; >+} >+ >+exit 0; >-- >2.1.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 6874
:
5439
|
5440
|
5764
|
7114
|
7980
|
8234
|
8468
|
10664
|
10673
|
10863
|
10982
|
11098
|
11634
|
12355
|
12356
|
12357
|
12358
|
14130
|
14131
|
14132
|
14133
|
16343
|
16354
|
16355
|
16356
|
16357
|
16370
|
16693
|
16694
|
16695
|
16696
|
16697
|
16698
|
16699
|
16712
|
16713
|
16714
|
16715
|
16716
|
16717
|
16718
|
16719
|
17368
|
17369
|
18767
|
18768
|
18769
|
18770
|
18771
|
18772
|
18773
|
18774
|
18775
|
18776
|
18777
|
18891
|
18892
|
18893
|
18894
|
20059
|
20060
|
20779
|
21432
|
21433
|
21434
|
21435
|
21436
|
21489
|
21543
|
21546
|
21635
|
21798
|
21799
|
21800
|
21801
|
21802
|
21803
|
23588
|
23589
|
23590
|
23591
|
23607
|
23608
|
23609
|
23610
|
23611
|
23612
|
23613
|
26418
|
26419
|
26420
|
26421
|
26422
|
26423
|
26424
|
26878
|
26879
|
26880
|
26881
|
26882
|
26883
|
26884
|
27114
|
27125
|
27154
|
27155
|
27225
|
30362
|
30363
|
30364
|
30365
|
30366
|
30367
|
30368
|
30369
|
30370
|
30371
|
32384
|
32385
|
32386
|
32387
|
32388
|
32389
|
32390
|
32391
|
32392
|
32393
|
36198
|
36199
|
36200
|
36201
|
36202
|
36203
|
36204
|
36205
|
36206
|
36207
|
36208
|
36209
|
36210
|
36211
|
36213
|
36214
|
36215
|
36216
|
36217
|
36218
|
36219
|
36220
|
36221
|
36222
|
36223
|
36224
|
36225
|
36226
|
36227
|
36228
|
36229
|
36230
|
36231
|
36232
|
37681
|
37682
|
37683
|
37684
|
37685
|
37686
|
37687
|
37688
|
37689
|
37690
|
37691
|
37692
|
37693
|
37694
|
37696
|
37697
|
37698
|
37699
|
37700
|
37701
|
37702
|
37703
|
37704
|
37705
|
37706
|
38911
|
38912
|
38913
|
38914
|
38915
|
38916
|
38917
|
38918
|
38919
|
38920
|
38921
|
38922
|
38923
|
38924
|
38925
|
38926
|
38927
|
38928
|
38929
|
38930
|
38931
|
38932
|
38933
|
38934
|
38935
|
38936
|
39113
|
39114
|
39115
|
39116
|
39117
|
39118
|
39119
|
39120
|
39121
|
39122
|
39123
|
39626
|
39627
|
39628
|
39629
|
39630
|
39631
|
39632
|
39633
|
39634
|
39635
|
39636
|
39637
|
39638
|
41275
|
41276
|
41277
|
41278
|
41279
|
41280
|
41281
|
41282
|
41283
|
41284
|
41285
|
41286
|
41287
|
41288
|
41448
|
41449
|
41450
|
41783