Diff for /loncom/interface/multidownload.pl between versions 1.33 and 1.41

version 1.33, 2007/05/23 19:31:21 version 1.41, 2017/11/05 18:19:41
Line 31  use LONCAPA::loncgi; Line 31  use LONCAPA::loncgi;
 use File::Path;  use File::Path;
 use File::Basename;  use File::Basename;
 use File::Copy;  use File::Copy;
 use IO::File;  use Archive::Zip qw( :ERROR_CODES );
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonnavmaps;  use Apache::lonnavmaps();
 use Apache::lonnet;  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
 use Apache::lonnet;  use Apache::lonnet;
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
   use LONCAPA;
 use strict;  use strict;
   
 sub is_flat {  sub is_flat {
Line 57  sub is_flat { Line 57  sub is_flat {
     }      }
     return ($flat_part, $flat_resp);      return ($flat_part, $flat_resp);
 }  }
   
   
 sub get_part_resp_path {  sub get_part_resp_path {
     my ($flat_part, $flat_resp, $part_id, $resp_id) = @_;      my ($flat_part, $flat_resp, $part_id, $resp_id) = @_;
     my $part_resp_path = "";      my $part_resp_path = "";
Line 69  sub get_part_resp_path { Line 71  sub get_part_resp_path {
     $part_resp_path =~ s/\/^//;       $part_resp_path =~ s/\/^//; 
     return('/'.$part_resp_path);      return('/'.$part_resp_path);
 }  }
 $|=1;  
 if (! &LONCAPA::loncgi::check_cookie_and_load_env()) {  
     print <<END;  
 Content-type: text/html  
   
 <html>  
 <head><title>Bad Cookie</title></head>  $|=1;
 <body>  
 Your cookie information is incorrect.  
 </body>  
 </html>  
 END  
     return;  
 }  
 &Apache::lonlocal::get_language_handle();  &Apache::lonlocal::get_language_handle();
 &Apache::loncommon::content_type(undef,'text/html');  &Apache::loncommon::content_type(undef,'text/html');
 my $identifier = $ENV{'QUERY_STRING'};  my ($nocookie,$identifier,$unique_path,$scope,$unique_user);
 my $unique_path = $identifier.time();  if (! &LONCAPA::loncgi::check_cookie_and_load_env()) {
 print(&Apache::loncommon::start_page('Multiple Downloads'));      print(&LONCAPA::loncgi::missing_cookie_msg());
           $nocookie = 1;
   
 my $scope = $env{'request.course.id'};  
 if ($env{'request.course.sec'}) {  
     $scope .= '/'.$env{'request.course.sec'};  
 }  }
 if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {  
   unless ($nocookie) {
       $scope = $env{'request.course.id'};
       if ($env{'request.course.sec'}) {
           $scope .= '/'.$env{'request.course.sec'};
       }
       if ($ENV{'QUERY_STRING'} =~ /^\d+_\d+_\d+$/) {
           $identifier = $ENV{'QUERY_STRING'};
           $unique_path = $identifier.time();
       }
       if (($env{'user.name'} =~ /^$LONCAPA::match_username$/) &&
           ($env{'user.domain'} =~ /^$LONCAPA::match_domain$/)) {
           $unique_user = $env{'user.name'}.':'.$env{'user.domain'};
       }
       print(&Apache::loncommon::start_page('Multiple Downloads'));
   }
   if ($scope eq '') {
       print(&mt('Invalid course context: you need to reselect your course role.'));
   } elsif ($identifier eq '') {
       unless ($nocookie) {
           if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {
               print(&mt('Invalid query string; unable to download submissions.'));
           } else {
               print(&mt('You are not authorized to download student submissions.'));
           }
       }
   } elsif ($unique_user eq '') {
       unless ($nocookie) {
           if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {
               print(&mt('Characters in your username and/or domain prevent download of submissions.'));
           } else {
               print(&mt('You are not authorized to download student submissions.'));
           }
       }
   } elsif (&Apache::lonnet::allowed('vgr',$scope) eq 'F') {
     my $symb = $env{'cgi.'.$identifier.'.symb'};      my $symb = $env{'cgi.'.$identifier.'.symb'};
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     my $res = $navmap->getBySymb($symb);      my $res = $navmap->getBySymb($symb);
Line 102  if (&Apache::lonnet::allowed('vgr',$scop Line 123  if (&Apache::lonnet::allowed('vgr',$scop
     my ($flat_part, $flat_resp) = &is_flat($partlist, $res);      my ($flat_part, $flat_resp) = &is_flat($partlist, $res);
     my ($zipout) = ($symb =~ /^.*\/(.+)\.problem$/);      my ($zipout) = ($symb =~ /^.*\/(.+)\.problem$/);
     $zipout =~ s/\s/_/g;      $zipout =~ s/\s/_/g;
       $zipout =~ s/[^\w.\-]+//g;
     $zipout .= "$identifier.zip";      $zipout .= "$identifier.zip";
     my $courseid = $env{'request.course.id'};      my $courseid = $env{'request.course.id'};
     my @stuchecked = split(/\n/,$env{'cgi.'.$identifier.'.students'});      my @stuchecked = split(/\n/,$env{'cgi.'.$identifier.'.students'});
     my $number_of_students = scalar(@stuchecked);      my $number_of_students = scalar(@stuchecked);
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Processing Status',      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('',$number_of_students);
                                                     'Preparing Zip File',$number_of_students,'inline','80');  
     my @parts = split(/\n/,$env{'cgi.'.$identifier.'.parts'});      my @parts = split(/\n/,$env{'cgi.'.$identifier.'.parts'});
     my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'};      my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'};
     my $uname = $env{'user.name'};      my $manifest;
     my $udom = $env{'user.domain'};      unless (-d "$doc_zip_root/zipdir/$unique_user/$unique_path") {
     my $unique_user = $uname.":".$udom;          &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);
     &mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);      }
     if (!open(MANIFEST, ">$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) {      if (open(MANIFEST, ">$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) {
           $manifest = 1;
           print MANIFEST (&mt("Zip file generated on [_1]",&Apache::lonlocal::locallocaltime(time()))."\n");
           print MANIFEST (&mt("Course: [_1]",$env{"course.$courseid.description"})."\n");
           print MANIFEST (&mt("Problem: [_1]",$res->compTitle)."\n");
           print MANIFEST (&mt("Files contained in this zip:")."\n");
       } else {
         &Apache::lonnet::logthis("Problem making manifest");          &Apache::lonnet::logthis("Problem making manifest");
     }      }
     print MANIFEST (&mt("Zip file generated on [_1]",&Apache::lonlocal::locallocaltime(time()))."\n");  
     print MANIFEST (&mt("Course: [_1]",$env{"course.$courseid.description"})."\n");  
     print MANIFEST (&mt("Problem: [_1]",$res->compTitle)."\n");  
     print MANIFEST (&mt("Files contained in this zip:\n"));  
     my $file_problem = 0;      my $file_problem = 0;
     my $current_student = 0;      my $current_student = 0;
     foreach my $stu (@stuchecked) {      foreach my $stu (@stuchecked) {
         $current_student ++;          $current_student ++;
         &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,"Processing student $current_student of $number_of_students");          &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,&mt("Processing student [_1] of [_2]",$current_student,$number_of_students));
         my %files_saved;          my %files_saved;
         my ($stuname,$studom,$fullname) = split(/:/,$stu);          my ($stuname,$studom,$fullname) = split(/:/,$stu);
         my %record = &Apache::lonnet::restore($symb,$courseid,$studom,$stuname);          my %record = &Apache::lonnet::restore($symb,$courseid,$studom,$stuname);
         my $file_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio';          my $port_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio';
         print MANIFEST ($fullname."\n");          if ($manifest) {
               print MANIFEST ($fullname."\n");
           }
            
         my $submission_count = 0;          my $submission_count = 0;
         foreach my $partid (@$partlist) {          foreach my $partid (@$partlist) {
             my @ids = $res->responseIds($partid);              my @ids = $res->responseIds($partid);
             foreach my $respid(@ids) {              foreach my $respid (@ids) {
                 my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid);                  my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid);
                 &mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);                  &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);
                 foreach my $file (split(',',$record{"resource.$partid.$respid.portfiles"})) {                  foreach my $origin ('portfiles','uploadedurl') {
                     $file = $file_url.$file;                      my @files;
                     my ($file_name_only) = ($file =~ /^.*\/(.+$)/);                      if ($record{"resource.$partid.$respid.$origin"} ne '') {
                     print MANIFEST ("\t$file_name_only \n");                          if ($origin eq 'portfiles') {
                     $submission_count ++;                              @files = (split(',',$record{"resource.$partid.$respid.$origin"}));
                     &Apache::lonnet::repcopy($file);                          } else {
                     my $source = &Apache::lonnet::filelocation("",$file);                              @files = ($record{"resource.$partid.$respid.$origin"});
                     my $destination = "$doc_zip_root/zipdir/$unique_user/$unique_path/$stuname$part_resp_path/$file_name_only";                          }
                     if (exists($files_saved{$destination})) {  
                         # file has already been saved once  
                         my ($file_name,$file_ext) = ($destination =~ /(^.*)(\..+$)/);  
                         $destination = $file_name.$files_saved{$destination}.$file_ext;  
                         $files_saved{$destination} ++;  
                     }                      }
                     $files_saved{$destination}++;                      foreach my $file (@files) {
                     if (!&copy($source,$destination)) {                          if ($origin eq 'portfiles') { 
                         if (!$file_problem) {                              $file = $port_url.$file;
                             print(&mt("Unable to create: <br />"));                          }
                             $file_problem = 1;                          my ($file_name_only) = ($file =~ m{.*/([^/]+)$});
                           if ($manifest) {
                               print MANIFEST ("\t$file_name_only (".&mt("Part [_1]",$partid).
                                               ") (".&mt("Response [_1]",$respid).")"."\n");
                           }
                           $submission_count ++;
                           &Apache::lonnet::repcopy($file);
                           my $source = &Apache::lonnet::filelocation("",$file);
                           my $destination = "$doc_zip_root/zipdir/$unique_user/$unique_path/$stuname$part_resp_path/$file_name_only";
                           if (exists($files_saved{$destination})) {
                               # file has already been saved once
                               my ($file_name,$file_ext) = 
                                   ($destination =~ /(^.*)(\..+$)/);
                               $destination = $file_name.$files_saved{$destination}.$file_ext;
                               $files_saved{$destination}++;
                           }
                           $files_saved{$destination}++;
                           if (!&copy($source,$destination)) {
                               if (!$file_problem) {
                                   print('<br /><span class="LC_error">'.&mt("Unable to create: ")."</span><br />");
                                   $file_problem = 1;
                               }
                               print('<span class="LC_filename">'."$stuname/part$partid/resp$respid/$file_name_only".'</span><br />');
                         }                          }
                         print("$stuname/part$partid/resp$respid/$file_name_only <br />");  
                     }                      }
                 }                  }
             }              }
         }          }
         if (!$submission_count) {          if ((!$submission_count) && ($manifest)) {
             print MANIFEST ("\tNo Files Submitted \n");              print MANIFEST ("\t".&mt("No Files Submitted")."\n");
         }          }
     }      }
           if ($manifest) {
     &mkpath($doc_zip_root."/zipout/$unique_user",0,0700);          close(MANIFEST);
     my $statement;      }
     if (! -e "$doc_zip_root/zipout/$unique_user/$zipout") {      my $madezip;
         $statement = "cd $doc_zip_root/zipdir/$unique_user/$unique_path\n";      unless (-d "$doc_zip_root/zipout/$unique_user") {
         $statement .= "zip -r $doc_zip_root/zipout/$unique_user/$zipout * > /dev/null";          &File::Path::mkpath($doc_zip_root."/zipout/$unique_user",0,0700);
         system($statement);      }
     } else {      if ((-d "$doc_zip_root/zipout/$unique_user") &&
         # should happen only if user reloads page           (-d "$doc_zip_root/zipdir/$unique_user/$unique_path")) {
         &Apache::lonnet::logthis("$zipout is already there");          if (!-e "$doc_zip_root/zipout/$unique_user/$zipout") {
                my $zip = Archive::Zip->new();
                $zip->addTree("$doc_zip_root/zipdir/$unique_user/$unique_path");
                if ($zip->writeToFileNamed("$doc_zip_root/zipout/$unique_user/$zipout") == AZ_OK) {
                    $madezip = 1;
                }
           } else {
               $madezip = 1;
               # should happen only if user reloads page
               &Apache::lonnet::logthis("$zipout is already there");
           }
           &File::Path::remove_tree("$doc_zip_root/zipdir/$unique_user/$unique_path",{ safe => 1, });
     }      }
     $statement = "rm -rf $doc_zip_root/zipdir/$unique_user/$unique_path";  
     system($statement);  
     &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
     print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.      if ($madezip) {
             &mt("Click to download").'</a></p><br />');          print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.
     close(MANIFEST);               &mt("Click to download").'</a></p><br />');
       } else {
           print('<p class="LC_error">'.
                 &mt('Failed to create zip archive of student submissions').
                 '</p>');
       }
 } else {  } else {
     print(&mt('You are not authorized to download student submissions.'));      print('<p class="LC_error">'.
             &mt('You are not authorized to download student submissions.').
             '</p>');
   }
   unless ($nocookie) {
       print(&Apache::loncommon::end_page());
 }  }
 1;  1;
 __END__;  __END__;

Removed from v.1.33  
changed lines
  Added in v.1.41


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.