version 1.89, 2008/11/07 18:58:06
|
version 1.105, 2010/04/20 23:59:53
|
Line 26
|
Line 26
|
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::easyresponse |
|
|
|
=head1 SYNOPSIS |
|
|
|
Handler to evaluate essay (ungraded) style responses. |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
=head2 Subroutines |
|
|
|
=cut |
|
|
|
package Apache::essayresponse; |
package Apache::essayresponse; |
use strict; |
use strict; |
use Apache::lonxml(); |
use Apache::lonxml(); |
Line 68 sub start_essayresponse {
|
Line 51 sub start_essayresponse {
|
my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"'); |
my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"'); |
my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); |
my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); |
$uploadedfiletypes=~s/[^\w\,]//g; |
$uploadedfiletypes=~s/[^\w\,]//g; |
if ( $Apache::lonhomework::type eq 'survey' ) { |
my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize"); |
|
if (!defined($maxfilesize)) { |
|
$maxfilesize = 10.0; #FIXME This should become a domain configuration |
|
} |
|
if (($Apache::lonhomework::type eq 'survey') || |
|
($Apache::lonhomework::type eq 'surveycred') || |
|
($Apache::lonhomework::type eq 'anonsurvey') || |
|
($Apache::lonhomework::type eq 'anonsurveycred')) { |
$result.= '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" /> '; |
$result.= '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" /> '; |
} |
} |
$result.='<br /><table border="1">'; |
$result.='<br /><table border="1">'; |
if ( $Apache::lonhomework::type ne 'survey' ) { |
if (($Apache::lonhomework::type ne 'survey') && |
|
($Apache::lonhomework::type ne 'surveycred') && |
|
($Apache::lonhomework::type ne 'anonsurvey') && |
|
($Apache::lonhomework::type ne 'anonsurveycred')) { |
$result.= '<tr><td>'. |
$result.= '<tr><td>'. |
'<label>'. |
'<label>'. |
'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="yes" checked="checked" /> '. |
'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="yes" checked="checked" /> '. |
Line 80 sub start_essayresponse {
|
Line 73 sub start_essayresponse {
|
'</label> <br />'. |
'</label> <br />'. |
'<label>'. |
'<label>'. |
'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="no" /> '. |
'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="no" /> '. |
&mt('Save entries below as a draft answer (not submitting them for credit yet)'). |
&mt('Save entries below (not submitted for credit yet)'). |
'</label>'. |
'</label>'. |
'</td></tr>'; |
'</td></tr>'; |
} |
} |
Line 97 sub start_essayresponse {
|
Line 90 sub start_essayresponse {
|
$result .= &check_collaborators($ncol,$coll) if ($coll =~ /\w+/); |
$result .= &check_collaborators($ncol,$coll) if ($coll =~ /\w+/); |
$result .='</td></tr>'; |
$result .='</td></tr>'; |
} |
} |
$result.=&Apache::inputtags::file_selector($part,$id, |
my $filesfrom = 'both'; |
$uploadedfiletypes,'both'); |
my $stuname = &Apache::lonnet::EXT('user.name'); |
|
my $studom = &Apache::lonnet::EXT('user.domain'); |
|
if (!&Apache::lonnet::usertools_access($stuname,$studom,'portfolio')) { |
|
$filesfrom = 'uploadonly'; |
|
} |
|
$result.=&Apache::inputtags::file_selector($part,$id,$uploadedfiletypes, |
|
$filesfrom,undef,$maxfilesize); |
$result.='</table>'; |
$result.='</table>'; |
} elsif ($target eq 'web' && |
} elsif ($target eq 'web' && |
$Apache::inputtags::status[-1] ne 'CAN_ANSWER') { |
$Apache::inputtags::status[-1] ne 'CAN_ANSWER') { |
Line 147 sub end_essayresponse {
|
Line 146 sub end_essayresponse {
|
$increment=&Apache::response::scored_response($part,$id); |
$increment=&Apache::response::scored_response($part,$id); |
} elsif ( &Apache::response::submitted() ) { |
} elsif ( &Apache::response::submitted() ) { |
my $response = $env{'form.HWVAL_'.$id}; |
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}; |
my $portfiles = $env{'form.HWPORT'.$part.'_'.$id}; |
if (( $response =~ /[^\s]/) || ($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/)) { |
if (( $response =~ /[^\s]/) || ($filename =~ /[^\s]/) || ($portfiles =~ /[^\s]/)) { |
my $award='DRAFT'; |
my $award='DRAFT'; |
if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') { |
if ($env{'form.HWDRAFT'.$part.'_'.$id} eq 'yes') { |
$award='SUBMITTED'; |
if ($Apache::lonhomework::type eq 'anonsurvey') { |
|
$award='ANONYMOUS'; |
|
} elsif ($Apache::lonhomework::type eq 'anonsurveycred') { |
|
$award='ANONYMOUS_CREDIT'; |
|
} elsif ($Apache::lonhomework::type eq 'surveycred') { |
|
$award='SUBMITTED_CREDIT'; |
|
} else { |
|
$award='SUBMITTED'; |
|
} |
} |
} |
my $uploadedflag=0; |
my $uploadedflag=0; |
&file_submission($part,$id,'filename',\$award,\$uploadedflag); |
my $totalsize=0; |
&file_submission($part,$id,'portfiles',\$award,\$uploadedflag); |
&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.submission"}=$response; |
$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award; |
$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$award; |
my %previous=&Apache::response::check_for_previous($response,$part,$id); |
my %previous=&Apache::response::check_for_previous($response,$part,$id); |
Line 208 sub end_essayresponse {
|
Line 217 sub end_essayresponse {
|
|
|
if ($target eq 'analyze') { |
if ($target eq 'analyze') { |
$Apache::lonhomework::analyze{"$part.$id.type"} = 'essayresponse'; |
$Apache::lonhomework::analyze{"$part.$id.type"} = 'essayresponse'; |
|
push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id"); |
&Apache::lonhomework::set_bubble_lines(); |
&Apache::lonhomework::set_bubble_lines(); |
} |
} |
} |
} |
Line 247 sub format_prior_response {
|
Line 257 sub format_prior_response {
|
} |
} |
|
|
sub file_submission { |
sub file_submission { |
my ($part,$id,$which,$award,$uploadedflag)=@_; |
my ($part,$id,$which,$award,$uploadedflag,$totalsize)=@_; |
my $files; |
my $files; |
my $jspart=$part; |
my $jspart=$part; |
$jspart=~s/\./_/g; |
$jspart=~s/\./_/g; |
if ($which eq 'portfiles') { $files= $env{'form.HWPORT'.$jspart.'_'.$id}; } |
if ($which eq 'portfiles') { |
if ($which eq 'filename') { |
$files= $env{'form.HWPORT'.$jspart.'_'.$id}; |
$files = $env{'form.HWFILE'.$jspart.'_'.$id.'.filename'}; |
} 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]/) { |
if ($files =~ /[^\s]/) { |
$files =~s/,$//; |
$files =~s/,$//; |
$Apache::lonhomework::results{"resource.$part.$id.$which"}=$files; |
my (@submitted_files,@acceptable_files,@accepted_files); |
|
if ($which eq 'portfiles') { |
my @submitted_files = ($files); |
@submitted_files = split(/\s*,\s*/,$files); |
if ( $which eq 'portfiles' ) { |
} else { |
@submitted_files = split(/\s*,\s*/,$files); |
@submitted_files = ($files); |
} |
} |
|
my $uploadedfiletypes= |
my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); |
&Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes"); |
if ($uploadedfiletypes) { |
if ($uploadedfiletypes ne '') { |
$uploadedfiletypes=~s/[^\w\,]//g; |
$uploadedfiletypes=~s/[^\w\,]//g; |
$uploadedfiletypes=','.$uploadedfiletypes.','; |
$uploadedfiletypes=','.$uploadedfiletypes.','; |
foreach my $file (@submitted_files) { |
foreach my $file (@submitted_files) { |
my ($extension)=($file=~/\.(\w+)$/); |
my ($extension)=($file=~/\.(\w+)$/); |
unless ($uploadedfiletypes=~/\,\s*\Q$extension\E\s*\,/i) { |
if ($uploadedfiletypes=~/\,\s*\Q$extension\E\s*\,/i) { |
$$award='INVALID_FILETYPE'; |
push(@acceptable_files,$file); |
} |
} else { |
} |
$$award='INVALID_FILETYPE'; |
} |
if ($which eq 'filename') { |
if ($$award ne 'INVALID_FILETYPE' && ref($uploadedflag)) { |
&delete_form_items($jspart,$id); |
|
} |
|
} |
|
} |
|
} else { |
|
@acceptable_files = @submitted_files; |
|
} |
|
my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize"); |
|
if (!$maxfilesize) { |
|
$maxfilesize = 10.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); |
|
$dirlist{$fullpath} = \@list; |
|
} |
|
if (ref($dirlist{$fullpath}) eq 'ARRAY') { |
|
foreach my $dir_line (@{$dirlist{$fullpath}}) { |
|
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; |
|
} |
|
} |
|
} |
|
} |
|
if (ref($totalsize)) { |
|
if ($$totalsize > $maxfilesize) { |
|
$$award='EXCESS_FILESIZE'; |
|
if ($which eq 'filename') { |
|
&delete_form_items($jspart,$id); |
|
} |
|
last; |
|
} else { |
|
push(@accepted_files,$file); |
|
} |
|
} else { |
|
push(@accepted_files,$file); |
|
} |
|
} |
|
$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; |
$$uploadedflag=1; |
} |
} |
if ($$award ne 'INVALID_FILETYPE' && $which eq 'portfiles') { |
my ($symb,$crsid,$domain,$name)=&Apache::lonnet::whichuser(); |
my ($symb,$crsid,$domain,$name)=&Apache::lonnet::whichuser(); |
if ($which eq 'portfiles') { |
&Apache::lonnet::unmark_as_readonly($domain,$name,[$symb,$crsid]); |
&Apache::lonnet::unmark_as_readonly($domain,$name,[$symb,$crsid]); |
&Apache::lonnet::mark_as_readonly($domain,$name,\@submitted_files,[$symb,$crsid]); |
&Apache::lonnet::mark_as_readonly($domain,$name,\@submitted_files,[$symb,$crsid]); |
&Apache::lonnet::clear_selected_files($name); |
&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"}= |
$Apache::lonhomework::results{"resource.$part.$id.uploadedfile"}= |
$files; |
$files; |
|
my $cleanpart = $part; |
|
$cleanpart =~ s/\W/_/g; |
|
my $cleanid = $id; |
|
$cleanid =~ s/\W/_/g; |
|
my ($map,$resid,$res)=&Apache::lonnet::decode_symb($symb); |
|
my $container; |
|
if ($map =~ /^uploaded/) { |
|
(my $prefix,$container) = ($map =~ m{^uploaded/[^/]+/[^/]+/(default|supplemental)_?([^.]*)\.(?:sequence|page)$}); |
|
if (length($container) > 10) { |
|
$container = substr($container,-10,10); |
|
} |
|
if ($container ne '') { |
|
$container = $prefix.'_'.$container; |
|
} else { |
|
$container = $prefix; |
|
} |
|
} else { |
|
($container) = ($map =~ m{(.+)\.(?:sequence|page)$}); |
|
$container =~ s/\W/_/g; |
|
if (length($container) > 255) { |
|
$container = substr($container,0,254); |
|
} |
|
} |
|
my $subdir = 'essayresponse'; |
|
my %crsdesc = &Apache::lonnet::coursedescription($crsid); |
|
foreach my $item ($crsdesc{'domain'},$crsdesc{'num'},$container,$resid,$cleanpart,$cleanid) { |
|
if ($item ne '') { |
|
$subdir .= '/'.$item; |
|
} |
|
} |
$Apache::lonhomework::results{"resource.$part.$id.uploadedurl"}= |
$Apache::lonhomework::results{"resource.$part.$id.uploadedurl"}= |
&Apache::lonnet::userfileupload('HWFILE'.$jspart.'_'.$id,undef, |
&Apache::lonnet::userfileupload('HWFILE'.$jspart.'_'.$id,undef, |
'essayresponse'); |
$subdir); |
|
delete($env{'form.HWFILE'.$jspart.'_'.$id}); |
} |
} |
} elsif ($which eq 'portfiles' && |
} elsif ($which eq 'portfiles' && |
$Apache::lonhomework::history{"resource.$part.$id.$which"}) { |
$Apache::lonhomework::history{"resource.$part.$id.$which"}) { |
Line 300 sub file_submission {
|
Line 404 sub file_submission {
|
} |
} |
} |
} |
|
|
|
sub delete_form_items { |
|
my ($jspart,$id) = @_; |
|
delete($env{'form.HWFILE'.$jspart.'_'.$id.'.filename'}); |
|
delete($env{'form.HWFILE'.$jspart.'_'.$id.'.mimetype'}); |
|
delete($env{'form.HWFILE'.$jspart.'_'.$id}); |
|
} |
|
|
|
|
sub check_collaborators { |
sub check_collaborators { |
my ($ncol,$coll) = @_; |
my ($ncol,$coll) = @_; |
my %classlist=&Apache::lonnet::dump('classlist', |
my %classlist=&Apache::lonnet::dump('classlist', |
Line 349 sub check_collaborators {
|
Line 461 sub check_collaborators {
|
|
|
1; |
1; |
__END__ |
__END__ |
|
|
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::easyresponse |
|
|
|
=head1 SYNOPSIS |
|
|
|
Handler to evaluate essay (ungraded) style responses. |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
=head1 SUBROUTINES |
|
|
|
=over |
|
|
|
=item start_essayresponse() |
|
|
|
=item end_essayresponse() |
|
|
|
=item format_prior_response() |
|
|
|
=item file_submission() |
|
|
|
=item delete_form_items() |
|
|
|
=item check_collaborators() |
|
|
|
=back |
|
|
|
=cut |