View | Details | Raw Unified | Return to bug 6874
Collapse All | Expand All

(-)a/C4/Biblio.pm (-6 / +23 lines)
Lines 36-41 use C4::ClassSource; Link Here
36
use C4::Charset;
36
use C4::Charset;
37
use C4::Linker;
37
use C4::Linker;
38
use C4::OAI::Sets;
38
use C4::OAI::Sets;
39
use C4::UploadedFiles;
39
40
40
use vars qw($VERSION @ISA @EXPORT);
41
use vars qw($VERSION @ISA @EXPORT);
41
42
Lines 1780-1786 sub GetMarcAuthors { Link Here
1780
1781
1781
=head2 GetMarcUrls
1782
=head2 GetMarcUrls
1782
1783
1783
  $marcurls = GetMarcUrls($record,$marcflavour);
1784
  $marcurls = GetMarcUrls($record,$marcflavour,$frameworkcode);
1784
1785
1785
Returns arrayref of URLs from MARC data, suitable to pass to tmpl loop.
1786
Returns arrayref of URLs from MARC data, suitable to pass to tmpl loop.
1786
Assumes web resources (not uncommon in MARC21 to omit resource type ind) 
1787
Assumes web resources (not uncommon in MARC21 to omit resource type ind) 
Lines 1788-1802 Assumes web resources (not uncommon in MARC21 to omit resource type ind) Link Here
1788
=cut
1789
=cut
1789
1790
1790
sub GetMarcUrls {
1791
sub GetMarcUrls {
1791
    my ( $record, $marcflavour ) = @_;
1792
    my ( $record, $marcflavour, $frameworkcode ) = @_;
1793
1794
    my $tagslib = &GetMarcStructure(1, $frameworkcode);
1795
    my $urltag = '856';
1796
    my $urlsubtag = 'u';
1792
1797
1793
    my @marcurls;
1798
    my @marcurls;
1794
    for my $field ( $record->field('856') ) {
1799
    for my $field ( $record->field($urltag) ) {
1795
        my @notes;
1800
        my @notes;
1796
        for my $note ( $field->subfield('z') ) {
1801
        for my $note ( $field->subfield('z') ) {
1797
            push @notes, { note => $note };
1802
            push @notes, { note => $note };
1798
        }
1803
        }
1799
        my @urls = $field->subfield('u');
1804
        my @urls = $field->subfield($urlsubtag);
1800
        foreach my $url (@urls) {
1805
        foreach my $url (@urls) {
1801
            my $marcurl;
1806
            my $marcurl;
1802
            if ( $marcflavour eq 'MARC21' ) {
1807
            if ( $marcflavour eq 'MARC21' ) {
Lines 1824-1831 sub GetMarcUrls { Link Here
1824
                $marcurl->{'part'} = $s3 if ($link);
1829
                $marcurl->{'part'} = $s3 if ($link);
1825
                $marcurl->{'toc'} = 1 if ( defined($s3) && $s3 =~ /^[Tt]able/ );
1830
                $marcurl->{'toc'} = 1 if ( defined($s3) && $s3 =~ /^[Tt]able/ );
1826
            } else {
1831
            } else {
1827
                $marcurl->{'linktext'} = $field->subfield('2') || C4::Context->preference('URLLinkText') || $url;
1832
                if ($tagslib->{ $urltag }->{ $urlsubtag }->{value_builder} eq "upload.pl"
1828
                $marcurl->{'MARCURL'} = $url;
1833
                  and $url =~ /id=([0-9a-f]+)/) {
1834
                    my $file = C4::UploadedFiles::GetUploadedFile($1);
1835
                    my $text = $file ? $file->{filename} : $url;
1836
                    $marcurl->{'linktext'} = $field->subfield('2')
1837
                                          || C4::Context->preference('URLLinkText')
1838
                                          || $file->{filename};
1839
                    $marcurl->{'MARCURL'} = $url;
1840
                } else {
1841
                    $marcurl->{'linktext'} = $field->subfield('2')
1842
                                          || C4::Context->preference('URLLinkText')
1843
                                          || $url;
1844
                    $marcurl->{'MARCURL'} = $url;
1845
                }
1829
            }
1846
            }
1830
            push @marcurls, $marcurl;
1847
            push @marcurls, $marcurl;
1831
        }
1848
        }
(-)a/C4/UploadedFiles.pm (+214 lines)
Line 0 Link Here
1
package C4::UploadedFiles;
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
=head1 NAME
21
22
C4::UploadedFiles - Functions to deal with files uploaded with cataloging plugin upload.pl
23
24
=head1 SYNOPSIS
25
26
    use C4::UploadedFiles;
27
28
    my $filename = $cgi->param('uploaded_file');
29
    my $file = $cgi->upload('uploaded_file');
30
    my $dir = $input->param('dir');
31
32
    # upload file
33
    my $id = C4::UploadedFiles::UploadFile($filename, $dir, $file->handle);
34
35
    # retrieve file infos
36
    my $uploaded_file = C4::UploadedFiles::GetUploadedFile($id);
37
38
    # delete file
39
    C4::UploadedFiles::DelUploadedFile($id);
40
41
=head1 DESCRIPTION
42
43
This module provides basic functions for adding, retrieving and deleting files related to
44
cataloging plugin upload.pl.
45
46
It uses uploaded_files table.
47
48
It is not related to C4::UploadedFile
49
50
=head1 FUNCTIONS
51
52
=cut
53
54
use Modern::Perl;
55
use Digest::SHA;
56
use Fcntl;
57
58
use C4::Context;
59
60
=head2 GetUploadedFile
61
62
    my $file = C4::UploadedFiles::GetUploadedFile($id);
63
64
Returns a hashref containing infos on uploaded files.
65
Hash keys are:
66
67
=over 2
68
69
=item * id: id of the file (same as given in argument)
70
71
=item * filename: name of the file
72
73
=item * dir: directory where file is stored (relative to syspref 'uploadPath')
74
75
=back
76
77
It returns undef if file is not found
78
79
=cut
80
81
sub GetUploadedFile {
82
    my ($id) = @_;
83
84
    return unless $id;
85
86
    my $dbh = C4::Context->dbh;
87
    my $query = qq{
88
        SELECT id, filename, dir
89
        FROM uploaded_files
90
        WHERE id = ?
91
    };
92
    my $sth = $dbh->prepare($query);
93
    $sth->execute($id);
94
    my $file = $sth->fetchrow_hashref;
95
96
    return $file;
97
}
98
99
=head2 UploadFile
100
101
    my $id = C4::UploadedFiles::UploadFile($filename, $dir, $io_handle);
102
103
Upload a new file and returns its id (its SHA-1 sum, actually).
104
105
Parameters:
106
107
=over 2
108
109
=item * $filename: name of the file
110
111
=item * $dir: directory where to store the file (path relative to syspref 'uploadPath'
112
113
=item * $io_handle: valid IO::Handle object, can be retrieved with
114
$cgi->upload('uploaded_file')->handle;
115
116
=back
117
118
=cut
119
120
sub UploadFile {
121
    my ($filename, $dir, $handle) = @_;
122
123
    if($filename =~ m#/(^|/)\.\.(/|$)# or $dir =~ m#(^|/)\.\.(/|$)#) {
124
        warn "Filename or dirname contains '..'. Aborting upload";
125
        return;
126
    }
127
128
    my $buffer;
129
    my $data = '';
130
    while($handle->read($buffer, 1024)) {
131
        $data .= $buffer;
132
    }
133
    $handle->close;
134
135
    my $sha = new Digest::SHA;
136
    $sha->add($data);
137
    my $id = $sha->hexdigest;
138
139
    # Test if this id already exist
140
    my $file = GetUploadedFile($id);
141
    if($file) {
142
        return $file->{id};
143
    }
144
145
    my $upload_path = C4::Context->preference("uploadPath");
146
    my $file_path = "$upload_path/$dir/$filename";
147
    $file_path =~ s#/+#/#;
148
149
    my $out_fh;
150
    # Create the file only if it doesn't exist
151
    unless( sysopen($out_fh, $file_path, O_WRONLY|O_CREAT|O_EXCL) ) {
152
        warn "Failed to open file '$file_path': $!";
153
        return;
154
    }
155
156
    print $out_fh $data;
157
    close $out_fh;
158
159
    my $dbh = C4::Context->dbh;
160
    my $query = qq{
161
        INSERT INTO uploaded_files (id, filename, dir)
162
        VALUES (?,?, ?);
163
    };
164
    my $sth = $dbh->prepare($query);
165
    if($sth->execute($id, $filename, $dir)) {
166
        return $id;
167
    }
168
169
    return undef;
170
}
171
172
=head2 DelUploadedFile
173
174
    C4::UploadedFiles::DelUploadedFile($id);
175
176
Remove a previously uploaded file, given its id.
177
178
Returns a false value if an error occurs.
179
180
=cut
181
182
sub DelUploadedFile {
183
    my ($id) = @_;
184
185
    my $file = GetUploadedFile($id);
186
    if($file) {
187
        my $upload_path = C4::Context->preference("uploadPath");
188
        my $file_path = "$upload_path/$file->{dir}/$file->{filename}";
189
        $file_path =~ s#/+#/#;
190
        my $file_deleted = 0;
191
        unless( -f $file_path ) {
192
            warn "Id $file->{id} is in database but not in filesystem, removing id from database";
193
            $file_deleted = 1;
194
        } else {
195
            if(unlink $file_path) {
196
                $file_deleted = 1;
197
            }
198
        }
199
200
        unless($file_deleted) {
201
            warn "File $file_path cannot be deleted: $!";
202
        }
203
204
        my $dbh = C4::Context->dbh;
205
        my $query = qq{
206
            DELETE FROM uploaded_files
207
            WHERE id = ?
208
        };
209
        my $sth = $dbh->prepare($query);
210
        return $sth->execute($id);
211
    }
212
}
213
214
1;
(-)a/basket/basket.pl (-1 / +1 lines)
Lines 65-71 foreach my $biblionumber ( @bibs ) { Link Here
65
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
65
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
66
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
66
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
67
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
67
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
68
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
68
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour, GetFrameworkCode($biblionumber));
69
    my @items            = GetItemsInfo( $biblionumber );
69
    my @items            = GetItemsInfo( $biblionumber );
70
70
71
    my $hasauthors = 0;
71
    my $hasauthors = 0;
(-)a/catalogue/MARCdetail.pl (-1 lines)
Lines 215-221 for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { Link Here
215
                    $subfield_data{marc_value} =
215
                    $subfield_data{marc_value} =
216
                      GetAuthorisedValueDesc( $fields[$x_i]->tag(),
216
                      GetAuthorisedValueDesc( $fields[$x_i]->tag(),
217
                        $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1];
217
                        $subf[$i][0], $subf[$i][1], '', $tagslib) || $subf[$i][1];
218
219
                }
218
                }
220
                $subfield_data{marc_subfield} = $subf[$i][0];
219
                $subfield_data{marc_subfield} = $subf[$i][0];
221
                $subfield_data{marc_tag}      = $fields[$x_i]->tag();
220
                $subfield_data{marc_tag}      = $fields[$x_i]->tag();
(-)a/catalogue/detail.pl (-1 / +1 lines)
Lines 110-116 my $marcisbnsarray = GetMarcISBN( $record, $marcflavour ); Link Here
110
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
110
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
111
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
111
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
112
my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
112
my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
113
my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
113
my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, $fw);
114
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
114
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
115
my $subtitle         = GetRecordValue('subtitle', $record, $fw);
115
my $subtitle         = GetRecordValue('subtitle', $record, $fw);
116
116
(-)a/cataloguing/value_builder/upload.pl (+179 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
use CGI qw/-utf8/;
22
use File::Basename;
23
24
use C4::Auth;
25
use C4::Context;
26
use C4::Output;
27
use C4::UploadedFiles;
28
29
my $upload_path = C4::Context->preference('uploadPath');
30
31
sub plugin_parameters {
32
    my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
33
    return "";
34
}
35
36
sub plugin_javascript {
37
    my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
38
    my $function_name = $field_number;
39
    my $res           = "
40
    <script type=\"text/javascript\">
41
        function Focus$function_name(subfield_managed) {
42
            return 1;
43
        }
44
45
        function Blur$function_name(subfield_managed) {
46
            return 1;
47
        }
48
49
        function Clic$function_name(index) {
50
            var id = document.getElementById(index).value;
51
            if(id.match(/id=([0-9a-f]+)/)){
52
                id = RegExp.\$1;
53
            }
54
            window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=upload.pl&index=\"+index+\"&id=\"+id, 'upload', 'width=600,height=400,toolbar=false,scrollbars=no');
55
56
        }
57
    </script>
58
";
59
60
    return ( $function_name, $res );
61
}
62
63
sub plugin {
64
    my ($input) = @_;
65
    my $index = $input->param('index');
66
    my $id = $input->param('id');
67
    my $delete = $input->param('delete');
68
    my $uploaded_file = $input->param('uploaded_file');
69
70
    my $template_name = ($id || $delete)
71
                    ? "upload_delete_file.tt"
72
                    : "upload.tt";
73
74
    my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
75
        {   template_name   => "cataloguing/value_builder/$template_name",
76
            query           => $input,
77
            type            => "intranet",
78
            authnotrequired => 0,
79
            flagsrequired   => { editcatalogue => '*' },
80
            debug           => 1,
81
        }
82
    );
83
84
    # Dealing with the uploaded file
85
    if ($uploaded_file) {
86
        my $fh = $input->upload('uploaded_file');
87
        my $dir = $input->param('dir');
88
89
        $id = C4::UploadedFiles::UploadFile($uploaded_file, $dir, $fh->handle);
90
        if($id) {
91
            my $OPACBaseURL = C4::Context->preference('OPACBaseURL');
92
            $OPACBaseURL =~ s#/$##;
93
            my $return = "$OPACBaseURL/cgi-bin/koha/opac-retrieve-file.pl?id=$id";
94
            $template->param(
95
                success => 1,
96
                return => $return,
97
                uploaded_file => $uploaded_file,
98
            );
99
        } else {
100
            $template->param(error => 1);
101
        }
102
    } elsif ($delete || $id) {
103
        # If there's already a file uploaded for this field,
104
        # We handle its deletion
105
        if ($delete) {
106
            if(C4::UploadedFiles::DelUploadedFile($id)) {;
107
                $template->param(success => 1);
108
            } else {
109
                $template->param(error => 1);
110
            }
111
        }
112
    } else {
113
        my $filefield = CGI::filefield(
114
            -name => 'uploaded_file',
115
            -size => 50,
116
        );
117
118
        my $dirs_tree = [ {
119
            name => '/',
120
            value => '/',
121
            dirs => finddirs($upload_path)
122
        } ];
123
124
        $template->param(
125
            dirs_tree => $dirs_tree,
126
            filefield => $filefield
127
        );
128
    }
129
130
    $template->param(
131
        index => $index,
132
        id => $id
133
    );
134
135
    output_html_with_http_headers $input, $cookie, $template->output;
136
}
137
138
# Build a hierarchy of directories
139
sub finddirs {
140
    my $base = shift || $upload_path;
141
    my $found = 0;
142
    my @dirs;
143
    my @files = <$base/*>;
144
    foreach (@files) {
145
        if (-d $_ and -w $_) {
146
            my $lastdirname = basename($_);
147
            my $dirname =  $_;
148
            $dirname =~ s/^$upload_path//g;
149
            push @dirs, {
150
                value => $dirname,
151
                name => $lastdirname,
152
                dirs => finddirs($_)
153
            };
154
            $found = 1;
155
        };
156
    }
157
    return \@dirs;
158
}
159
160
1;
161
162
163
__END__
164
165
=head1 upload.pl
166
167
This plugin allow to upload files on the server and reference it in a marc
168
field.
169
170
Two system preference are used:
171
172
=over 4
173
174
=item * uploadPath: the real absolute path where files will be stored
175
176
=item * OPACBaseURL: for building URLs to be stored in MARC
177
178
=back
179
(-)a/installer/data/mysql/kohastructure.sql (+11 lines)
Lines 2784-2789 CREATE TABLE `biblioimages` ( Link Here
2784
 CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
2784
 CONSTRAINT `bibliocoverimage_fk1` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
2785
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2785
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2786
2786
2787
--
2788
-- Table structure for table uploaded_files
2789
--
2790
2791
DROP TABLE IF EXISTS uploaded_files
2792
CREATE TABLE uploaded_files (
2793
    id CHAR(40) NOT NULL PRIMARY KEY,
2794
    filename TEXT NOT NULL,
2795
    dir TEXT NOT NULL
2796
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2797
2787
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2798
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2788
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
2799
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
2789
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
2800
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 355-357 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ( Link Here
355
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OAI-PMH:AutoUpdateSets','0','Automatically update OAI sets when a bibliographic record is created or updated','','YesNo');
355
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OAI-PMH:AutoUpdateSets','0','Automatically update OAI sets when a bibliographic record is created or updated','','YesNo');
356
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowPublicListCreation',1,'If set, allows opac users to create public lists',NULL,'YesNo');
356
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowPublicListCreation',1,'If set, allows opac users to create public lists',NULL,'YesNo');
357
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowSharingPrivateLists',0,'If set, allows opac users to share private lists with other patrons',NULL,'YesNo');
357
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacAllowSharingPrivateLists',0,'If set, allows opac users to share private lists with other patrons',NULL,'YesNo');
358
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('uploadPath','','Sets the upload path for the upload.pl plugin. For security reasons, the upload path MUST NOT be a public, webserver accessible directory.','','');
(-)a/installer/data/mysql/updatedatabase.pl (-1 / +22 lines)
Lines 4932-4938 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
4932
    SetVersion($DBversion);
4932
    SetVersion($DBversion);
4933
}
4933
}
4934
4934
4935
4936
$DBversion = "3.07.00.029";
4935
$DBversion = "3.07.00.029";
4937
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4936
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4938
    my $installer = C4::Installer->new();
4937
    my $installer = C4::Installer->new();
Lines 4994-4999 if ( C4::Context->preference("Version") lt TransformToNum($DBversion) ) { Link Here
4994
    SetVersion($DBversion);
4993
    SetVersion($DBversion);
4995
}
4994
}
4996
4995
4996
$DBversion = "XXX";
4997
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
4998
    $dbh->do("
4999
        INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type)
5000
        VALUES('uploadPath','','Sets the upload path for the upload.pl plugin','','');
5001
    ");
5002
5003
    $dbh->do("
5004
        CREATE TABLE uploaded_files (
5005
            id CHAR(40) NOT NULL PRIMARY KEY,
5006
            filename TEXT NOT NULL,
5007
            dir TEXT NOT NULL
5008
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5009
    ");
5010
5011
    print "Upgrade to $DBversion done (New cataloging plugin upload.pl)\n";
5012
    print "This plugin comes with a new syspref (uploadPath) and a new table (uploaded_files)\n";
5013
    print "To use it, set 'uploadPath' and 'OPACBaseURL' system preferences and link this plugin to a subfield (856\$u for instance)\n";
5014
    SetVersion($DBversion);
5015
}
5016
5017
4997
=head1 FUNCTIONS
5018
=head1 FUNCTIONS
4998
5019
4999
=head2 DropAllForeignKeys($table)
5020
=head2 DropAllForeignKeys($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref (+4 lines)
Lines 90-95 Cataloging: Link Here
90
                  annual: generated in the form &lt;year&gt;-0001, &lt;year&gt;-0002.
90
                  annual: generated in the form &lt;year&gt;-0001, &lt;year&gt;-0002.
91
                  hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
91
                  hbyymmincr: generated in the form &lt;branchcode&gt;yymm0001.
92
                  "OFF": not generated automatically.
92
                  "OFF": not generated automatically.
93
        -
94
            - Absolute path where to store files uploaded in MARC record (plugin upload.pl)
95
            - pref: uploadPath
96
              class: multi
93
    Display:
97
    Display:
94
        -
98
        -
95
            - 'Separate multiple displayed authors, series or subjects with '
99
            - 'Separate multiple displayed authors, series or subjects with '
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload.tt (+71 lines)
Line 0 Link Here
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
    <title>Upload plugin</title>
6
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
    <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
8
    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" />
9
10
</head>
11
<body>
12
[% IF ( success ) %]
13
14
    <script type="text/javascript">
15
        function report() {
16
            var doc   = opener.document;
17
            var field = doc.getElementById("[% index %]");
18
            field.value =  "[% return %]";
19
        }
20
        $(document).ready(function() {
21
            report();
22
        });
23
    </script>
24
25
26
    The file [% uploaded_file | html %] has been successfully uploaded.
27
    <p><input type="button" value="close" onclick="window.close();" /></p>
28
29
[% ELSE %]
30
31
    [% IF ( error ) %]
32
        <p>Error: Failed to upload file. See logs for details.</p>
33
        <input type="button" value="close" onclick="window.close();" />
34
    [% ELSE %]
35
        [%# This block display recursively a directory tree in variable 'dirs' %]
36
        [% BLOCK list_dirs %]
37
            [% IF dirs.size %]
38
                <ul>
39
                    [% FOREACH dir IN dirs %]
40
                        <li style="list-style-type:none">
41
                            <input type="radio" name="dir" id="[% dir.value %]" value="[% dir.value %]">
42
                                <label for="[% dir.value %]">
43
                                    [% IF (dir.name == '/') %]
44
                                        <em>(root)</em>
45
                                    [% ELSE %]
46
                                        [% dir.name %]
47
                                    [% END %]
48
                                </label>
49
                            </input>
50
                            [% INCLUDE list_dirs dirs=dir.dirs %]
51
                        </li>
52
                    [% END %]
53
                </ul>
54
            [% END %]
55
        [% END %]
56
57
        <h2>Please select the file to upload : </h2>
58
        <form method="post" enctype="multipart/form-data" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl">
59
            [% filefield %]
60
            <h3>Choose where to upload file</h3>
61
            [% INCLUDE list_dirs dirs = dirs_tree %]
62
            <input type="hidden" name="plugin_name" value="upload.pl" />
63
            <input type="hidden" name="index" value="[% index %]" />
64
            <input type="submit">
65
        </form>
66
    [% END %]
67
68
[% END %]
69
70
</body>
71
</html>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/upload_delete_file.tt (+49 lines)
Line 0 Link Here
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml">
4
<head>
5
    <title>Upload plugin</title>
6
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
    <script type="text/javascript" src="[% themelang %]/lib/jquery/jquery.js"></script>
8
    <link rel="stylesheet" type="text/css" href="[% themelang %]/css/staff-global.css" />
9
10
</head>
11
<body>
12
[% IF ( success ) %]
13
14
    <script type="text/javascript">
15
        function report() {
16
            var doc   = opener.document;
17
            var field = doc.getElementById("[% index %]");
18
            field.value =  "";
19
        }
20
        $(document).ready(function() {
21
            report();
22
        });
23
    </script>
24
25
    The file has been successfully deleted.
26
    <p><input type="button" value="close" onclick="window.close();" /></p>
27
28
[% ELSE %]
29
30
    [% IF ( error ) %]
31
        Error: Unable to delete the file.
32
        <p><input type="button" value="close" onclick="window.close();" /></p>
33
    [% ELSE %]
34
        <h2>File deletion</h2>
35
        <p>A file has already been uploaded for this field. Do you want to delete it?</p>
36
        <form method="post" action="/cgi-bin/koha/cataloguing/plugin_launcher.pl">
37
        <input type="hidden" name="plugin_name" value="upload.pl" />
38
        <input type="hidden" name="delete" value="delete" />
39
        <input type="hidden" name="id" value="[% id %]" />
40
        <input type="hidden" name="index" value="[% index %]" />
41
        <input type="button" value="Cancel" onclick="javascript:window.close();" />
42
        <input type="submit" value="Delete" />
43
        </form>
44
    [% END %]
45
46
[% END %]
47
48
</body>
49
</html>
(-)a/opac/opac-basket.pl (-1 / +1 lines)
Lines 67-73 foreach my $biblionumber ( @bibs ) { Link Here
67
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
67
    my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
68
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
68
    my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
69
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
69
    my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
70
    my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
70
    my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, GetFrameworkCode($biblionumber));
71
    my @items            = &GetItemsLocationInfo( $biblionumber );
71
    my @items            = &GetItemsLocationInfo( $biblionumber );
72
    my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
72
    my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
73
73
(-)a/opac/opac-detail.pl (-1 / +1 lines)
Lines 540-546 my $marcisbnsarray = GetMarcISBN ($record,$marcflavour); Link Here
540
my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour);
540
my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour);
541
my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour);
541
my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour);
542
my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
542
my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
543
my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
543
my $marcurlsarray    = GetMarcUrls    ($record, $marcflavour, $dat->{'frameworkcode'});
544
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
544
my $marchostsarray  = GetMarcHosts($record,$marcflavour);
545
my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
545
my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
546
546
(-)a/opac/opac-retrieve-file.pl (-1 / +49 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# Copyright 2011-2012 BibLibre
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
use CGI;
22
23
use C4::Context;
24
use C4::UploadedFiles;
25
26
my $input = new CGI;
27
28
my $id = $input->param('id');
29
my $file = C4::UploadedFiles::GetUploadedFile($id);
30
exit 1 if not $file;
31
32
my $upload_path = C4::Context->preference("uploadPath");
33
my $file_path = "$upload_path/$file->{dir}/$file->{filename}";
34
$file_path =~ s#/+#/#;
35
36
if( -f $file_path ) {
37
    open FH, '<', $file_path or die "Can't open file: $!";
38
    print $input->header(
39
        -type => "application/octet-stream",
40
        -attachment => $file->{filename}
41
    );
42
    while(<FH>) {
43
        print $_;
44
    }
45
} else {
46
    exit 1;
47
}
48
49
exit 0;

Return to bug 6874