version 1.147, 2003/11/06 15:22:33
|
version 1.150, 2003/11/07 19:10:51
|
Line 177 sub showResourceInfo {
|
Line 177 sub showResourceInfo {
|
return $result,$responseType,$hdgrade,$partlist,$handgrade; |
return $result,$responseType,$hdgrade,$partlist,$handgrade; |
} |
} |
|
|
|
|
|
sub get_order { |
|
my ($partid,$respid,$symb,$uname,$udom)=@_; |
|
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
|
$url=&Apache::lonnet::clutter($url); |
|
my $subresult=&Apache::lonnet::ssi($url, |
|
('grade_target' => 'analyze'), |
|
('grade_domain' => $udom), |
|
('grade_symb' => $symb), |
|
('grade_courseid' => |
|
$ENV{'request.course.id'}), |
|
('grade_username' => $uname)); |
|
(undef,$subresult)=split(/_HASH_REF__/,$subresult,2); |
|
my %analyze=&Apache::lonnet::str2hash($subresult); |
|
return ($analyze{"$partid.$respid.shown"}); |
|
} |
#--- Clean response type for display |
#--- Clean response type for display |
#--- Currently filters option response type only. |
#--- Currently filters option/rank/radiobutton/match/essay response types only. |
sub cleanRecord { |
sub cleanRecord { |
my ($answer,$response,$symb) = @_; |
my ($answer,$response,$symb,$partid,$respid,$record,$order,$version) = @_; |
if ($response eq 'option') { |
my $grayFont = '<font color="#999999">'; |
my (@IDs,@ans); |
if ($response =~ /^(option|rank)$/) { |
foreach (split(/\&/,&Apache::lonnet::unescape($answer))) { |
my %answer=&Apache::lonnet::str2hash($answer); |
my ($optionID,$ans) = split(/=/); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
push @IDs,$optionID.'</font>'; |
my ($toprow,$bottomrow); |
push @ans,$ans; |
foreach my $foil (@$order) { |
|
if ($grading{$foil} == 1) { |
|
$toprow.='<td><b>'.$answer{$foil}.' </b></td>'; |
|
} else { |
|
$toprow.='<td><i>'.$answer{$foil}.' </i></td>'; |
|
} |
|
$bottomrow.='<td>'.$grayFont.$foil.'</font> </td>'; |
} |
} |
my $grayFont = '<font color="#999999">'; |
|
return '<blockquote><table border="1">'. |
return '<blockquote><table border="1">'. |
'<tr valign="top"><td>Answer</td><td>'. |
'<tr valign="top"><td>Answer</td>'.$toprow.'</tr>'. |
(join '</td><td>',@ans).'</td></tr>'. |
'<tr valign="top"><td>'.$grayFont.'Option ID</font></td>'. |
'<tr valign="top"><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont. |
$grayFont.$bottomrow.'</tr>'.'</table></blockquote>'; |
(join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'. |
} elsif ($response eq 'match') { |
'</table></blockquote>'; |
my %answer=&Apache::lonnet::str2hash($answer); |
} |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
if ($response eq 'essay') { |
my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); |
|
my ($toprow,$middlerow,$bottomrow); |
|
foreach my $foil (@$order) { |
|
my $item=shift(@items); |
|
if ($grading{$foil} == 1) { |
|
$toprow.='<td><b>'.$item.' </b></td>'; |
|
$middlerow.='<td><b>'.$grayFont.$answer{$foil}.' </font></b></td>'; |
|
} else { |
|
$toprow.='<td><i>'.$item.' </i></td>'; |
|
$middlerow.='<td><i>'.$grayFont.$answer{$foil}.' </font></i></td>'; |
|
} |
|
$bottomrow.='<td>'.$grayFont.$foil.'</font> </td>'; |
|
} |
|
return '<blockquote><table border="1">'. |
|
'<tr valign="top"><td>Answer</td>'.$toprow.'</tr>'. |
|
'<tr valign="top"><td>'.$grayFont.'Item ID</font></td>'. |
|
$middlerow.'</tr>'. |
|
'<tr valign="top"><td>'.$grayFont.'Option ID</font></td>'. |
|
$bottomrow.'</tr>'.'</table></blockquote>'; |
|
} elsif ($response eq 'radiobutton') { |
|
my %answer=&Apache::lonnet::str2hash($answer); |
|
my ($toprow,$bottomrow); |
|
my $correct=($order->[0])+1; |
|
for (my $i=1;$i<=$#$order;$i++) { |
|
my $foil=$order->[$i]; |
|
if (exists($answer{$foil})) { |
|
if ($i == $correct) { |
|
$toprow.='<td><b>true</b></td>'; |
|
} else { |
|
$toprow.='<td><i>true</i></td>'; |
|
} |
|
} else { |
|
$toprow.='<td>false</td>'; |
|
} |
|
$bottomrow.='<td>'.$grayFont.$foil.'</font> </td>'; |
|
} |
|
return '<blockquote><table border="1">'. |
|
'<tr valign="top"><td>Answer</td>'.$toprow.'</tr>'. |
|
'<tr valign="top"><td>'.$grayFont.'Option ID</font></td>'. |
|
$grayFont.$bottomrow.'</tr>'.'</table></blockquote>'; |
|
} elsif ($response eq 'essay') { |
if (! exists ($ENV{'form.'.$symb})) { |
if (! exists ($ENV{'form.'.$symb})) { |
my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade', |
my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade', |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
Line 604 LISTJAVASCRIPT
|
Line 665 LISTJAVASCRIPT
|
my ($foo,$partid,$foo1) = split(/\./,$_); |
my ($foo,$partid,$foo1) = split(/\./,$_); |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
$submitted = 0; |
$submitted = 0; |
|
my ($part)=split(/\./,$partid); |
$gradeTable.='<input type="hidden" name="'. |
$gradeTable.='<input type="hidden" name="'. |
$student.':submitted_by" value="'. |
$student.':'.$part.':submitted_by" value="'. |
$status{'resource.'.$partid.'.submitted_by'}.'" />'; |
$status{'resource.'.$partid.'.submitted_by'}.'" />'; |
} |
} |
} |
} |
Line 1471 KEYWORDS
|
Line 1533 KEYWORDS
|
$result.=$$fullname{$_}.' '; |
$result.=$$fullname{$_}.' '; |
} |
} |
$result.='<br />'."\n"; |
$result.='<br />'."\n"; |
|
my ($part)=split(/\./,$_); |
$result.='<input type="hidden" name="collaborator'.$counter. |
$result.='<input type="hidden" name="collaborator'.$counter. |
'" value="'.(join ':',@goodcollaborators).'" />'."\n"; |
'" value="'.$part.':'.(join ':',@goodcollaborators).'" />'. |
|
"\n"; |
} |
} |
if (scalar(@badcollaborators) > 0) { |
if (scalar(@badcollaborators) > 0) { |
$result.='<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
$result.='<table border="0"><tr bgcolor="#ffbbbb"><td>'; |
Line 1498 KEYWORDS
|
Line 1562 KEYWORDS
|
# (3) Last submission plus the parts info |
# (3) Last submission plus the parts info |
# (4) The whole record for this student |
# (4) The whole record for this student |
if ($ENV{'form.lastSub'} =~ /^(lastonly|hdgrade)$/) { |
if ($ENV{'form.lastSub'} =~ /^(lastonly|hdgrade)$/) { |
if ($ENV{'form.'.$uname.':'.$udom.':submitted_by'}) { |
|
my $submitby=''. |
|
'<b>Collaborative submission by: </b>'. |
|
'<a href="javascript:viewSubmitter(\''. |
|
$ENV{'form.'.$uname.':'.$udom.':submitted_by'}. |
|
'\')"; TARGET=_self>'. |
|
$$fullname{$ENV{'form.'.$uname.':'.$udom.':submitted_by'}}.'</a>'; |
|
$request->print($submitby); |
|
} else { |
|
my ($string,$timestamp)= &get_last_submission(\%record); |
my ($string,$timestamp)= &get_last_submission(\%record); |
my $lastsubonly=''. |
my $lastsubonly=''. |
($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '. |
($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '. |
Line 1514 KEYWORDS
|
Line 1569 KEYWORDS
|
if ($$timestamp eq '') { |
if ($$timestamp eq '') { |
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
} else { |
} else { |
|
my %seenparts; |
for my $part (sort keys(%$handgrade)) { |
for my $part (sort keys(%$handgrade)) { |
my ($partid,$respid) = split(/_/,$part); |
my ($partid,$respid) = split(/_/,$part); |
|
if ($ENV{"form.$uname:$udom:$partid:submitted_by"}) { |
|
if (exists($seenparts{$partid})) { next; } |
|
$seenparts{$partid}=1; |
|
my $submitby='<b>Part '.$partid. |
|
' Collaborative submission by: </b>'. |
|
'<a href="javascript:viewSubmitter(\''. |
|
$ENV{"form.$uname:$udom:$partid:submitted_by"}. |
|
'\')"; TARGET=_self>'. |
|
$$fullname{$ENV{"form.$uname:$udom:$partid:submitted_by"}}.'</a><br />'; |
|
$request->print($submitby); |
|
next; |
|
} |
my $responsetype = $responseType->{$partid}->{$respid}; |
my $responsetype = $responseType->{$partid}->{$respid}; |
if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) { |
if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) { |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
Line 1524 KEYWORDS
|
Line 1592 KEYWORDS
|
'<font color="red">Nothing submitted - no attempts</font><br /><br />'; |
'<font color="red">Nothing submitted - no attempts</font><br /><br />'; |
} else { |
} else { |
foreach (@$string) { |
foreach (@$string) { |
my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/; |
my ($partid,$respid) = /^resource\.([^\.]*)\.([^\.]*)\.submission/; |
if ($part eq ($partid.'_'.$respid)) { |
if ($part eq ($partid.'_'.$respid)) { |
my ($ressub,$subval) = split(/:/,$_,2); |
my ($ressub,$subval) = split(/:/,$_,2); |
# Similarity check |
# Similarity check |
Line 1544 KEYWORDS
|
Line 1612 KEYWORDS
|
&keywords_highlight($oessay).'</i></blockquote><hr />'; |
&keywords_highlight($oessay).'</i></blockquote><hr />'; |
} |
} |
} |
} |
|
my $order=&get_order($partid,$respid,$symb,$uname,$udom); |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
' )</font> '. |
' )</font> '. |
Line 1554 KEYWORDS
|
Line 1623 KEYWORDS
|
'<font color="red" size="1">Like all files provided by users, '. |
'<font color="red" size="1">Like all files provided by users, '. |
'this file may contain virusses</font><br />':''). |
'this file may contain virusses</font><br />':''). |
'<b>Submitted Answer: </b>'. |
'<b>Submitted Answer: </b>'. |
&cleanRecord($subval,$responsetype,$symb). |
&cleanRecord($subval,$responsetype,$symb,$partid,$respid,\%record,$order). |
'<br /><br />'.$similar."\n" |
'<br /><br />'.$similar."\n" |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
($ENV{'form.lastSub'} eq 'hdgrade' && |
($ENV{'form.lastSub'} eq 'hdgrade' && |
$$handgrade{$part} =~ /:yes$/)); |
$$handgrade{$part} eq 'yes')); |
} |
} |
} |
} |
} |
} |
Line 1566 KEYWORDS
|
Line 1635 KEYWORDS
|
} |
} |
$lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n"; |
$lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n"; |
$request->print($lastsubonly); |
$request->print($lastsubonly); |
} |
|
} elsif ($ENV{'form.lastSub'} eq 'datesub') { |
} elsif ($ENV{'form.lastSub'} eq 'datesub') { |
my (undef,$responseType,undef,$parts) = &showResourceInfo($url); |
my (undef,$responseType,undef,$parts) = &showResourceInfo($url); |
$request->print(&displaySubByDates(\$symb,\%record,$parts,$responseType,$checkIcon)); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
} elsif ($ENV{'form.lastSub'} =~ /^(last|all)$/) { |
} elsif ($ENV{'form.lastSub'} =~ /^(last|all)$/) { |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom, |
$ENV{'request.course.id'}, |
$ENV{'request.course.id'}, |
Line 1742 sub processHandGrade {
|
Line 1810 sub processHandGrade {
|
$ENV{'form.msgsub'},$message); |
$ENV{'form.msgsub'},$message); |
} |
} |
if ($ENV{'form.collaborator'.$ctr}) { |
if ($ENV{'form.collaborator'.$ctr}) { |
my (@collaborators) = split(/:/,$ENV{'form.collaborator'.$ctr}); |
&Apache::lonnet::logthis('collab '.(join(':',@{ $ENV{'form.collaborator'.$ctr} }))); |
foreach (@collaborators) { |
my @collabstrs; |
my ($errorflag,$pts,$wgt) = |
if (ref($ENV{'form.collaborator'.$ctr}) eq 'ARRAY') { |
&saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr}); |
@collabstrs=@{$ENV{'form.collaborator'.$ctr}}; |
if ($errorflag eq 'not_allowed') { |
} else { |
$request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>"); |
@collabstrs=$ENV{'form.collaborator'.$ctr}; |
next; |
} |
} else { |
foreach my $collabstr (@collabstrs) { |
if ($message ne '') { |
my ($part,@collaborators) = split(/:/,$collabstr); |
$msgstatus = &Apache::lonmsg::user_normal_msg ($_,$udom, |
foreach (@collaborators) { |
$ENV{'form.msgsub'}, |
my ($errorflag,$pts,$wgt) = |
$message); |
&saveHandGrade($request,$url,$symb,$_,$udom,$ctr, |
|
$ENV{'form.unamedom'.$ctr},$part); |
|
if ($errorflag eq 'not_allowed') { |
|
$request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>"); |
|
next; |
|
} else { |
|
if ($message ne '') { |
|
$msgstatus = &Apache::lonmsg::user_normal_msg($_,$udom,$ENV{'form.msgsub'},$message); |
|
} |
|
|
} |
} |
} |
} |
} |
} |
Line 1905 sub processHandGrade {
|
Line 1982 sub processHandGrade {
|
|
|
#---- Save the score and award for each student, if changed |
#---- Save the score and award for each student, if changed |
sub saveHandGrade { |
sub saveHandGrade { |
my ($request,$url,$symb,$stuname,$domain,$newflg,$submitter) = @_; |
my ($request,$url,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_; |
my $usec = &Apache::lonnet::getsection($domain,$stuname, |
my $usec = &Apache::lonnet::getsection($domain,$stuname, |
$ENV{'request.course.id'}); |
$ENV{'request.course.id'}); |
if (!&canmodify($usec)) { return('not_allowed'); } |
if (!&canmodify($usec)) { return('not_allowed'); } |
Line 1913 sub saveHandGrade {
|
Line 1990 sub saveHandGrade {
|
my %newrecord = (); |
my %newrecord = (); |
my ($pts,$wgt) = ('',''); |
my ($pts,$wgt) = ('',''); |
foreach (split(/:/,$ENV{'form.partlist'.$newflg})) { |
foreach (split(/:/,$ENV{'form.partlist'.$newflg})) { |
|
&Apache::lonnet::logthis("-$submitter-$stuname-$part-$_"); |
|
#collaborator may vary for different parts |
|
if ($submitter && $_ ne $part) { next; } |
my $dropMenu = $ENV{'form.GD_SEL'.$newflg.'_'.$_}; |
my $dropMenu = $ENV{'form.GD_SEL'.$newflg.'_'.$_}; |
if ($dropMenu eq 'excused') { |
if ($dropMenu eq 'excused') { |
if ($record{'resource.'.$_.'.solved'} ne 'excused') { |
if ($record{'resource.'.$_.'.solved'} ne 'excused') { |
Line 1948 sub saveHandGrade {
|
Line 2028 sub saveHandGrade {
|
$newrecord{$reckey} = 'correct_by_override' |
$newrecord{$reckey} = 'correct_by_override' |
if ($record{$reckey} ne 'correct_by_override'); |
if ($record{$reckey} ne 'correct_by_override'); |
} |
} |
|
|
$newrecord{'resource.'.$_.'.submitted_by'} = $submitter |
$newrecord{'resource.'.$_.'.submitted_by'} = $submitter |
if ($submitter && ($record{'resource.'.$_.'.submitted_by'} ne $submitter)); |
if ($submitter && ($record{'resource.'.$_.'.submitted_by'} ne $submitter)); |
$newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; |
$newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; |
Line 3002 sub displayPage {
|
Line 3083 sub displayPage {
|
} |
} |
$responseType{$partid} = \%responseIds; |
$responseType{$partid} = \%responseIds; |
} |
} |
$studentTable.= &displaySubByDates(\$symbx,\%record,$parts,\%responseType,$checkIcon); |
$studentTable.= &displaySubByDates($symbx,\%record,$parts,\%responseType,$checkIcon,$uname,$udom); |
|
|
} |
} |
} elsif ($ENV{'form.lastSub'} eq 'all') { |
} elsif ($ENV{'form.lastSub'} eq 'all') { |
Line 3038 sub displayPage {
|
Line 3119 sub displayPage {
|
} |
} |
|
|
sub displaySubByDates { |
sub displaySubByDates { |
my ($symbx,$record,$parts,$responseType,$checkIcon) = @_; |
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_; |
my $studentTable='<table border="0" width="100%"><tr><td bgcolor="#777777">'. |
my $studentTable='<table border="0" width="100%"><tr><td bgcolor="#777777">'. |
'<table border="0" width="100%"><tr bgcolor="#e6ffff">'. |
'<table border="0" width="100%"><tr bgcolor="#e6ffff">'. |
'<td><b>Date/Time</b></td>'. |
'<td><b>Date/Time</b></td>'. |
Line 3046 sub displaySubByDates {
|
Line 3127 sub displaySubByDates {
|
'<td><b>Status </b></td></tr>'; |
'<td><b>Status </b></td></tr>'; |
my ($version); |
my ($version); |
my %mark; |
my %mark; |
|
my %orders; |
$mark{'correct_by_student'} = $checkIcon; |
$mark{'correct_by_student'} = $checkIcon; |
if (!exists($$record{'1:timestamp'})) { |
if (!exists($$record{'1:timestamp'})) { |
return '<br /> <font color="red">Nothing submitted - no attempts</font><br />'; |
return '<br /> <font color="red">Nothing submitted - no attempts</font><br />'; |
Line 3070 sub displaySubByDates {
|
Line 3152 sub displaySubByDates {
|
$displaySub[0].='Trial '. |
$displaySub[0].='Trial '. |
$$record{"$version:resource.$partid.tries"}; |
$$record{"$version:resource.$partid.tries"}; |
} |
} |
&Apache::lonnet::logthis("Part is $partid responseType is ".join(':',%$responseType)); |
|
my $responseType=$responseType->{$partid}->{$responseId}; |
my $responseType=$responseType->{$partid}->{$responseId}; |
|
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
|
if (!exists($orders{$partid}->{$responseId})) { |
|
$orders{$partid}->{$responseId}= |
|
&get_order($partid,$responseId,$symb,$uname,$udom); |
|
} |
$displaySub[0].='</b> '. |
$displaySub[0].='</b> '. |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$$symbx).'<br />'; |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:").'<br />'; |
} |
} |
} |
} |
if (exists $$record{"$version:resource.$partid.award"}) { |
if (exists $$record{"$version:resource.$partid.award"}) { |
Line 3858 sub send_header {
|
Line 3944 sub send_header {
|
#remotewindow.close(); |
#remotewindow.close(); |
#</script>"); |
#</script>"); |
$request->print(&Apache::loncommon::bodytag('Grading')); |
$request->print(&Apache::loncommon::bodytag('Grading')); |
|
foreach my $key (sort(keys(%ENV))) { |
|
if ($key =~ /^form\./) { |
|
Apache->request->print("$key => $ENV{$key} <br />"); |
|
} |
|
} |
} |
} |
|
|
sub send_footer { |
sub send_footer { |