[Koha-patches] [PATCH] Bug 6874: Adds the ability to upload a file for a subfield

Julian Maurice julian.maurice at biblibre.com
Fri Oct 7 12:23:38 CEST 2011


From: Matthias Meusburger <matthias.meusburger at biblibre.com>

Biblibre MT5108
---
 C4/Biblio.pm                                       |   18 ++-
 basket/basket.pl                                   |    2 +-
 catalogue/MARCdetail.pl                            |   11 +
 catalogue/detail.pl                                |    2 +-
 cataloguing/value_builder/upload.pl                |  221 ++++++++++++++++++++
 installer/data/mysql/sysprefs.sql                  |    2 +
 installer/data/mysql/updatedatabase.pl             |   14 ++
 .../prog/en/modules/catalogue/MARCdetail.tt        |   80 ++++++-
 .../en/modules/cataloguing/value_builder/upload.tt |   50 +++++
 .../value_builder/upload_delete_file.tt            |   52 +++++
 kohaversion.pl                                     |    2 +-
 misc/strip_value_from_tag.pl                       |   60 ++++++
 opac/opac-MARCdetail.pl                            |   10 +
 opac/opac-basket.pl                                |    2 +-
 opac/opac-detail.pl                                |    2 +-
 15 files changed, 508 insertions(+), 20 deletions(-)
 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 100644 misc/strip_value_from_tag.pl

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 915139e..05d7cc5 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -1624,7 +1624,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) 
@@ -1632,15 +1632,19 @@ Assumes web resources (not uncommon in MARC21 to omit resource type ind)
 =cut
 
 sub GetMarcUrls {
-    my ( $record, $marcflavour ) = @_;
+    my ( $record, $marcflavour, $frameworkcode ) = @_;
+
+    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' ) {
@@ -1669,7 +1673,11 @@ sub GetMarcUrls {
                 $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") {
+		    $marcurl->{'MARCURL'} = C4::Context->preference('uploadWebPath') . "/" . $url;
+		} else {
+		    $marcurl->{'MARCURL'} = $url;
+		}
             }
             push @marcurls, $marcurl;
         }
diff --git a/basket/basket.pl b/basket/basket.pl
index 8fc15e4..59894b3 100755
--- a/basket/basket.pl
+++ b/basket/basket.pl
@@ -65,7 +65,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 0a2974b..19d26b8 100755
--- a/catalogue/MARCdetail.pl
+++ b/catalogue/MARCdetail.pl
@@ -82,6 +82,11 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     }
 );
 
+my $uploadWebPath;
+if (C4::Context->preference('uploadWebPath')) {
+    $uploadWebPath = C4::Context->preference('uploadWebPath');
+}
+
 my $record = GetMarcBiblio($biblionumber);
 
 if ( not defined $record ) {
@@ -215,6 +220,12 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) {
                       GetAuthorisedValueDesc( $fields[$x_i]->tag(),
                         $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1];
 
+                    if ($tagslib->{ $fields[$x_i]->tag() }->{ $subf[$i][0] }->{value_builder} eq "upload.pl" and $uploadWebPath) {
+                        my $file_uri = qq($uploadWebPath/$subf[$i][1]);
+                        $subfield_data{marc_value} = qq/<a href="$file_uri">$subfield_data{marc_value}<\/a>/;
+                        $subfield_data{is_file} = 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 8738737..744af0c 100755
--- a/catalogue/detail.pl
+++ b/catalogue/detail.pl
@@ -104,7 +104,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 $subtitle         = GetRecordValue('subtitle', $record, $fw);
 
 # Get Branches, Itemtypes and Locations
diff --git a/cataloguing/value_builder/upload.pl b/cataloguing/value_builder/upload.pl
new file mode 100755
index 0000000..c768ade
--- /dev/null
+++ b/cataloguing/value_builder/upload.pl
@@ -0,0 +1,221 @@
+#!/usr/bin/perl
+
+# Copyright 2011 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 strict;
+use warnings;
+
+use C4::Auth;
+use CGI qw/-utf8/;
+use C4::Context;
+use C4::Debug;
+
+use C4::AuthoritiesMarc;
+use C4::Output;
+use File::Basename;
+use Text::Undiacritic qw/undiacritic/;
+use Encode;
+
+
+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) {
+            defaultvalue = document.getElementById(index).value;
+            window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=upload.pl&index=\"+index+\"&result=\"+defaultvalue,'upload','width=600,height=400,toolbar=false,scrollbars=no');
+
+        }
+    </script>
+";
+
+    return ( $function_name, $res );
+}
+
+sub plugin {
+    my ($input)      = @_;
+    my $index        = $input->param('index');
+    my $result       = $input->param('result');
+    my $delete       = $input->param('delete');
+    my $uploaded_file = $input->param('uploaded_file');
+
+    my $template_name = ($result || $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,
+        }
+    );
+
+
+    my $filefield = CGI::filefield( -name=>'uploaded_file',
+     -default=>'starting value',
+     -size=>50,
+     -maxlength=>80);
+
+    $template->param(
+        index      => $index,
+        result     => $result,
+        filefield  => $filefield
+    );
+
+
+    # If there's already a file uploaded for this field,
+    # We handle is deletion
+    if ($delete) {
+        $result =~ s/\.\.\///g;          # remove "../" in path
+        warn "deletion of $upload_path/$result";
+        my $success = unlink("$upload_path/$result");
+        if ($success) {
+            $template->param(success => $success);
+        } else {
+            $template->param(error => 1);
+        }
+    }
+
+
+    # Dealing with the uploaded file
+    if ($uploaded_file) {
+
+        my $fh = $input->upload('uploaded_file');
+        my $error;
+        my $success;
+
+        if (defined $fh) {
+            # Dealing with filenames:
+
+            # Normalizing filename:
+            $uploaded_file = normalize_string($uploaded_file);
+            $uploaded_file = undiacritic($uploaded_file);
+            # remove leading dot to prevent uploading files like .htaccess
+            $uploaded_file =~ s/^\.//;
+
+            # Checking for an existing filename in destination directory
+            if (-f "$upload_path/$uploaded_file") {
+                # And getting a new one if needed
+                my ($file, $dir, $ext) = fileparse("$upload_path/$uploaded_file", qr/\.[^.]*/);
+                warn "FILE = '$file'";
+                warn "DIR = '$dir'";
+                warn "EXT = '$ext'";
+                $uploaded_file = findname($file, $dir, $ext);
+            }
+
+            # Copying the temp file to the destination directory
+            my $io_fh = $fh->handle;
+            open (OUTFILE, '>', "$upload_path/$uploaded_file") or $error = $!;
+            if (!$error) {
+                my $buffer;
+                while (my $bytesread = $io_fh->read($buffer,1024)) {
+                    print OUTFILE $buffer;
+                }
+                close(OUTFILE);
+                # prevent executable bit to be set
+                chmod 0644, "$upload_path/$uploaded_file";
+                $success = 1;
+            } else {
+                $error = "Could not write to destination file";
+            }
+        } else {
+            $error = "Could not get the file";
+        }
+        $template->param(success       => $success)        if ($success);
+        $template->param(error         => $error)          if ($error);
+        $template->param(uploaded_file => $uploaded_file);
+    }
+
+    output_html_with_http_headers $input, $cookie, $template->output;
+}
+
+# Search a valid non-existing filename using an incremental number
+sub findname {
+    my $file = shift;
+    my $dir = shift;
+    my $ext = shift;
+
+    my $count = 1;
+    my $found = 0;
+
+    while ($found == 0) {
+        if (-f "$dir/$file-$count$ext") {
+            $count++;
+        } else {
+            $found = 1;
+        }
+    }
+
+    return "$file-$count$ext";
+}
+
+
+# Given a string
+# Returns a utf8 NFC normalized string
+sub normalize_string{
+    my ($string)=@_;
+    $debug and warn " string in normalize before normalize :",$string;
+    $string=decode_utf8($string,1);
+    $debug and warn " string in normalize :",$string;
+    $string=~s/\<|\>|\^|\;|\?|,|\-|\(|\)|\[|\]|\{|\}|\$|\%|\!|\*|\:|\\|\/|\&|\"|\'|\s/_/g;
+    $string=~s/\s+$//g;
+    $string=~s/^\s+//g;
+    return $string; 
+}
+
+
+1;
+
+
+__END__
+
+=head1 upload.pl
+
+This plugin allow to upload files on the server and reference it in a marc
+field.
+
+Two system preferences are used:
+
+=over 4
+
+=item uploadPath: the real absolute path where files will be stored
+
+=item uploadWebPath: the path from the server root directory. If you want to
+access files through http://koha.tld/files, uploadWebPath must be "/files".
+
+=back
+
diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql
index 79d4893..a8562c0 100755
--- a/installer/data/mysql/sysprefs.sql
+++ b/installer/data/mysql/sysprefs.sql
@@ -318,3 +318,5 @@ INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES (
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('BasketConfirmations', '1', 'When closing or reopening a basket,', 'always ask for confirmation.|do not ask for confirmation.', 'Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES ('MARCAuthorityControlField008', '|| aca||aabn           | a|a     d', NULL, NULL, 'Textarea');
 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpenLibraryCovers',0,'If ON Openlibrary book covers will be show',NULL,'YesNo');
+INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('uploadPath','','Sets the upload path for the upload.pl plugin','','');
+INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('uploadWebPath','','Set the upload path starting from document root for the upload.pl plugin','','');
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 6b88c29..a903e07 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -4446,6 +4446,20 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
     SetVersion($DBversion);
 }
 
+$DBversion = "XXX";
+if ( C4::Context->preference("Version") < TransformToNum($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("
+    INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('uploadWebPath','','Set the upload path starting from document root for the upload.pl plugin','','');
+    ");
+    print "Upgrade to $DBversion done (Adding upload plugin sysprefs)\n";
+    SetVersion($DBversion);
+}
+
+=item DropAllForeignKeys($table)
 
 =head1 FUNCTIONS
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt
index 3fac577..61892d2 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt
@@ -109,7 +109,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %][% subfiel.marc_subfield %][% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF ( subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -139,7 +145,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF ( subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -169,7 +181,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF ( subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -199,7 +217,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF ( subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -229,7 +253,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -259,7 +289,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -289,7 +325,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -319,7 +361,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -349,7 +397,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
@@ -379,7 +433,13 @@ function Changefwk(FwkList) {
                     <span class="subfield-label">&nbsp;
                     [% UNLESS ( subfiel.hide_marc ) %]<b>[% subfiel.marc_subfield %]</b>[% END %]
                     <span title="[% subfiel.long_desc %]">[% subfiel.short_desc %]</span></span>
-                    [% IF ( subfiel.is_url ) %]<a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>[% ELSE %][% subfiel.marc_value |html %][% END %]
+                    [% IF ( subfiel.is_url ) %]
+                        <a href="[% subfiel.marc_value %]">[% subfiel.marc_value |html %]</a>
+                    [% ELSIF (subfiel.is_file ) %]
+                        [% subfiel.marc_value %]
+                    [% ELSE %]
+                        [% subfiel.marc_value |html %]
+                    [% END %]
                     [% IF ( subfiel.link ) %]
                         <a href="/cgi-bin/koha/catalogue/search.pl?op=do_search&amp;idx=[% subfiel.link %],phr&amp;type=intranet&amp;q=[% subfiel.marc_value |url %]">
                             <img border="0" src="[% interface %]/[% theme %]/img/filefind.png" height="15" title="Search on [% subfiel.marc_value |html %]" alt="Search on [% subfiel.marc_value |html %]" />
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..0a8235e
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt
@@ -0,0 +1,50 @@
+<!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="[% yuipath %]/utilities/utilities.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 =  "[% uploaded_file %]";
+            window.close();
+            return false;
+        }
+    </script>
+
+
+    The file [% uploaded_file %] has been successfully added.
+    <p><input type="button" value="close" onclick="javascript:report();" /></p>
+
+[% ELSE %]
+
+    [% IF ( error ) %]
+	Error: [% error %]
+	<p><input type="button" value="close" onclick="javascript:window.close();" /></p>
+    [% ELSE %]
+
+	[% IF ( uploaded_file ) %]
+	uploaded file: [% uploaded_file %]
+	[% ELSE %]
+	    <h2>Please select the file to upload : </h2>
+	    <form method="post" enctype="multipart/form-data" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl">
+		[% filefield %]
+		<input type="hidden" name="plugin_name" value="upload.pl" />
+		<input type="hidden" name="index" value="[% index %]" />
+		<input type="submit">
+	    </form>
+	[% END %]
+    [% 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..cf0dc66
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt
@@ -0,0 +1,52 @@
+<!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="[% yuipath %]/utilities/utilities.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 =  "";
+            window.close();
+            return false;
+        }
+    </script>
+
+    The file has been successfully deleted.
+    <p><input type="button" value="close" onclick="javascript:report();" /></p>
+
+[% ELSE %]
+
+    [% IF ( error ) %]
+	Error: Unable to delete the file.
+	<p><input type="button" value="close" onclick="javascript:window.close();" /></p>
+    [% ELSE %]
+
+	[% IF ( uploaded_file ) %]
+	uploaded file: [% uploaded_file %]
+	[% 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="result" value="[% result %]" />
+		<input type="hidden" name="index" value="[% index %]" />
+		<input type="button" value="Cancel" onclick="javascript:window.close();" />
+		<input type="submit" value="Delete" />
+	    </form>
+	[% END %]
+    [% END %]
+[% END %]
+
+</body>
+</html>
diff --git a/kohaversion.pl b/kohaversion.pl
index f864378..aa2eac2 100644
--- a/kohaversion.pl
+++ b/kohaversion.pl
@@ -16,7 +16,7 @@ the kohaversion is divided in 4 parts :
 use strict;
 
 sub kohaversion {
-    our $VERSION = '3.05.00.011';
+    our $VERSION = 'XXX';
     # version needs to be set this way
     # so that it can be picked up by Makefile.PL
     # during install
diff --git a/misc/strip_value_from_tag.pl b/misc/strip_value_from_tag.pl
new file mode 100644
index 0000000..807e7b5
--- /dev/null
+++ b/misc/strip_value_from_tag.pl
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+
+# This script takes every biblio record in the database,
+# looks for a value beginning with $find in $fieldtag$$subfieldtag
+# and strips $find from this value.
+# This was originally made for the file upload plugin, but might
+# be used for other purposes.
+
+use strict;
+
+use Getopt::Long;
+use C4::Context;
+use C4::Biblio;
+
+my $debug = 0;
+
+# Which field are we processing?
+my $fieldtag = "857";
+my $subfieldtag = "u";
+
+# Whichi beginning pattern are we looking to delete?
+my $find = "http://myurl.tld/";
+my $length = length($find);
+my $pattern = qr|^$find|;
+
+print "Field $fieldtag\$$subfieldtag\n";
+
+# Getting db connection
+my $dbh = C4::Context->dbh;
+
+# Getting max bibnumber
+my $query = "SELECT MAX(biblionumber) from biblio";
+my $sth = $dbh->prepare($query);
+$sth->execute();
+my $bibliocount = $sth->fetchrow;
+
+warn "unable to get biblio count" and exit -1 unless $bibliocount;
+
+print "Biblio count : $bibliocount\n";
+
+# Foreach each biblio
+foreach (1..$bibliocount) {
+    my $found = 0;
+    my $record = GetMarcBiblio($_);
+    $debug and warn "unable to get marc for record $_" unless $record;
+    next unless $record;
+    foreach my $field ($record->field($fieldtag)) {
+	my $newfield = $field->clone();
+	my $subfield = $newfield->subfield($subfieldtag);
+	if ($subfield and $subfield =~ $pattern) {
+	    my $newsubfield = substr $subfield, $length;
+	    $newsubfield =~ s/\s+$//;
+	    $newfield->update($subfieldtag, $newsubfield);
+	    $field->replace_with($newfield);
+	    $found = 1;
+	}
+    }
+    print "processing $_\n" if ($found == 1);
+    ModBiblioMarc($record, $_, GetFrameworkCode($_)) if ($found == 1);
+}
diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl
index ffa0a6d..4005ee4 100755
--- a/opac/opac-MARCdetail.pl
+++ b/opac/opac-MARCdetail.pl
@@ -90,6 +90,11 @@ if (C4::Context->preference("RequestOnOpac")) {
 	$RequestOnOpac = 1;
 }
 
+my $uploadWebPath;
+if (C4::Context->preference('uploadWebPath')) {
+    $uploadWebPath = C4::Context->preference('uploadWebPath');
+}
+
 # fill arrays
 my @loop_data = ();
 my $tag;
@@ -161,6 +166,11 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) {
                     }
                     $subfield_data{marc_value} = GetAuthorisedValueDesc( $fields[$x_i]->tag(),
                         $subf[$i][0], $subf[$i][1], '', $tagslib, '', 'opac' );
+                    if ($tagslib->{ $fields[$x_i]->tag() }->{ $subf[$i][0] }->{value_builder} eq "upload.pl" and $uploadWebPath) {
+                        my $file_uri = qq($uploadWebPath/$subf[$i][1]);
+                        $subfield_data{marc_value} = qq/<a href="$file_uri">$subfield_data{marc_value}<\/a>/;
+                    }
+
                 }
                 $subfield_data{marc_subfield} = $subf[$i][0];
                 $subfield_data{marc_tag}      = $fields[$x_i]->tag();
diff --git a/opac/opac-basket.pl b/opac/opac-basket.pl
index 5e92d15..8f31ba8 100755
--- a/opac/opac-basket.pl
+++ b/opac/opac-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            = &GetItemsLocationInfo( $biblionumber );
     my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
 
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index e18e046..5a830b6 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -223,7 +223,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 $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
 
     $template->param(
-- 
1.7.6.3



More information about the Koha-patches mailing list