version 1.351, 2006/04/11 20:51:46
|
version 1.379, 2006/10/13 21:53:34
|
Line 36 use Apache::lonhtmlcommon;
|
Line 36 use Apache::lonhtmlcommon;
|
use Apache::lonnavmaps; |
use Apache::lonnavmaps; |
use Apache::lonhomework; |
use Apache::lonhomework; |
use Apache::loncoursedata; |
use Apache::loncoursedata; |
use Apache::lonmsg qw(:user_normal_msg); |
use Apache::lonmsg(); |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use String::Similarity; |
use String::Similarity; |
|
use lib '/home/httpd/lib/perl'; |
|
use LONCAPA; |
|
|
use POSIX qw(floor); |
use POSIX qw(floor); |
|
|
my %oldessays=(); |
my %oldessays=(); |
Line 109 sub nameUserString {
|
Line 112 sub nameUserString {
|
#--- Indicate if a response type is coded handgraded or not. --- |
#--- Indicate if a response type is coded handgraded or not. --- |
sub response_type { |
sub response_type { |
my ($symb) = shift; |
my ($symb) = shift; |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
|
my $allkeys = &Apache::lonnet::metadata($url,'keys'); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my %vPart; |
my $res = $navmap->getBySymb($symb); |
foreach my $partid (&Apache::loncommon::get_env_multiple('form.vPart')) { |
my $partlist = $res->parts(); |
$vPart{$partid}=1; |
my (%response_types,%handgrade); |
} |
foreach my $part (@{ $partlist }) { |
my %seen = (); |
my @types = $res->responseType($part); |
my (@partlist,%handgrade,%responseType); |
my @ids = $res->responseIds($part); |
foreach (split(/,/,&Apache::lonnet::metadata($url,'packages'))) { |
for (my $i=0; $i < scalar(@ids); $i++) { |
if (/^\w+response_.*/ || /^Task_/) { |
$response_types{$part}{$ids[$i]} = $types[$i]; |
my ($responsetype,$part) = split(/_/,$_,2); |
$handgrade{$part.'_'.$ids[$i]} = |
my ($partid,$respid) = split(/_/,$part); |
&Apache::lonnet::EXT('resource.'.$part.'_'.$ids[$i]. |
if ($responsetype eq 'Task') { $respid='0'; } |
'.handgrade',$symb); |
if (&Apache::loncommon::check_if_partid_hidden($partid,$symb)) { |
} |
next; |
} |
} |
return ($partlist,\%handgrade,\%response_types); |
if (%vPart && !exists($vPart{$partid})) { |
} |
next; |
|
} |
sub flatten_responseType { |
$responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!! |
my ($responseType) = @_; |
my ($value) = &Apache::lonnet::EXT('resource.'.$part.'.handgrade',$symb); |
my @part_response_id = |
$handgrade{$part} = ($value eq 'yes' ? 'yes' : 'no'); |
map { |
if (!exists($responseType{$partid})) { $responseType{$partid}={}; } |
my $part = $_; |
$responseType{$partid}->{$respid}=$responsetype; |
map { |
next if ($seen{$partid} > 0); |
[$part,$_] |
$seen{$partid}++; |
} sort(keys(%{ $responseType->{$part} })); |
push @partlist,$partid; |
} sort(keys(%$responseType)); |
} |
return @part_response_id; |
} |
|
return (\@partlist,\%handgrade,\%responseType); |
|
} |
} |
|
|
sub get_display_part { |
sub get_display_part { |
Line 165 sub showResourceInfo {
|
Line 166 sub showResourceInfo {
|
my %resptype = (); |
my %resptype = (); |
my $hdgrade='no'; |
my $hdgrade='no'; |
my %partsseen; |
my %partsseen; |
for my $part_resID (sort keys(%$handgrade)) { |
foreach my $partID (sort keys(%$responseType)) { |
my $handgrade=$$handgrade{$part_resID}; |
foreach my $resID (sort keys(%{ $responseType->{$partID} })) { |
my ($partID,$resID) = split(/_/,$part_resID); |
my $handgrade=$$handgrade{$partID.'_'.$resID}; |
my $responsetype = $responseType->{$partID}->{$resID}; |
my $responsetype = $responseType->{$partID}->{$resID}; |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
$result.='<tr>'; |
$result.='<tr>'; |
if ($checkboxes) { |
if ($checkboxes) { |
if (exists($partsseen{$partID})) { |
if (exists($partsseen{$partID})) { |
$result.="<td> </td>"; |
$result.="<td> </td>"; |
} else { |
} else { |
$result.="<td><input type='checkbox' name='vPart' value='$partID' checked='on' /></td>"; |
$result.="<td><input type='checkbox' name='vPart' value='$partID' checked='on' /></td>"; |
|
} |
|
$partsseen{$partID}=1; |
} |
} |
$partsseen{$partID}=1; |
my $display_part=&get_display_part($partID,$symb); |
} |
$result.='<td><b>Part: </b>'.$display_part.' <font color="#999999">'. |
my $display_part=&get_display_part($partID,$symb); |
$resID.'</font></td>'. |
$result.='<td><b>Part: </b>'.$display_part.' <font color="#999999">'. |
'<td><b>Type: </b>'.$responsetype.'</td></tr>'; |
$resID.'</font></td>'. |
|
'<td><b>Type: </b>'.$responsetype.'</td></tr>'; |
|
# '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>'; |
# '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>'; |
|
} |
} |
} |
$result.='</table>'."\n"; |
$result.='</table>'."\n"; |
return $result,$responseType,$hdgrade,$partlist,$handgrade; |
return $result,$responseType,$hdgrade,$partlist,$handgrade; |
Line 586 sub verifyreceipt {
|
Line 588 sub verifyreceipt {
|
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
$env{'form.receipt'}; |
$env{'form.receipt'}; |
$receipt =~ s/[^\-\d]//g; |
$receipt =~ s/[^\-\d]//g; |
my $symb = &Apache::lonnet::symbread(); |
my ($symb) = &get_symb($request); |
|
|
my $title.='<h3><font color="#339933">Verifying Submission Receipt '. |
my $title.='<h3><font color="#339933">Verifying Submission Receipt '. |
$receipt.'</h3></font>'."\n". |
$receipt.'</h3></font>'."\n". |
Line 1535 sub handback_box {
|
Line 1537 sub handback_box {
|
my ($symb,$uname,$udom,$counter,$partid,$record) = @_; |
my ($symb,$uname,$udom,$counter,$partid,$record) = @_; |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my (@respids); |
my (@respids); |
foreach my $part_resp (sort(keys(%$handgrade))) { |
my @part_response_id = &flatten_responseType($responseType); |
my ($part,$resp) = split(/_/,$part_resp); |
foreach my $part_response_id (@part_response_id) { |
|
my ($part,$resp) = @{ $part_response_id }; |
if ($part eq $partid) { |
if ($part eq $partid) { |
push @respids,$resp; |
push(@respids,$resp); |
} |
} |
} |
} |
my $result; |
my $result; |
Line 1548 sub handback_box {
|
Line 1551 sub handback_box {
|
next if (!@$files); |
next if (!@$files); |
my $file_counter = 1; |
my $file_counter = 1; |
foreach my $file (@$files) { |
foreach my $file (@$files) { |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
if ($file =~ /\/portfolio\//) { |
my ($name,$version,$ext) = &file_name_version_ext($file_disp); |
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); |
$file_disp = "$name.$ext"; |
my ($name,$version,$ext) = &file_name_version_ext($file_disp); |
$file = $file_path.$file_disp; |
$file_disp = "$name.$ext"; |
$result.=&mt('Return commented version of [_1] to student.', |
$file = $file_path.$file_disp; |
'<span class="filename">'.$file_disp.'</span>'); |
$result.=&mt('Return commented version of [_1] to student.', |
$result.='<input type="file" name="'.$prefix.'returndoc'.$file_counter.'" />'."\n"; |
'<span class="LC_filename">'.$file_disp.'</span>'); |
$result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />'; |
$result.='<input type="file" name="'.$prefix.'returndoc'.$file_counter.'" />'."\n"; |
$file_counter++; |
$result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />'; |
|
$result.='(File will be uploaded when you click on Save & Next below.)<br />'; |
|
$file_counter++; |
|
} |
} |
} |
} |
} |
return $result; |
return $result; |
Line 1573 sub show_problem {
|
Line 1579 sub show_problem {
|
if ($removeform) { |
if ($removeform) { |
$rendered=~s|<form(.*?)>||g; |
$rendered=~s|<form(.*?)>||g; |
$rendered=~s|</form>||g; |
$rendered=~s|</form>||g; |
$rendered=~s|name="submit"|name="would_have_been_submit"|g; |
$rendered=~s|(<input[^>]*name\s*=\s*"?)(\w+)("?)|$1would_have_been_$2$3|g; |
} |
} |
my $companswer; |
my $companswer; |
if ($mode eq 'both' or $mode eq 'answer') { |
if ($mode eq 'both' or $mode eq 'answer') { |
Line 1747 KEYWORDS
|
Line 1753 KEYWORDS
|
# |
# |
my (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
my (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
my ($adom,$aname,$apath)=($essayurl=~/^(\w+)\/(\w+)\/(.*)$/); |
my ($adom,$aname,$apath)=($essayurl=~/^(\w+)\/(\w+)\/(.*)$/); |
$apath=&Apache::lonnet::escape($apath); |
$apath=&escape($apath); |
$apath=~s/\W/\_/gs; |
$apath=~s/\W/\_/gs; |
%oldessays=&Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname); |
%oldessays=&Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname); |
} |
} |
Line 1852 KEYWORDS
|
Line 1858 KEYWORDS
|
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
} else { |
} else { |
my %seenparts; |
my %seenparts; |
for my $part (sort keys(%$handgrade)) { |
my @part_response_id = &flatten_responseType($responseType); |
my ($partid,$respid) = split(/_/,$part); |
foreach my $part (@part_response_id) { |
|
my ($partid,$respid) = @{ $part }; |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
if (exists($seenparts{$partid})) { next; } |
if (exists($seenparts{$partid})) { next; } |
Line 1877 KEYWORDS
|
Line 1884 KEYWORDS
|
} |
} |
foreach (@$string) { |
foreach (@$string) { |
my ($partid,$respid) = /^resource\.([^\.]*)\.([^\.]*)\.submission/; |
my ($partid,$respid) = /^resource\.([^\.]*)\.([^\.]*)\.submission/; |
if ($part ne ($partid.'_'.$respid)) { next; } |
if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } |
my ($ressub,$subval) = split(/:/,$_,2); |
my ($ressub,$subval) = split(/:/,$_,2); |
# Similarity check |
# Similarity check |
my $similar=''; |
my $similar=''; |
Line 1897 KEYWORDS
|
Line 1904 KEYWORDS
|
my $order=&get_order($partid,$respid,$symb,$uname,$udom); |
my $order=&get_order($partid,$respid,$symb,$uname,$udom); |
if ($env{'form.lastSub'} eq 'lastonly' || |
if ($env{'form.lastSub'} eq 'lastonly' || |
($env{'form.lastSub'} eq 'hdgrade' && |
($env{'form.lastSub'} eq 'hdgrade' && |
$$handgrade{$part} eq 'yes')) { |
$$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) { |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part:</b> '. |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part:</b> '. |
$display_part.' <font color="#999999">( ID '.$respid. |
$display_part.' <font color="#999999">( ID '.$respid. |
Line 1987 KEYWORDS
|
Line 1994 KEYWORDS
|
my %seen = (); |
my %seen = (); |
my @partlist; |
my @partlist; |
my @gradePartRespid; |
my @gradePartRespid; |
for my $part_resp (sort(keys(%$handgrade))) { |
my @part_response_id = &flatten_responseType($responseType); |
my ($partid,$respid) = split(/_/, $part_resp); |
foreach my $part_response_id (@part_response_id) { |
|
my ($partid,$respid) = @{ $part_response_id }; |
|
my $part_resp = join('_',@{ $part_response_id }); |
next if ($seen{$partid} > 0); |
next if ($seen{$partid} > 0); |
$seen{$partid}++; |
$seen{$partid}++; |
next if ($$handgrade{$part_resp} =~ /:no$/ && $env{'form.lastSub'} =~ /^(hdgrade)$/); |
next if ($$handgrade{$part_resp} =~ /:no$/ && $env{'form.lastSub'} =~ /^(hdgrade)$/); |
Line 2104 sub processHandGrade {
|
Line 2113 sub processHandGrade {
|
if ($includemsg =~ /savemsg|newmsg\Q$ctr\E/) { |
if ($includemsg =~ /savemsg|newmsg\Q$ctr\E/) { |
$subject = $env{'form.msgsub'} if ($includemsg =~ /msgsub/); |
$subject = $env{'form.msgsub'} if ($includemsg =~ /msgsub/); |
unless ($subject=~/\w/) { $subject=&mt('Grading Feedback'); } |
unless ($subject=~/\w/) { $subject=&mt('Grading Feedback'); } |
|
$subject.=' ['.&Apache::lonnet::declutter($url).']'; |
my (@msgnum) = split(/,/,$includemsg); |
my (@msgnum) = split(/,/,$includemsg); |
foreach (@msgnum) { |
foreach (@msgnum) { |
$message.=$env{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne ''); |
$message.=$env{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne ''); |
Line 2116 sub processHandGrade {
|
Line 2126 sub processHandGrade {
|
"?symb=$symb\">$env{'form.probTitle'}</a>"; |
"?symb=$symb\">$env{'form.probTitle'}</a>"; |
} |
} |
$msgstatus = &Apache::lonmsg::user_normal_msg($uname,$udom, |
$msgstatus = &Apache::lonmsg::user_normal_msg($uname,$udom, |
$subject.' ['. |
$subject, |
&Apache::lonnet::declutter($url).']',$message); |
$message); |
$request->print('<br />'.&mt('Sending message to [_1]@[_2]',$uname,$udom).': '. |
$request->print('<br />'.&mt('Sending message to [_1]@[_2]',$uname,$udom).': '. |
$msgstatus); |
$msgstatus); |
} |
} |
Line 2130 sub processHandGrade {
|
Line 2140 sub processHandGrade {
|
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
$env{'form.unamedom'.$ctr},$part); |
$env{'form.unamedom'.$ctr},$part); |
if ($errorflag eq 'not_allowed') { |
if ($errorflag eq 'not_allowed') { |
$request->print("<font color=\"red\">Not allowed to modify grades for $collaborator:$udom</font>"); |
$request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); |
next; |
next; |
} else { |
} else { |
if ($message ne '') { |
if ($message ne '') { |
$msgstatus = &Apache::lonmsg::user_normal_msg($collaborator,$udom,$env{'form.msgsub'},$message); |
$msgstatus = &Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message); |
} |
} |
} |
} |
} |
} |
Line 2326 sub saveHandGrade {
|
Line 2336 sub saveHandGrade {
|
if (exists($record{'resource.'.$new_part.'.awarded'})) { |
if (exists($record{'resource.'.$new_part.'.awarded'})) { |
$newrecord{'resource.'.$new_part.'.awarded'} = ''; |
$newrecord{'resource.'.$new_part.'.awarded'} = ''; |
} |
} |
$newrecord{'resource.'.$new_part.'.regrader'}="$env{'user.name'}:$env{'user.domain'}"; |
$newrecord{'resource.'.$new_part.'.regrader'}="$env{'user.name'}:$env{'user.domain'}"; |
} |
} |
} elsif ($dropMenu eq 'reset status' |
} elsif ($dropMenu eq 'reset status' |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
&& exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts |
Line 2386 sub saveHandGrade {
|
Line 2396 sub saveHandGrade {
|
} |
} |
$newrecord{'resource.'.$new_part.'.regrader'}= |
$newrecord{'resource.'.$new_part.'.regrader'}= |
"$env{'user.name'}:$env{'user.domain'}"; |
"$env{'user.name'}:$env{'user.domain'}"; |
&handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord); |
|
} |
} |
# unless problem has been graded, set flag to version the submitted files |
# unless problem has been graded, set flag to version the submitted files |
unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/ || |
unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/ || |
Line 2401 sub saveHandGrade {
|
Line 2410 sub saveHandGrade {
|
|
|
if (%newrecord) { |
if (%newrecord) { |
if (@version_parts) { |
if (@version_parts) { |
my @changed_keys = &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts); |
my @changed_keys = &version_portfiles(\%record, \@parts_graded, |
|
$env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts); |
@newrecord{@changed_keys} = @record{@changed_keys}; |
@newrecord{@changed_keys} = @record{@changed_keys}; |
|
foreach my $new_part (@version_parts) { |
|
&handback_files($request,$symb,$stuname,$domain,$newflg, |
|
$new_part,\%newrecord); |
|
} |
} |
} |
&Apache::lonnet::cstore(\%newrecord,$symb, |
&Apache::lonnet::cstore(\%newrecord,$symb, |
$env{'request.course.id'},$domain,$stuname); |
$env{'request.course.id'},$domain,$stuname); |
Line 2427 sub saveHandGrade {
|
Line 2441 sub saveHandGrade {
|
|
|
sub handback_files { |
sub handback_files { |
my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_; |
my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_; |
my $portfolio_root = &Apache::loncommon::propath($domain, |
my $portfolio_root = &propath($domain,$stuname).'/userfiles/portfolio'; |
$stuname). |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
'/userfiles/portfolio'; |
|
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my @part_response_id = &flatten_responseType($responseType); |
foreach my $part_resp (sort(keys(%$handgrade))) { |
foreach my $part_response_id (@part_response_id) { |
my ($part_id, $resp_id) = split(/_/,$part_resp); |
my ($part_id,$resp_id) = @{ $part_response_id }; |
|
my $part_resp = join('_',@{ $part_response_id }); |
if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) { |
if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) { |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
# if multiple files are uploaded names will be 'returndoc2','returndoc3' |
my $file_counter = 1; |
my $file_counter = 1; |
|
my $file_msg; |
while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) { |
while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) { |
my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'}; |
my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'}; |
my ($directory,$answer_file) = |
my ($directory,$answer_file) = |
($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/); |
($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/); |
my ($answer_name,$answer_ver,$answer_ext) = |
my ($answer_name,$answer_ver,$answer_ext) = |
&file_name_version_ext($answer_file); |
&file_name_version_ext($answer_file); |
$directory =~ /^.+$stuname\/portfolio(.*)/; |
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/); |
my $portfolio_path = $1; |
|
my @dir_list = &Apache::lonnet::dirlist($portfolio_path,$domain,$stuname,$portfolio_root); |
my @dir_list = &Apache::lonnet::dirlist($portfolio_path,$domain,$stuname,$portfolio_root); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
my $version = &get_next_version($answer_name, $answer_ext, \@dir_list); |
my $new_answer = &version_selected_portfile($domain, $stuname, $portfolio_path, $answer_file, $version); |
# fix file name |
$$newrecord{"resource.$new_part.$resp_id.handback"} = $new_answer; |
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/); |
# set the filename to match the submitted file name |
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain, |
$env{'form.'.$newflg.'_'.$part_resp.'_returndoc1.filename'} = $env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}; |
$newflg.'_'.$part_resp.'_returndoc'.$file_counter, |
my $result=&Apache::lonnet::userfileupload($newflg.'_'.$part_resp.'_returndoc'.$file_counter,'', |
$save_file_name); |
'portfolio',undef,undef,undef,$stuname,$domain); |
|
if ($result !~ m|^/uploaded/|) { |
if ($result !~ m|^/uploaded/|) { |
$request->print('<font color="red"> An errror occured ('.$result. |
$request->print('<font color="red"> An errror occured ('.$result. |
') while trying to upload '.&display_file().'</font><br />'); |
') while trying to upload '.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'</font><br />'); |
# $request->print(&done('Back')); |
} else { |
|
# mark the file as read only |
|
my @files = ($save_file_name); |
|
my @what = ($symb,$env{'request.course.id'},'handback'); |
|
&Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what); |
|
if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) { |
|
$$newrecord{"resource.$new_part.$resp_id.handback"}.=','; |
|
} |
|
$$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name; |
|
$file_msg.= "\n".'<br /><span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span><br />"; |
|
|
} |
} |
$request->print("<br />".$fname." will be the uploaded file name"); |
$request->print("<br />".$fname." will be the uploaded file name"); |
$request->print("<font color=\"red\">Will upload document </font>".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}); |
$request->print(" ".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter}); |
$file_counter++; |
$file_counter++; |
} |
} |
|
my $subject = "File Handed Back by Instructor "; |
|
my $message = "A file has been returned that was originally submitted in reponse to: <br />"; |
|
$message .= "<strong>".&Apache::lonnet::gettitle($symb)."</strong><br />"; |
|
$message .= ' The returned file(s) are named: '. $file_msg; |
|
$message .= " and can be found in your portfolio space."; |
|
my $url = (&Apache::lonnet::decode_symb($symb))[2]; |
|
$url = &Apache::lonnet::declutter($url); |
|
my $msgstatus = &Apache::lonmsg::user_normal_msg($stuname,$domain, |
|
$subject.' (File Returned) ['.$url.']',$message); |
|
|
} |
} |
} |
} |
return; |
return; |
Line 2546 sub version_portfiles {
|
Line 2580 sub version_portfiles {
|
my $version_parts = join('|',@$v_flag); |
my $version_parts = join('|',@$v_flag); |
my @returned_keys; |
my @returned_keys; |
my $parts = join('|', @$parts_graded); |
my $parts = join('|', @$parts_graded); |
my $portfolio_root = &Apache::loncommon::propath($domain, |
my $portfolio_root = &propath($domain,$stu_name). |
$stu_name). |
'/userfiles/portfolio'; |
'/userfiles/portfolio'; |
|
foreach my $key (keys(%$record)) { |
foreach my $key (keys(%$record)) { |
my $new_portfiles; |
my $new_portfiles; |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) { |
my @versioned_portfiles; |
my @versioned_portfiles; |
my @portfiles = split(/,/,$$record{$key}); |
my @portfiles = split(/\s*,\s*/,$$record{$key}); |
foreach my $file (@portfiles) { |
foreach my $file (@portfiles) { |
&Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file); |
&Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file); |
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/); |
Line 2565 sub version_portfiles {
|
Line 2598 sub version_portfiles {
|
if ($new_answer ne 'problem getting file') { |
if ($new_answer ne 'problem getting file') { |
push(@versioned_portfiles, $directory.$new_answer); |
push(@versioned_portfiles, $directory.$new_answer); |
&Apache::lonnet::mark_as_readonly($domain,$stu_name, |
&Apache::lonnet::mark_as_readonly($domain,$stu_name, |
['/portfolio'.$directory.$new_answer], |
[$directory.$new_answer], |
[$symb,$env{'request.course.id'},'graded']); |
[$symb,$env{'request.course.id'},'graded']); |
} |
} |
} |
} |
Line 2847 sub viewgrades {
|
Line 2880 sub viewgrades {
|
'<table border=0><tr bgcolor="#ffffdd"><td>'; |
'<table border=0><tr bgcolor="#ffffdd"><td>'; |
#radio buttons/text box for assigning points for a section or class. |
#radio buttons/text box for assigning points for a section or class. |
#handles different parts of a problem |
#handles different parts of a problem |
my ($partlist,$handgrade) = &response_type($symb); |
my ($partlist,$handgrade,$responseType) = &response_type($symb); |
my %weight = (); |
my %weight = (); |
my $ctsparts = 0; |
my $ctsparts = 0; |
$result.='<table border="0">'; |
$result.='<table border="0">'; |
my %seen = (); |
my %seen = (); |
for (sort keys(%$handgrade)) { |
my @part_response_id = &flatten_responseType($responseType); |
my ($partid,$respid) = split (/_/,$_,2); |
foreach my $part_response_id (@part_response_id) { |
|
my ($partid,$respid) = @{ $part_response_id }; |
|
my $part_resp = join('_',@{ $part_response_id }); |
next if $seen{$partid}; |
next if $seen{$partid}; |
$seen{$partid}++; |
$seen{$partid}++; |
my $handgrade=$$handgrade{$_}; |
my $handgrade=$$handgrade{$part_resp}; |
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb); |
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb); |
$weight{$partid} = $wgt eq '' ? '1' : $wgt; |
$weight{$partid} = $wgt eq '' ? '1' : $wgt; |
|
|
Line 3415 sub upcsvScores_form {
|
Line 3450 sub upcsvScores_form {
|
$result.=$table; |
$result.=$table; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; |
$result.=' <b>Specify a file containing the class scores for current resource'. |
$result.=' <b>'.&mt('Specify a file containing the class scores for current resource'). |
'.</b></td></tr>'."\n"; |
'.</b></td></tr>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
$result.='<tr bgcolor=#ffffe6><td>'."\n"; |
|
my $upload=&mt("Upload Scores"); |
my $upfile_select=&Apache::loncommon::upfile_select_html(); |
my $upfile_select=&Apache::loncommon::upfile_select_html(); |
my $ignore=&mt('Ignore First Line'); |
my $ignore=&mt('Ignore First Line'); |
$result.=<<ENDUPFORM; |
$result.=<<ENDUPFORM; |
Line 3427 sub upcsvScores_form {
|
Line 3463 sub upcsvScores_form {
|
<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" /> |
<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" /> |
<input type="hidden" name="saveState" value="$env{'form.saveState'}" /> |
<input type="hidden" name="saveState" value="$env{'form.saveState'}" /> |
$upfile_select |
$upfile_select |
<br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Scores" /> |
<br /><input type="button" onClick="javascript:checkUpload(this.form);" value="$upload" /> |
<label><input type="checkbox" name="noFirstLine" />$ignore</label> |
<label><input type="checkbox" name="noFirstLine" />$ignore</label> |
</form> |
</form> |
ENDUPFORM |
ENDUPFORM |
$result.='</td></tr></table>'."\n"; |
$result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", |
|
&mt("How do I create a CSV file from a spreadsheet")) |
|
.'</td></tr></table>'."\n"; |
$result.='</td></tr></table><br /><br />'."\n"; |
$result.='</td></tr></table><br /><br />'."\n"; |
$result.=&show_grading_menu_form($symb); |
$result.=&show_grading_menu_form($symb); |
return $result; |
return $result; |
Line 4219 sub scantron_filenames {
|
Line 4257 sub scantron_filenames {
|
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname, |
&Apache::loncommon::propath($cdom,$cname)); |
&propath($cdom,$cname)); |
my @possiblenames; |
my @possiblenames; |
foreach my $filename (sort(@files)) { |
foreach my $filename (sort(@files)) { |
($filename)=split(/&/,$filename); |
($filename)=split(/&/,$filename); |
Line 4396 SCANTRONFORM
|
Line 4434 SCANTRONFORM
|
<tr> |
<tr> |
<form action='/adm/grades' name='scantron_download'> |
<form action='/adm/grades' name='scantron_download'> |
<td bgcolor="#777777"> |
<td bgcolor="#777777"> |
|
$default_form_data |
<input type="hidden" name="command" value="scantron_download" /> |
<input type="hidden" name="command" value="scantron_download" /> |
<table width="100%" border="0"> |
<table width="100%" border="0"> |
<tr bgcolor="#e6ffff"> |
<tr bgcolor="#e6ffff"> |
Line 4578 sub scantron_parse_scanline {
|
Line 4617 sub scantron_parse_scanline {
|
substr($questions,0,$$scantron_config{'Qlength'})=''; |
substr($questions,0,$$scantron_config{'Qlength'})=''; |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
if (length($currentquest) < $$scantron_config{'Qlength'}) { next; } |
if ($$scantron_config{'Qon'} eq 'letter') { |
if ($$scantron_config{'Qon'} eq 'letter') { |
if ($currentquest eq '?') { |
if ($currentquest eq '?' |
|
|| $currentquest eq '*') { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
$record{"scantron.$questnum.answer"}=''; |
$record{"scantron.$questnum.answer"}=''; |
} elsif (!$currentquest |
} elsif (!$currentquest |
Line 4592 sub scantron_parse_scanline {
|
Line 4632 sub scantron_parse_scanline {
|
$record{"scantron.$questnum.answer"}=$currentquest; |
$record{"scantron.$questnum.answer"}=$currentquest; |
} |
} |
} elsif ($$scantron_config{'Qon'} eq 'number') { |
} elsif ($$scantron_config{'Qon'} eq 'number') { |
if ($currentquest eq '?') { |
if ($currentquest eq '?' |
|
|| $currentquest eq '*') { |
push(@{$record{'scantron.doubleerror'}},$questnum); |
push(@{$record{'scantron.doubleerror'}},$questnum); |
$record{"scantron.$questnum.answer"}=''; |
$record{"scantron.$questnum.answer"}=''; |
} elsif (!$currentquest |
} elsif (!$currentquest |
Line 4603 sub scantron_parse_scanline {
|
Line 4644 sub scantron_parse_scanline {
|
push(@{$record{"scantron.missingerror"}},$questnum); |
push(@{$record{"scantron.missingerror"}},$questnum); |
} |
} |
} else { |
} else { |
$record{"scantron.$questnum.answer"}= |
# wrap zero back to J |
$alphabet[$currentquest-1]; |
if ($currentquest eq '0') { |
|
$record{"scantron.$questnum.answer"}= |
|
$alphabet[9]; |
|
} else { |
|
$record{"scantron.$questnum.answer"}= |
|
$alphabet[$currentquest-1]; |
|
} |
} |
} |
} else { |
} else { |
my @array=split($$scantron_config{'Qon'},$currentquest,-1); |
my @array=split($$scantron_config{'Qon'},$currentquest,-1); |
Line 4734 sub reset_skipping_status {
|
Line 4781 sub reset_skipping_status {
|
&scantron_putfile(undef,$scan_data); |
&scantron_putfile(undef,$scan_data); |
} |
} |
|
|
sub allow_skipping { |
sub start_skipping { |
my ($scan_data,$i)=@_; |
my ($scan_data,$i)=@_; |
my %remembered=split(':',&scan_data($scan_data,'remember_skipping')); |
my %remembered=split(':',&scan_data($scan_data,'remember_skipping')); |
delete($remembered{$i}); |
if ($env{'form.scantron_options_redo'} =~ /^redo_/) { |
|
$remembered{$i}=2; |
|
} else { |
|
$remembered{$i}=1; |
|
} |
&scan_data($scan_data,'remember_skipping',join(':',%remembered)); |
&scan_data($scan_data,'remember_skipping',join(':',%remembered)); |
} |
} |
|
|
sub should_be_skipped { |
sub should_be_skipped { |
my ($scan_data,$i)=@_; |
my ($scanlines,$scan_data,$i)=@_; |
if ($env{'form.scantron_options_redo'} !~ /^redo_/) { |
if ($env{'form.scantron_options_redo'} !~ /^redo_/) { |
# not redoing old skips |
# not redoing old skips |
|
if ($scanlines->{'skipped'}[$i]) { return 1; } |
return 0; |
return 0; |
} |
} |
my %remembered=split(':',&scan_data($scan_data,'remember_skipping')); |
my %remembered=split(':',&scan_data($scan_data,'remember_skipping')); |
if (exists($remembered{$i})) { return 0; } |
|
|
if (exists($remembered{$i}) && $remembered{$i} != 2 ) { |
|
return 0; |
|
} |
return 1; |
return 1; |
} |
} |
|
|
Line 4760 sub remember_current_skipped {
|
Line 4815 sub remember_current_skipped {
|
$to_remember{$i}=1; |
$to_remember{$i}=1; |
} |
} |
} |
} |
|
|
&scan_data($scan_data,'remember_skipping',join(':',%to_remember)); |
&scan_data($scan_data,'remember_skipping',join(':',%to_remember)); |
&scantron_putfile(undef,$scan_data); |
&scantron_putfile(undef,$scan_data); |
} |
} |
Line 4775 sub scantron_warning_screen {
|
Line 4831 sub scantron_warning_screen {
|
my ($button_text)=@_; |
my ($button_text)=@_; |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my $CODElist="a"; |
my $CODElist; |
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODElength'}) { |
$scantron_config{'CODElength'}) { |
$CODElist=$env{'form.scantron_CODElist'}; |
$CODElist=$env{'form.scantron_CODElist'}; |
if ($CODElist eq '') { $CODElist='<font color="red">None</font>'; } |
if ($env{'form.scantron_CODElist'} eq '') { $CODElist='<font color="red">None</font>'; } |
$CODElist= |
$CODElist= |
'<tr><td><b>List of CODES to validate against:</b></td><td><tt>'. |
'<tr><td><b>List of CODES to validate against:</b></td><td><tt>'. |
$CODElist.'</tt></td></tr>'; |
$env{'form.scantron_CODElist'}.'</tt></td></tr>'; |
} |
} |
return (<<STUFF); |
return (<<STUFF); |
<p> |
<p> |
Line 4831 $warning
|
Line 4887 $warning
|
<input type="hidden" name="command" value="scantron_validate" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
STUFF |
STUFF |
} |
} |
$r->print("</form><br />".&show_grading_menu_form($symb)."</body></html>"); |
$r->print("</form><br />".&show_grading_menu_form($symb)); |
return ''; |
return ''; |
} |
} |
|
|
Line 4865 sub scantron_validate_file {
|
Line 4921 sub scantron_validate_file {
|
} |
} |
if ($env{'form.scantron_options_redo'} eq 'redo_skipped') { |
if ($env{'form.scantron_options_redo'} eq 'redo_skipped') { |
&remember_current_skipped(); |
&remember_current_skipped(); |
&scantron_remove_file('skipped'); |
|
$env{'form.scantron_options_redo'}='redo_skipped_ready'; |
$env{'form.scantron_options_redo'}='redo_skipped_ready'; |
} |
} |
|
|
Line 4932 STUFF
|
Line 4987 STUFF
|
$r->print(" this scanline saving it for later."); |
$r->print(" this scanline saving it for later."); |
} |
} |
} |
} |
$r->print(" </form><br />".&show_grading_menu_form($symb). |
$r->print(" </form><br />".&show_grading_menu_form($symb)); |
"</body></html>"); |
|
return ''; |
return ''; |
} |
} |
|
|
Line 5036 sub scantron_putfile {
|
Line 5090 sub scantron_putfile {
|
|
|
sub scantron_get_line { |
sub scantron_get_line { |
my ($scanlines,$scan_data,$i)=@_; |
my ($scanlines,$scan_data,$i)=@_; |
if (&should_be_skipped($scan_data,$i)) { return undef; } |
if (&should_be_skipped($scanlines,$scan_data,$i)) { return undef; } |
if ($scanlines->{'skipped'}[$i]) { return undef; } |
#if ($scanlines->{'skipped'}[$i]) { return undef; } |
if ($scanlines->{'corrected'}[$i]) {return $scanlines->{'corrected'}[$i];} |
if ($scanlines->{'corrected'}[$i]) {return $scanlines->{'corrected'}[$i];} |
return $scanlines->{'orig'}[$i]; |
return $scanlines->{'orig'}[$i]; |
} |
} |
Line 5057 sub scantron_put_line {
|
Line 5111 sub scantron_put_line {
|
my ($scanlines,$scan_data,$i,$newline,$skip)=@_; |
my ($scanlines,$scan_data,$i,$newline,$skip)=@_; |
if ($skip) { |
if ($skip) { |
$scanlines->{'skipped'}[$i]=$newline; |
$scanlines->{'skipped'}[$i]=$newline; |
&allow_skipping($scan_data,$i); |
&start_skipping($scan_data,$i); |
return; |
return; |
} |
} |
$scanlines->{'corrected'}[$i]=$newline; |
$scanlines->{'corrected'}[$i]=$newline; |
} |
} |
|
|
|
sub scantron_clear_skip { |
|
my ($scanlines,$scan_data,$i)=@_; |
|
if (exists($scanlines->{'skipped'}[$i])) { |
|
undef($scanlines->{'skipped'}[$i]); |
|
return 1; |
|
} |
|
return 0; |
|
} |
|
|
sub scantron_filter_not_exam { |
sub scantron_filter_not_exam { |
my ($curres)=@_; |
my ($curres)=@_; |
|
|
Line 5094 sub scantron_validate_sequence {
|
Line 5157 sub scantron_validate_sequence {
|
my @resources= |
my @resources= |
$navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0); |
$navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0); |
if (@resources) { |
if (@resources) { |
$r->print("<p>".&mt('Some resource in the sequece currently are not set to exam mode. Grading these resources currently may not work correctly.')."</p>"); |
$r->print("<p>".&mt('Some resources in the sequence currently are not set to exam mode. Grading these resources currently may not work correctly.')."</p>"); |
return (1,$currentphase); |
return (1,$currentphase); |
} |
} |
} |
} |
Line 5248 function change_radio(field) {
|
Line 5311 function change_radio(field) {
|
</script> |
</script> |
ENDSCRIPT |
ENDSCRIPT |
my $href="/adm/pickcode?". |
my $href="/adm/pickcode?". |
"form=".&Apache::lonnet::escape("scantronupload"). |
"form=".&escape("scantronupload"). |
"&scantron_format=".&Apache::lonnet::escape($env{'form.scantron_format'}). |
"&scantron_format=".&escape($env{'form.scantron_format'}). |
"&scantron_CODElist=".&Apache::lonnet::escape($env{'form.scantron_CODElist'}). |
"&scantron_CODElist=".&escape($env{'form.scantron_CODElist'}). |
"&curCODE=".&Apache::lonnet::escape($$scan_record{'scantron.CODE'}). |
"&curCODE=".&escape($$scan_record{'scantron.CODE'}). |
"&scantron_selectfile=".&Apache::lonnet::escape($env{'form.scantron_selectfile'}); |
"&scantron_selectfile=".&escape($env{'form.scantron_selectfile'}); |
if ($env{'form.scantron_CODElist'} =~ /\S/) { |
if ($env{'form.scantron_CODElist'} =~ /\S/) { |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_found' /> <a target='_blank' href='$href'>Select</a> a CODE from the list of all CODEs and use it.</label> Selected CODE is <input readonly='true' type='text' size='8' name='scantron_CODE_selectedvalue' onfocus=\"javascript:change_radio('use_found')\" onchange=\"javascript:change_radio('use_found')\" />"); |
$r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_found' /> <a target='_blank' href='$href'>Select</a> a CODE from the list of all CODEs and use it.</label> Selected CODE is <input readonly='true' type='text' size='8' name='scantron_CODE_selectedvalue' onfocus=\"javascript:change_radio('use_found')\" onchange=\"javascript:change_radio('use_found')\" />"); |
$r->print("\n<br />"); |
$r->print("\n<br />"); |
Line 5549 SCANTRONFORM
|
Line 5612 SCANTRONFORM
|
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonnet::appenv(%$scan_record); |
&Apache::lonnet::appenv(%$scan_record); |
|
|
|
if (&scantron_clear_skip($scanlines,$scan_data,$i)) { |
|
&scantron_putfile($scanlines,$scan_data); |
|
} |
|
|
my $i=0; |
my $i=0; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
Line 5936 sub handler {
|
Line 6003 sub handler {
|
if ($#commands > 0) { |
if ($#commands > 0) { |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands)); |
} |
} |
&send_header($request); |
$request->print(&Apache::loncommon::start_page('Grading')); |
if ($symb eq '' && $command eq '') { |
if ($symb eq '' && $command eq '') { |
if ($env{'user.adv'}) { |
if ($env{'user.adv'}) { |
if (($env{'form.codeone'}) && ($env{'form.codetwo'}) && |
if (($env{'form.codeone'}) && ($env{'form.codetwo'}) && |
Line 6027 sub handler {
|
Line 6094 sub handler {
|
$request->print("Access Denied ($command)"); |
$request->print("Access Denied ($command)"); |
} |
} |
} |
} |
&send_footer($request); |
|
return ''; |
|
} |
|
|
|
sub send_header { |
|
my ($request)= @_; |
|
&Apache::lontexconvert::init_tth(); |
|
$request->print(&Apache::loncommon::start_page('Grading')); |
|
$request->rflush(); |
|
} |
|
|
|
sub send_footer { |
|
my ($request)= @_; |
|
$request->print(&Apache::loncommon::end_page()); |
$request->print(&Apache::loncommon::end_page()); |
|
return ''; |
} |
} |
|
|
1; |
1; |