adding a pre-check for patronimages/ dir, which won't be there by
[koha.git] / tools / picture-upload.pl
1 #!/usr/bin/perl
2
3 use File::Temp;
4 use File::Copy;
5 use CGI;
6 use C4::Context;
7 use C4::Auth;
8 use C4::Output;
9
10 #my $destdir = "/usr/local/koha/intranet/htdocs/intranet-tmpl/images/patronpictures";
11 #my $uploadfile = shift @ARGV;
12 my $input = new CGI;
13 my $destdir = C4::Context->config('intrahtdocs') . "/patronimages";
14
15 warn "DEST : $destdir";
16 my ($template, $loggedinuser, $cookie)
17         = get_template_and_user({template_name => "tools/picture-upload.tmpl",
18                                         query => $input,
19                                         type => "intranet",
20                                         authnotrequired => 0,
21                                         flagsrequired => {management => 1, tools => 1},
22                                         debug => 0,
23                                         });
24
25 unless (-d $destdir) {
26         $errors{'NODIR'} = 1;
27         warn "patronimages directory not present";
28 }
29 if ( %errors ) {
30     $template->param( ERRORS => [ \%errors ] );
31 }
32 my $uploadfilename = $input->param( 'uploadfile' );
33 my $uploadfile = $input->upload( 'uploadfile' );
34 my ( $total, $handled, @counts );
35
36 if ( $uploadfile ) {
37     my $dirname = File::Temp::tempdir( CLEANUP => 1);
38     my ( $tfh, $tempfile ) = File::Temp::tempfile( SUFFIX => '.zip', UNLINK => 1 );
39     my ( @directories, %errors );
40
41     $errors{'NOTZIP'} = 1 unless ( $uploadfilename =~ /\.zip$/i );
42     $errors{'NOWRITETEMP'} = 1 unless ( -w "$dirname" );
43     $errors{'NOWRITEDEST'} = 1 unless ( -w "$destdir" );
44     $errors{'EMPTYUPLOAD'} = 1 unless ( length( $uploadfile ) > 0 );
45
46     if ( %errors ) {
47         $template->param( ERRORS => [ \%errors ] );
48     } else {
49         while ( <$uploadfile> ) {
50             print $tfh $_;
51         }
52
53         close $tfh;
54
55         `unzip $tempfile -d $dirname`;
56
57         push @directories, "$dirname";
58         foreach $recursive_dir ( @directories ) {
59             opendir $dir, $recursive_dir;
60             while ( my $entry = readdir $dir ) {
61                 push @directories, "$recursive_dir/$entry" if ( -d "$recursive_dir/$entry" and $entry !~ /^\./ );
62             }
63             closedir $dir;
64         }
65
66         foreach my $dir ( @directories ) {
67             $handled += handle_dir( $dir );
68         }
69
70         $total = scalar @directories;
71
72         $template->param(
73                          TOTAL => $total,
74                          HANDLED => $handled,
75                          COUNTS => \@counts,
76                          );
77     }
78 }
79
80 output_html_with_http_headers $input, $cookie, $template->output;
81
82
83 sub handle_dir {
84     my ( $dir ) = @_;
85     my ( %count );
86     $count{filenames} = ();
87
88     return 0 unless ( -r "$dir/IDLINK.TXT" or -r "$dir/DATALINK.TXT" );
89
90     my $file = ( -r "$dir/IDLINK.TXT" ) ? "$dir/IDLINK.TXT" : "$dir/DATALINK.TXT";
91
92     open $fh, $file or { print "Openning $dir/$filename failed!\n" and return 0 };
93
94     while (my $line = <$fh>) {
95         chomp $line;
96
97         my ( $filename, $cardnumber );
98
99         my $delim = ($line =~ /\t/) ? "\t" : ",";
100
101         ($cardnumber, $filename) = split $delim, $line;
102         $cardnumber =~ s/[\"\r\n]//g;  # remove offensive characters
103         $filename =~ s/[\"\r\n]//g;
104
105         if ($cardnumber && $filename) {
106             my $result = move ( "$dir/$filename", "$destdir/$cardnumber.jpg" );
107             if ( $result ) {
108                 $count{count}++;
109                 push @{ $count{filenames} }, { source => $filename, dest => $cardnumber .".jpg" };
110             }
111         }
112     }
113     $count{source} = $dir;
114     $count{dest} = $destdir;
115     push @counts, \%count;
116
117     close $fh;
118
119     return 1;
120 }