version 1.3, 2007/04/05 16:18:22
|
version 1.38, 2008/12/30 23:18:24
|
Line 3
|
Line 3
|
# multiple students. |
# multiple students. |
# |
# |
# $Id$ |
# $Id$ |
# |
|
# Copyright Michigan State University Board of Trustees |
# Copyright Michigan State University Board of Trustees |
# |
# |
# This file is part of the LearningOnline Network with CAPA (LON-CAPA). |
# This file is part of the LearningOnline Network with CAPA (LON-CAPA). |
Line 32 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 Image::Magick; |
|
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use Apache::lonnet; |
use Apache::lonnavmaps(); |
use Apache::grades; |
|
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 strict; |
use strict; |
|
|
|
sub is_flat { |
|
my ($partlist, $res) = @_; |
|
my $flat_part = 1; |
|
my $flat_resp = 1; |
|
if (scalar(@$partlist) > 1) { |
|
$flat_part = 0; |
|
} |
|
foreach my $partid (@$partlist) { |
|
my @ids = $res->responseIds($partid); |
|
if (scalar(@ids) > 1 ) { |
|
$flat_resp = 0; |
|
} |
|
} |
|
return ($flat_part, $flat_resp); |
|
} |
|
|
$|=1; |
|
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { |
|
print <<END; |
|
Content-type: text/html |
|
|
|
<html> |
sub get_part_resp_path { |
<head><title>Bad Cookie</title></head> |
my ($flat_part, $flat_resp, $part_id, $resp_id) = @_; |
<body> |
my $part_resp_path = ""; |
Your cookie information is incorrect. |
if (!$flat_part) { |
</body> |
$part_resp_path = "part$part_id/"; |
</html> |
} |
END |
if (!$flat_resp) { |
return; |
$part_resp_path .= "resp$resp_id/"; |
|
} |
|
$part_resp_path =~ s/\/^//; |
|
return('/'.$part_resp_path); |
} |
} |
|
|
|
|
|
$|=1; |
&Apache::lonlocal::get_language_handle(); |
&Apache::lonlocal::get_language_handle(); |
&Apache::loncommon::content_type(undef,'text/html'); |
&Apache::loncommon::content_type(undef,'text/html'); |
|
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { |
|
print(&LONCAPA::loncgi::missing_cookie_msg()); |
|
return; |
|
} |
|
|
my $identifier = $ENV{'QUERY_STRING'}; |
my $identifier = $ENV{'QUERY_STRING'}; |
|
my $unique_path = $identifier.time(); |
print(&Apache::loncommon::start_page('Multiple Downloads')); |
print(&Apache::loncommon::start_page('Multiple Downloads')); |
my $symb = $env{'cgi.'.$identifier.'.symb'}; |
|
my $courseid = $env{'request.course.id'}; |
|
my @stuchecked = split /\n/,$env{'cgi.'.$identifier.'.students'}; |
my $scope = $env{'request.course.id'}; |
my @parts = split /\n/,$env{'cgi.'.$identifier.'.parts'}; |
if ($env{'request.course.sec'}) { |
my ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($symb); |
$scope .= '/'.$env{'request.course.sec'}; |
my @part_response_id = &Apache::grades::flatten_responseType($responseType); |
} |
my $doc_root = $Apache::lonnet::perlvar{'lonDocRoot'}; |
if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') { |
my ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($symb); |
my $symb = $env{'cgi.'.$identifier.'.symb'}; |
mkdir($doc_root."/zipdir",0777); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
foreach my $stu (@stuchecked) { |
my $res = $navmap->getBySymb($symb); |
my ($uname,$udom,$fullname) = split(/:/,$stu); |
my $partlist = $res->parts(); |
mkdir($doc_root."/zipdir/$uname",0777); |
my ($flat_part, $flat_resp) = &is_flat($partlist, $res); |
my %record = &Apache::lonnet::restore($symb,$courseid,$udom,$uname); |
my ($zipout) = ($symb =~ /^.*\/(.+)\.problem$/); |
foreach my $part (@part_response_id) { |
$zipout =~ s/\s/_/g; |
my ($partid,$respid) = @{$part}; |
$zipout .= "$identifier.zip"; |
mkdir($doc_root."/zipdir/$uname/part$partid",0777); |
my $courseid = $env{'request.course.id'}; |
mkdir($doc_root."/zipdir/$uname/part$partid/resp$respid",0777); |
my @stuchecked = split(/\n/,$env{'cgi.'.$identifier.'.students'}); |
my $files = &Apache::grades::get_submitted_files($udom,$uname,$partid,$respid,\%record); |
my $number_of_students = scalar(@stuchecked); |
foreach my $file (@$files) { |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Processing Status', |
$file =~ /(^.*\/)(.+$)/; |
'Preparing Zip File',$number_of_students,'inline','80'); |
my $file_name_only = $2; |
my @parts = split(/\n/,$env{'cgi.'.$identifier.'.parts'}); |
my $file_content = &Apache::lonnet::getfile($file); |
my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'}; |
if (open(my $fh,">$doc_root/zipdir/$uname/part$partid/resp$respid/$file_name_only")) { |
my $uname = $env{'user.name'}; |
print $fh $file_content; |
my $udom = $env{'user.domain'}; |
close $fh; |
my $unique_user = $uname.":".$udom; |
} else { |
&mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700); |
print("problem creating file <br />"); |
if (!open(MANIFEST, ">$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) { |
|
&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 $current_student = 0; |
|
foreach my $stu (@stuchecked) { |
|
$current_student ++; |
|
&Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,"Processing student $current_student of $number_of_students"); |
|
my %files_saved; |
|
my ($stuname,$studom,$fullname) = split(/:/,$stu); |
|
my %record = &Apache::lonnet::restore($symb,$courseid,$studom,$stuname); |
|
my $port_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio'; |
|
print MANIFEST ($fullname."\n"); |
|
|
|
my $submission_count = 0; |
|
foreach my $partid (@$partlist) { |
|
my @ids = $res->responseIds($partid); |
|
foreach my $respid (@ids) { |
|
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); |
|
foreach my $origin ('portfiles','uploadedurl') { |
|
my @files; |
|
if ($record{"resource.$partid.$respid.$origin"} ne '') { |
|
if ($origin eq 'portfiles') { |
|
@files = (split(',',$record{"resource.$partid.$respid.$origin"})); |
|
} else { |
|
@files = ($record{"resource.$partid.$respid.$origin"}); |
|
} |
|
} |
|
foreach my $file (@files) { |
|
if ($origin eq 'portfiles') { |
|
$file = $port_url.$file; |
|
} |
|
my ($file_name_only) = ($file =~ m{.*/([^/]+)$}); |
|
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 (!©($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 />'); |
|
} |
|
} |
|
} |
} |
} |
} |
} |
|
if (!$submission_count) { |
|
print MANIFEST ("\t".&mt("No Files Submitted")."\n"); |
|
} |
|
} |
|
|
|
&mkpath($doc_zip_root."/zipout/$unique_user",0,0700); |
|
my $statement; |
|
if (! -e "$doc_zip_root/zipout/$unique_user/$zipout") { |
|
$statement = "cd $doc_zip_root/zipdir/$unique_user/$unique_path\n"; |
|
$statement .= "zip -r $doc_zip_root/zipout/$unique_user/$zipout * > /dev/null"; |
|
system($statement); |
|
} else { |
|
# should happen only if user reloads page |
|
&Apache::lonnet::logthis("$zipout is already there"); |
} |
} |
|
$statement = "rm -rf $doc_zip_root/zipdir/$unique_user/$unique_path"; |
|
system($statement); |
|
&Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); |
|
print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'. |
|
&mt("Click to download").'</a></p><br />'); |
|
close(MANIFEST); |
|
} else { |
|
print(&mt('You are not authorized to download student submissions.')); |
} |
} |
mkdir($doc_root."/zipout",0777); |
1; |
my $statement = "zip -r $doc_root/zipout/output.zip $doc_root/zipdir/* > /dev/null"; |
__END__; |
system($statement); |
|
$statement = "rm -rf $doc_root/zipdir"; |
|
system($statement); |
|
print('<a href="../zipout/output.zip">Click to download</a>'); |
|
return 1; |
|