--- loncom/homework/essayresponse.pm 2008/11/10 13:18:19 1.90 +++ loncom/homework/essayresponse.pm 2008/11/16 02:46:25 1.91 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # essay (ungraded) style responses # -# $Id: essayresponse.pm,v 1.90 2008/11/10 13:18:19 jms Exp $ +# $Id: essayresponse.pm,v 1.91 2008/11/16 02:46:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -145,7 +145,8 @@ sub end_essayresponse { $increment=&Apache::response::scored_response($part,$id); } elsif ( &Apache::response::submitted() ) { my $response = $env{'form.HWVAL_'.$id}; - my $filename= $env{'form.HWFILE'.$part.'_'.$id.'.filename'}; + my $filename = $env{'form.HWFILE'.$part.'_'.$id.'.filename'} || + $env{'form.HWFILETOOBIG'.$part.'_'.$id}; my $portfiles = $env{'form.HWPORT'.$part.'_'.$id}; if (( $response =~ /[^\s]/) || ($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/)) { my $award='DRAFT'; @@ -153,8 +154,9 @@ sub end_essayresponse { $award='SUBMITTED'; } my $uploadedflag=0; - &file_submission($part,$id,'filename',\$award,\$uploadedflag); - &file_submission($part,$id,'portfiles',\$award,\$uploadedflag); + my $totalsize=0; + &file_submission($part,$id,'filename',\$award,\$uploadedflag,\$totalsize); + &file_submission($part,$id,'portfiles',\$award,\$uploadedflag,\$totalsize); $Apache::lonhomework::results{"resource.$part.$id.submission"}=$response; $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award; my %previous=&Apache::response::check_for_previous($response,$part,$id); @@ -245,50 +247,108 @@ sub format_prior_response { } sub file_submission { - my ($part,$id,$which,$award,$uploadedflag)=@_; + my ($part,$id,$which,$award,$uploadedflag,$totalsize)=@_; my $files; my $jspart=$part; $jspart=~s/\./_/g; - if ($which eq 'portfiles') { $files= $env{'form.HWPORT'.$jspart.'_'.$id}; } - if ($which eq 'filename') { - $files = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'}; + if ($which eq 'portfiles') { + $files= $env{'form.HWPORT'.$jspart.'_'.$id}; + } elsif ($which eq 'filename') { + if ($env{'form.HWFILETOOBIG'.$jspart.'_'.$id} ne '') { + $$award = 'EXCESS_FILESIZE'; + return; + } else { + $files = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'}; + } } - if ($files =~ /[^\s]/) { $files =~s/,$//; - $Apache::lonhomework::results{"resource.$part.$id.$which"}=$files; - - my @submitted_files = ($files); - if ( $which eq 'portfiles' ) { - @submitted_files = split(/\s*,\s*/,$files); - } - + my (@submitted_files,@acceptable_files,@accepted_files); + if ($which eq 'portfiles') { + @submitted_files = split(/\s*,\s*/,$files); + } else { + @submitted_files = ($files); + } + my $uploadedfiletypes= + &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); + if ($uploadedfiletypes) { + $uploadedfiletypes=~s/[^\w\,]//g; + $uploadedfiletypes=','.$uploadedfiletypes.','; + foreach my $file (@submitted_files) { + my ($extension)=($file=~/\.(\w+)$/); + if ($uploadedfiletypes=~/\,\s*\Q$extension\E\s*\,/i) { + push(@acceptable_files,$file); + } else { + $$award='INVALID_FILETYPE'; + if ($which eq 'filename') { + &delete_form_items($jspart,$id); + } + } + } + } + my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize"); + if (!$maxfilesize) { + $maxfilesize = 100.0; #FIXME This should become a domain configuration + } + my %dirlist; + foreach my $file (@acceptable_files) { + if ($which eq 'filename') { + if (ref($totalsize)) { + $$totalsize += $env{'form.HWFILESIZE'.$jspart.'_'.$id}; + } + } else { + my ($symb,$crsid,$udom,$uname) = &Apache::lonnet::whichuser(); + my ($path,$filename) = ($file =~ m{^(.+)/([^/]+)$}); + my $fullpath = '/userfiles/portfolio'.$path; + if (!exists($dirlist{$fullpath})) { + my @list = &Apache::lonnet::dirlist($fullpath,$udom,$uname,1); + foreach my $dir_line (@list) { + my ($fname,$dom,undef,$testdir,undef,undef,undef,undef, + $size,undef,$mtime,undef,undef,undef,$obs,undef) = + split(/\&/,$dir_line,16); + if ($filename eq $fname) { + my $mbsize = $size/(1024.0*1024.0); + if (ref($totalsize)) { + $$totalsize += $mbsize; + } + last; + } + } + $dirlist{$fullpath} = \@list; + } + } + if (ref($totalsize)) { + if ($$totalsize > $maxfilesize) { + $$award='EXCESS_FILESIZE'; + if ($which eq 'filename') { + &delete_form_items($jspart,$id); + } + } + } else { + push(@accepted_files,$file); + } + } my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); - if ($uploadedfiletypes) { - $uploadedfiletypes=~s/[^\w\,]//g; - $uploadedfiletypes=','.$uploadedfiletypes.','; - foreach my $file (@submitted_files) { - my ($extension)=($file=~/\.(\w+)$/); - unless ($uploadedfiletypes=~/\,\s*\Q$extension\E\s*\,/i) { - $$award='INVALID_FILETYPE'; - } - } - } - if ($$award ne 'INVALID_FILETYPE' && ref($uploadedflag)) { + $Apache::lonhomework::results{"resource.$part.$id.$which"}=join(',',@accepted_files); + if (($$award eq 'INVALID_FILETYPE') || ($award eq 'EXCESS_FILESIZE')) { + return; + } + if (ref($uploadedflag)) { $$uploadedflag=1; } - if ($$award ne 'INVALID_FILETYPE' && $which eq 'portfiles') { + if ($which eq 'portfiles') { my ($symb,$crsid,$domain,$name)=&Apache::lonnet::whichuser(); &Apache::lonnet::unmark_as_readonly($domain,$name,[$symb,$crsid]); &Apache::lonnet::mark_as_readonly($domain,$name,\@submitted_files,[$symb,$crsid]); &Apache::lonnet::clear_selected_files($name); } - if ($$award ne 'INVALID_FILETYPE' && $which eq 'filename') { + if ($which eq 'filename') { $Apache::lonhomework::results{"resource.$part.$id.uploadedfile"}= $files; $Apache::lonhomework::results{"resource.$part.$id.uploadedurl"}= &Apache::lonnet::userfileupload('HWFILE'.$jspart.'_'.$id,undef, 'essayresponse'); + &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id}); } } elsif ($which eq 'portfiles' && $Apache::lonhomework::history{"resource.$part.$id.$which"}) { @@ -298,6 +358,14 @@ sub file_submission { } } +sub delete_form_items { + my ($jspart,$id) = @_; + &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id.'.filename'}); + &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id.'.mimetype'}); + &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id}); +} + + sub check_collaborators { my ($ncol,$coll) = @_; my %classlist=&Apache::lonnet::dump('classlist',