version 1.15, 2007/04/26 23:07:34
|
version 1.32, 2007/05/23 19:07:49
|
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 34 use File::Basename;
|
Line 33 use File::Basename;
|
use File::Copy; |
use File::Copy; |
use IO::File; |
use IO::File; |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
|
use Apache::lonnavmaps; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::grades; |
|
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
Line 43 use Apache::lonnet;
|
Line 42 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); |
|
} |
|
sub get_part_resp_path { |
|
my ($flat_part, $flat_resp, $part_id, $resp_id) = @_; |
|
my $part_resp_path = ""; |
|
if (!$flat_part) { |
|
$part_resp_path = "part$part_id/"; |
|
} |
|
if (!$flat_resp) { |
|
$part_resp_path .= "resp$resp_id/"; |
|
} |
|
$part_resp_path =~ s/\/^//; |
|
return('/'.$part_resp_path); |
|
} |
$|=1; |
$|=1; |
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { |
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { |
print <<END; |
print <<END; |
Line 62 END
|
Line 88 END
|
my $identifier = $ENV{'QUERY_STRING'}; |
my $identifier = $ENV{'QUERY_STRING'}; |
my $unique_path = $identifier.time(); |
my $unique_path = $identifier.time(); |
print(&Apache::loncommon::start_page('Multiple Downloads')); |
print(&Apache::loncommon::start_page('Multiple Downloads')); |
|
|
|
|
my $scope = $env{'request.course.id'}; |
my $scope = $env{'request.course.id'}; |
if ($env{'request.course.sec'}) { |
if ($env{'request.course.sec'}) { |
Line 69 if ($env{'request.course.sec'}) {
|
Line 96 if ($env{'request.course.sec'}) {
|
} |
} |
if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') { |
if (&Apache::lonnet::allowed('vgr',$scope) eq 'F') { |
my $symb = $env{'cgi.'.$identifier.'.symb'}; |
my $symb = $env{'cgi.'.$identifier.'.symb'}; |
$symb =~ /^.*\/(.+)\.problem$/; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $zipout = $1.".zip"; |
my $res = $navmap->getBySymb($symb); |
|
my $partlist = $res->parts(); |
|
my ($flat_part, $flat_resp) = &is_flat($partlist, $res); |
|
my ($zipout) = ($symb =~ /^.*\/(.+)\.problem$/); |
$zipout =~ s/\s/_/g; |
$zipout =~ s/\s/_/g; |
|
$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 %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Processing Status', |
|
'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 ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($symb); |
|
my @part_response_id = &Apache::grades::flatten_responseType($responseType); |
|
my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'}; |
my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'}; |
my ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($symb); |
|
my $uname = $env{'user.name'}; |
my $uname = $env{'user.name'}; |
my $udom = $env{'user.domain'}; |
my $udom = $env{'user.domain'}; |
&mkpath($doc_zip_root."/zipdir/$uname$udom/$unique_path",0,0700); |
my $unique_user = $uname.":".$udom; |
|
&mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700); |
|
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 $file_problem = 0; |
|
my $current_student = 0; |
foreach my $stu (@stuchecked) { |
foreach my $stu (@stuchecked) { |
|
$current_student ++; |
|
&Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,"Processing student $current_student of $number_of_students"); |
my %files_saved; |
my %files_saved; |
my $file_increment = 2; |
|
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); |
foreach my $part (@part_response_id) { |
my $file_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio'; |
my ($partid,$respid) = @{$part}; |
print MANIFEST ($fullname."\n"); |
&mkpath($doc_zip_root."/zipdir/$uname$udom/$unique_path/$stuname/part$partid/resp$respid",0,0700); |
foreach my $partid (@$partlist) { |
my $files = &Apache::grades::get_submitted_files($studom,$stuname,$partid,$respid,\%record); |
my @ids = $res->responseIds($partid); |
foreach my $file (@$files) { |
foreach my $respid(@ids) { |
$file =~ /(^.*\/)(.+$)/; |
my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid); |
my $file_name_only = $2; |
&mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700); |
&Apache::lonnet::repcopy($file); |
foreach my $file (split(',',$record{"resource.$partid.$respid.portfiles"})) { |
my $source = &Apache::lonnet::filelocation("",$file); |
$file = $file_url.$file; |
my $destination = "$doc_zip_root/zipdir/$uname$udom/$unique_path/$stuname/part$partid/resp$respid/$file_name_only"; |
my ($file_name_only) = ($file =~ /^.*\/(.+$)/); |
if (exists($files_saved{$destination})) { |
print MANIFEST ("\t$file_name_only \n"); |
# file has already been saved once |
&Apache::lonnet::repcopy($file); |
&Apache::lonnet::logthis("found duplicate file name"); |
my $source = &Apache::lonnet::filelocation("",$file); |
&Apache::lonnet::logthis("destination was $destination"); |
|
$destination =~ /(^.*)(\..+$)/; |
my $destination = "$doc_zip_root/zipdir/$unique_user/$unique_path/$stuname$part_resp_path/$file_name_only"; |
$destination = $1.$file_increment.$2; |
if (exists($files_saved{$destination})) { |
&Apache::lonnet::logthis("destination is $destination"); |
# file has already been saved once |
$file_increment ++; |
my ($file_name,$file_ext) = ($destination =~ /(^.*)(\..+$)/); |
} |
$destination = $file_name.$files_saved{$destination}.$file_ext; |
$files_saved{$destination} = 1; |
$files_saved{$destination} ++; |
if (!©($source,$destination)) { |
} |
if (!$file_problem) { |
$files_saved{$destination}++; |
print &mt("Unable to create: <br />"); |
if (!©($source,$destination)) { |
$file_problem = 1; |
if (!$file_problem) { |
|
print(&mt("Unable to create: <br />")); |
|
$file_problem = 1; |
|
} |
|
print("$stuname/part$partid/resp$respid/$file_name_only <br />"); |
} |
} |
print ("$stuname/part$partid/resp$respid/$file_name_only <br />"); |
|
} |
} |
} |
} |
} |
} |
} |
} |
&mkpath($doc_zip_root."/zipout/$uname$udom",0,0700); |
|
my $statement = "cd $doc_zip_root/zipdir/$uname$udom/$unique_path\n"; |
&mkpath($doc_zip_root."/zipout/$unique_user",0,0700); |
$statement .= "zip -r $doc_zip_root/zipout/$uname$udom/$zipout * > /dev/null"; |
my $statement; |
system($statement); |
if (! -e "$doc_zip_root/zipout/$unique_user/$zipout") { |
$statement = "rm -rf $doc_zip_root/zipdir/$uname$udom/$unique_path"; |
$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); |
system($statement); |
print('<a href="/zipspool/zipout/'.$uname.$udom.'/'.$zipout.'">'. |
&Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); |
&mt("Click to download").'</a><br />'); |
print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'. |
|
&mt("Click to download").'</a></p><br />'); |
|
close(MANIFEST); |
} else { |
} else { |
print(&mt('You are not authorized to download student submissions.')); |
print(&mt('You are not authorized to download student submissions.')); |
} |
} |