version 1.139, 2003/09/18 18:45:28
|
version 1.153, 2003/11/10 16:28:10
|
Line 55 my %perm=();
|
Line 55 my %perm=();
|
|
|
# ----- These first few routines are general use routines.---- |
# ----- These first few routines are general use routines.---- |
# |
# |
# --- Retrieve the parts that matches stores_\d+ from the metadata file.--- |
# --- Retrieve the parts from the metadata file.--- |
sub getpartlist { |
sub getpartlist { |
my ($url) = @_; |
my ($url,$symb) = @_; |
my @parts =(); |
my $partorder = &Apache::lonnet::metadata($url, 'partorder'); |
my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys')); |
my @parts; |
foreach my $key (@metakeys) { |
if ($partorder) { |
if ( $key =~ m/stores_(\w+)_.*/) { |
for my $part (split (/,/,$partorder)) { |
push(@parts,$key); |
if (!&Apache::loncommon::check_if_partid_hidden($part,$symb)) { |
|
push(@parts, $part); |
|
} |
|
} |
|
} else { |
|
my $metadata = &Apache::lonnet::metadata($url, 'packages'); |
|
foreach (split(/\,/,$metadata)) { |
|
if ($_ =~ /^part_(.*)$/) { |
|
if (!&Apache::loncommon::check_if_partid_hidden($1,$symb)) { |
|
push(@parts, $1); |
|
} |
|
} |
} |
} |
} |
} |
return @parts; |
my @stores; |
|
foreach my $part (@parts) { |
|
my (@metakeys) = split(/,/,&Apache::lonnet::metadata($url,'keys')); |
|
foreach my $key (@metakeys) { |
|
if ($key =~ m/^stores_\Q$part\E_/) { push(@stores,$key); } |
|
} |
|
} |
|
return @stores; |
} |
} |
|
|
# --- Get the symbolic name of a problem and the url |
# --- Get the symbolic name of a problem and the url |
Line 115 sub response_type {
|
Line 133 sub response_type {
|
$symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url))) if ($symb eq ''); |
$symb=($ENV{'form.symb'} ne '' ? $ENV{'form.symb'} : (&Apache::lonnet::symbread($url))) if ($symb eq ''); |
my $allkeys = &Apache::lonnet::metadata($url,'keys'); |
my $allkeys = &Apache::lonnet::metadata($url,'keys'); |
my %seen = (); |
my %seen = (); |
my (@partlist,%handgrade); |
my (@partlist,%handgrade,%responseType); |
foreach (split(/,/,&Apache::lonnet::metadata($url,'packages'))) { |
foreach (split(/,/,&Apache::lonnet::metadata($url,'packages'))) { |
if (/^\w+response_\w+.*/) { |
if (/^\w+response_.*/) { |
my ($responsetype,$part) = split(/_/,$_,2); |
my ($responsetype,$part) = split(/_/,$_,2); |
my ($partid,$respid) = split(/_/,$part); |
my ($partid,$respid) = split(/_/,$part); |
|
if (&Apache::loncommon::check_if_partid_hidden($partid,$symb)) { |
|
next; |
|
} |
$responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!! |
$responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!! |
my ($value) = &Apache::lonnet::EXT('resource.'.$part.'.handgrade',$symb); |
my ($value) = &Apache::lonnet::EXT('resource.'.$part.'.handgrade',$symb); |
$handgrade{$part} = $responsetype.':'.($value eq 'yes' ? 'yes' : 'no'); |
$handgrade{$part} = ($value eq 'yes' ? 'yes' : 'no'); |
|
if (!exists($responseType{$partid})) { $responseType{$partid}={}; } |
|
$responseType{$partid}->{$respid}=$responsetype; |
next if ($seen{$partid} > 0); |
next if ($seen{$partid} > 0); |
$seen{$partid}++; |
$seen{$partid}++; |
push @partlist,$partid; |
push @partlist,$partid; |
} |
} |
} |
} |
return \@partlist,\%handgrade; |
return \@partlist,\%handgrade,\%responseType; |
} |
} |
|
|
#--- Show resource title |
#--- Show resource title |
Line 137 sub showResourceInfo {
|
Line 160 sub showResourceInfo {
|
my ($url,$probTitle) = @_; |
my ($url,$probTitle) = @_; |
my $result ='<table border="0">'. |
my $result ='<table border="0">'. |
'<tr><td colspan=3><font size=+1><b>Current Resource: </b>'.$probTitle.'</font></td></tr>'."\n"; |
'<tr><td colspan=3><font size=+1><b>Current Resource: </b>'.$probTitle.'</font></td></tr>'."\n"; |
my ($partlist,$handgrade) = &response_type($url); |
my ($partlist,$handgrade,$responseType) = &response_type($url); |
my %resptype = (); |
my %resptype = (); |
my $hdgrade='no'; |
my $hdgrade='no'; |
for (sort keys(%$handgrade)) { |
for my $part_resID (sort keys(%$handgrade)) { |
my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); |
my $handgrade=$$handgrade{$part_resID}; |
my $partID = (split(/_/))[0]; |
my ($partID,$resID) = split(/_/,$part_resID); |
$resptype{$partID} = $responsetype; |
my $responsetype = $responseType->{$partID}->{$resID}; |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
$hdgrade = $handgrade if ($handgrade eq 'yes'); |
$result.='<tr><td><b>Part </b>'.$partID.'</td>'. |
$result.='<tr><td><b>Part </b>'.$partID.' <font color="#999999">'. |
|
$resID.'</font></td>'. |
'<td><b>Type: </b>'.$responsetype.'</td></tr>'; |
'<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,\%resptype,$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 185 sub cleanRecord {
|
Line 270 sub cleanRecord {
|
$ENV{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$ENV{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
$ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
} |
} |
return '<br /><br /><blockquote>'.&keywords_highlight($answer).'</blockquote>'; |
return '<br /><br /><blockquote><pre>'.&keywords_highlight($answer).'</pre></blockquote>'; |
} |
} |
return $answer; |
return $answer; |
} |
} |
Line 507 LISTJAVASCRIPT
|
Line 592 LISTJAVASCRIPT
|
my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : ''; |
my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : ''; |
my $checklastsub = $checkhdgrade eq '' ? 'checked' : ''; |
my $checklastsub = $checkhdgrade eq '' ? 'checked' : ''; |
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n". |
my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n". |
' <b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". |
' <b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n". |
'<input type="radio" name="vProb" value="yes" /> one student '."\n". |
'<input type="radio" name="vProb" value="yes" /> one student '."\n". |
'<input type="radio" name="vProb" value="all" /> all students <br />'."\n". |
'<input type="radio" name="vProb" value="all" /> all students <br />'."\n". |
|
' <b>View Answer: </b><input type="radio" name="vAns" value="no" /> no '."\n". |
|
'<input type="radio" name="vAns" value="yes" /> one student '."\n". |
|
'<input type="radio" name="vAns" value="all" checked="on" /> all students <br />'."\n". |
' <b>Submissions: </b>'."\n"; |
' <b>Submissions: </b>'."\n"; |
if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { |
if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { |
$gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n"; |
$gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n"; |
Line 569 LISTJAVASCRIPT
|
Line 657 LISTJAVASCRIPT
|
my %status = (); |
my %status = (); |
if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { |
if ($ENV{'form.showgrading'} eq 'yes' && $submitonly ne 'all') { |
(%status) =&student_gradeStatus($url,$symb,$udom,$uname,$partlist); |
(%status) =&student_gradeStatus($url,$symb,$udom,$uname,$partlist); |
my $statusflg = ''; |
my $submitted = 0; |
|
my $graded = 1; |
foreach (keys(%status)) { |
foreach (keys(%status)) { |
$statusflg = 1 if ($status{$_} ne 'nothing'); |
$submitted = 1 if ($status{$_} ne 'nothing'); |
|
$graded = 0 if ($status{$_} =~ /^correct/); |
my ($foo,$partid,$foo1) = split(/\./,$_); |
my ($foo,$partid,$foo1) = split(/\./,$_); |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
$statusflg = ''; |
$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'}.'" />'; |
} |
} |
} |
} |
next if ($statusflg eq '' && $submitonly eq 'yes'); |
next if (!$submitted && ($submitonly eq 'yes' || $submitonly eq 'graded')); |
|
next if (!$graded && $submitonly eq 'graded'); |
} |
} |
|
|
$ctr++; |
$ctr++; |
Line 622 LISTJAVASCRIPT
|
Line 714 LISTJAVASCRIPT
|
} else { |
} else { |
$gradeTable='<br /> <font color="red">'. |
$gradeTable='<br /> <font color="red">'. |
'No submissions found for this resource for any students. ('.$num_students. |
'No submissions found for this resource for any students. ('.$num_students. |
' checked for submissions</font><br />'; |
' checked for submissions)</font><br />'; |
} |
} |
} elsif ($ctr == 1) { |
} elsif ($ctr == 1) { |
$gradeTable =~ s/type=checkbox/type=checkbox checked/; |
$gradeTable =~ s/type=checkbox/type=checkbox checked/; |
Line 1196 sub gradeBox {
|
Line 1288 sub gradeBox {
|
} |
} |
|
|
sub show_problem { |
sub show_problem { |
my ($request,$symb,$uname,$udom,$removeform,$viewon) = @_; |
my ($request,$symb,$uname,$udom,$removeform,$viewon,$mode) = @_; |
my $rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, |
my $rendered; |
$ENV{'request.course.id'}); |
if ($mode eq 'both' or $mode eq 'text') { |
|
$rendered=&Apache::loncommon::get_student_view($symb,$uname,$udom, |
|
$ENV{'request.course.id'}); |
|
} |
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|name="submit"|name="would_have_been_submit"|g; |
} |
} |
my $companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, |
my $companswer; |
$ENV{'request.course.id'}); |
if ($mode eq 'both' or $mode eq 'answer') { |
|
$companswer=&Apache::loncommon::get_student_answers($symb,$uname,$udom, |
|
$ENV{'request.course.id'}); |
|
} |
if ($removeform) { |
if ($removeform) { |
$companswer=~s|<form(.*?)>||g; |
$companswer=~s|<form(.*?)>||g; |
$companswer=~s|</form>||g; |
$companswer=~s|</form>||g; |
$rendered=~s|name="submit"|name="would_have_been_submit"|g; |
$companswer=~s|name="submit"|name="would_have_been_submit"|g; |
} |
} |
my $result.='<table border="0" width="100%"><tr><td bgcolor="#777777">'; |
my $result.='<table border="0" width="100%"><tr><td bgcolor="#777777">'; |
$result.='<table border="0" width="100%">'; |
$result.='<table border="0" width="100%">'; |
$result.='<tr><td bgcolor="#e6ffff"><b> View of the problem - '.$ENV{'form.fullname'}. |
if ($viewon) { |
'</b></td></tr>' if ($viewon); |
$result.='<tr><td bgcolor="#e6ffff"><b> '; |
$result.='<tr><td bgcolor="#ffffff">'.$rendered.'<br />'; |
if ($mode eq 'both' or $mode eq 'text') { |
$result.='<b>Correct answer:</b><br />'.$companswer; |
$result.='View of the problem - '; |
|
} else { |
|
$result.='Correct answer: '; |
|
} |
|
$result.=$ENV{'form.fullname'}.'</b></td></tr>'; |
|
} |
|
if ($mode eq 'both') { |
|
$result.='<tr><td bgcolor="#ffffff">'.$rendered.'<br />'; |
|
$result.='<b>Correct answer:</b><br />'.$companswer; |
|
} elsif ($mode eq 'text') { |
|
$result.='<tr><td bgcolor="#ffffff">'.$rendered; |
|
} elsif ($mode eq 'answer') { |
|
$result.='<tr><td bgcolor="#ffffff">'.$companswer; |
|
} |
$result.='</td></tr></table>'; |
$result.='</td></tr></table>'; |
$result.='</td></tr></table><br />'; |
$result.='</td></tr></table><br />'; |
return $result; |
return $result; |
Line 1265 sub submission {
|
Line 1376 sub submission {
|
|
|
# option to display problem, only once else it cause problems |
# option to display problem, only once else it cause problems |
# with the form later since the problem has a form. |
# with the form later since the problem has a form. |
if ($ENV{'form.vProb'} eq 'yes' or !$ENV{'form.vProb'}) { |
if ($ENV{'form.vProb'} eq 'yes' or $ENV{'form.vAns'} eq 'yes') { |
$request->print(&show_problem($request,$symb,$uname,$udom,0,1)); |
my $mode; |
|
if ($ENV{'form.vProb'} eq 'yes' && $ENV{'form.vAns'} eq 'yes') { |
|
$mode='both'; |
|
} elsif ($ENV{'form.vProb'} eq 'yes') { |
|
$mode='text'; |
|
} elsif ($ENV{'form.vAns'} eq 'yes') { |
|
$mode='answer'; |
|
} |
|
$request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode)); |
} |
} |
|
|
# kwclr is the only variable that is guaranteed to be non blank |
# kwclr is the only variable that is guaranteed to be non blank |
Line 1301 sub submission {
|
Line 1420 sub submission {
|
'<input type="hidden" name="url" value="'.$url.'" />'."\n". |
'<input type="hidden" name="url" value="'.$url.'" />'."\n". |
'<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" />'."\n". |
'<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" />'."\n". |
'<input type="hidden" name="vProb" value="'.$ENV{'form.vProb'}.'" />'."\n". |
'<input type="hidden" name="vProb" value="'.$ENV{'form.vProb'}.'" />'."\n". |
|
'<input type="hidden" name="vAns" value="'.$ENV{'form.vAns'}.'" />'."\n". |
'<input type="hidden" name="lastSub" value="'.$ENV{'form.lastSub'}.'" />'."\n". |
'<input type="hidden" name="lastSub" value="'.$ENV{'form.lastSub'}.'" />'."\n". |
'<input type="hidden" name="section" value="'.$ENV{'form.section'}.'">'."\n". |
'<input type="hidden" name="section" value="'.$ENV{'form.section'}.'">'."\n". |
'<input type="hidden" name="submitonly" value="'.$ENV{'form.submitonly'}.'">'."\n". |
'<input type="hidden" name="submitonly" value="'.$ENV{'form.submitonly'}.'">'."\n". |
Line 1351 KEYWORDS
|
Line 1471 KEYWORDS
|
} |
} |
} |
} |
|
|
if ($ENV{'form.vProb'} eq 'all') { |
if ($ENV{'form.vProb'} eq 'all' or $ENV{'form.vAns'} eq 'all') { |
$request->print('<br /><br /><br />') if ($counter > 0); |
$request->print('<br /><br /><br />') if ($counter > 0); |
$request->print(&show_problem($request,$symb,$uname,$udom,1,1)); |
my $mode; |
|
if ($ENV{'form.vProb'} eq 'all' && $ENV{'form.vAns'} eq 'all') { |
|
$mode='both'; |
|
} elsif ($ENV{'form.vProb'} eq 'all' ) { |
|
$mode='text'; |
|
} elsif ($ENV{'form.vAns'} eq 'all') { |
|
$mode='answer'; |
|
} |
|
$request->print(&show_problem($request,$symb,$uname,$udom,1,1,$mode)); |
} |
} |
|
|
my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); |
|
|
my ($partlist,$handgrade) = &response_type($url,$symb); |
my ($partlist,$handgrade,$responseType) = &response_type($url,$symb); |
|
|
# Display student info |
# Display student info |
$request->print(($counter == 0 ? '' : '<br />')); |
$request->print(($counter == 0 ? '' : '<br />')); |
Line 1404 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 1431 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 ($string,$timestamp)= &get_last_submission(\%record); |
my $submitby=''. |
my $lastsubonly=''. |
'<b>Collaborative submission by: </b>'. |
($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '. |
'<a href="javascript:viewSubmitter(\''. |
$$timestamp)."</td></tr>\n"; |
$ENV{'form.'.$uname.':'.$udom.':submitted_by'}. |
if ($$timestamp eq '') { |
'\')"; TARGET=_self>'. |
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
$$fullname{$ENV{'form.'.$uname.':'.$udom.':submitted_by'}}.'</a>'; |
|
$request->print($submitby); |
|
} else { |
} else { |
my ($string,$timestamp)= &get_last_submission (\%record); |
my %seenparts; |
my $lastsubonly=''. |
for my $part (sort keys(%$handgrade)) { |
($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '. |
my ($partid,$respid) = split(/_/,$part); |
$$timestamp)."</td></tr>\n"; |
if ($ENV{"form.$uname:$udom:$partid:submitted_by"}) { |
if ($$timestamp eq '') { |
if (exists($seenparts{$partid})) { next; } |
$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; |
$seenparts{$partid}=1; |
} else { |
my $submitby='<b>Part '.$partid. |
for my $part (sort keys(%$handgrade)) { |
' Collaborative submission by: </b>'. |
my ($responsetype,$foo) = split(/:/,$$handgrade{$part}); |
'<a href="javascript:viewSubmitter(\''. |
my ($partid,$respid) = split(/_/,$part); |
$ENV{"form.$uname:$udom:$partid:submitted_by"}. |
if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) { |
'\')"; TARGET=_self>'. |
|
$$fullname{$ENV{"form.$uname:$udom:$partid:submitted_by"}}.'</a><br />'; |
|
$request->print($submitby); |
|
next; |
|
} |
|
my $responsetype = $responseType->{$partid}->{$respid}; |
|
if (!exists($record{"resource.$partid.$respid.submission"})) { |
|
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
|
$partid.'</b> <font color="#999999">( ID '.$respid. |
|
' )</font> '. |
|
'<font color="red">Nothing submitted - no attempts</font><br /><br />'; |
|
next; |
|
} |
|
foreach (@$string) { |
|
my ($partid,$respid) = /^resource\.([^\.]*)\.([^\.]*)\.submission/; |
|
if ($part ne ($partid.'_'.$respid)) { next; } |
|
my ($ressub,$subval) = split(/:/,$_,2); |
|
# Similarity check |
|
my $similar=''; |
|
if($ENV{'form.checkPlag'}){ |
|
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
|
&most_similar($uname,$udom,$subval); |
|
if ($osim) { |
|
$osim=int($osim*100.0); |
|
$similar="<hr /><h3><font color=\"#FF0000\">Essay". |
|
" is $osim% similar to an essay by ". |
|
&Apache::loncommon::plainname($oname,$odom). |
|
'</font></h3><blockquote><i>'. |
|
&keywords_highlight($oessay). |
|
'</i></blockquote><hr />'; |
|
} |
|
} |
|
my $order=&get_order($partid,$respid,$symb,$uname,$udom); |
|
if ($ENV{'form.lastSub'} eq 'lastonly' || |
|
($ENV{'form.lastSub'} eq 'hdgrade' && |
|
$$handgrade{$part} eq 'yes')) { |
$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> '; |
'<font color="red">Nothing submitted - no attempts</font><br /><br />'; |
if ($record{"resource.$partid.$respid.uploadedurl"}) { |
} else { |
$lastsubonly.='<a href="'.&Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}).'"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> <font color="red" size="1">Like all files provided by users, this file may contain virusses</font><br />'; |
foreach (@$string) { |
|
my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/; |
|
if ($part eq ($partid.'_'.$respid)) { |
|
my ($ressub,$subval) = split(/:/,$_,2); |
|
# Similarity check |
|
my $similar=''; |
|
my $oname; |
|
my $odom; |
|
my $ocrsid; |
|
my $oessay; |
|
my $osim; |
|
if($ENV{'form.checkPlag'}){ |
|
($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval); |
|
if ($osim) { |
|
$osim=int($osim*100.0); |
|
$similar='<hr /><h3><font color="#FF0000">Essay is '.$osim. |
|
'% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom). |
|
'</font></h3><blockquote><i>'. |
|
&keywords_highlight($oessay).'</i></blockquote><hr />'; |
|
} |
|
} |
|
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
|
$partid.'</b> <font color="#999999">( ID '.$respid. |
|
' )</font> '. |
|
($record{"resource.$partid.$respid.uploadedurl"}? |
|
'<a href="'. |
|
&Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}). |
|
'"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '. |
|
'<font color="red" size="1">Like all files provided by users, '. |
|
'this file may contain virusses</font><br />':''). |
|
'<b>Submitted Answer: </b>'. |
|
&cleanRecord($subval,$responsetype,$symb). |
|
'<br /><br />'.$similar."\n" |
|
if ($ENV{'form.lastSub'} eq 'lastonly' || |
|
($ENV{'form.lastSub'} eq 'hdgrade' && |
|
$$handgrade{$part} =~ /:yes$/)); |
|
} |
|
} |
} |
|
$lastsubonly.='<b>Submitted Answer: </b>'. |
|
&cleanRecord($subval,$responsetype,$symb,$partid, |
|
$respid,\%record,$order); |
|
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
} |
} |
} |
} |
} |
} |
$lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n"; |
|
$request->print($lastsubonly); |
|
} |
} |
|
$lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n"; |
|
$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 1675 sub processHandGrade {
|
Line 1806 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}); |
my @collabstrs; |
foreach (@collaborators) { |
if (ref($ENV{'form.collaborator'.$ctr}) eq 'ARRAY') { |
my ($errorflag,$pts,$wgt) = |
@collabstrs=@{$ENV{'form.collaborator'.$ctr}}; |
&saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr}); |
} else { |
if ($errorflag eq 'not_allowed') { |
@collabstrs=$ENV{'form.collaborator'.$ctr}; |
$request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>"); |
} |
next; |
foreach my $collabstr (@collabstrs) { |
} else { |
my ($part,@collaborators) = split(/:/,$collabstr); |
if ($message ne '') { |
foreach (@collaborators) { |
$msgstatus = &Apache::lonmsg::user_normal_msg ($_,$udom, |
my ($errorflag,$pts,$wgt) = |
$ENV{'form.msgsub'}, |
&saveHandGrade($request,$url,$symb,$_,$udom,$ctr, |
$message); |
$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 1790 sub processHandGrade {
|
Line 1929 sub processHandGrade {
|
} |
} |
$ctr = 0; |
$ctr = 0; |
@parsedlist = reverse @parsedlist if ($button eq 'Previous'); |
@parsedlist = reverse @parsedlist if ($button eq 'Previous'); |
|
my ($partlist) = &response_type($url); |
foreach my $student (@parsedlist) { |
foreach my $student (@parsedlist) { |
|
my $submitonly=$ENV{'form.submitonly'}; |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
if ($ENV{'form.submitonly'} eq 'yes') { |
if ($submitonly =~ /^(yes|graded)$/) { |
my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); |
# my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname); |
my $statusflg = ''; |
my %status=&student_gradeStatus($url,$symb,$udom,$uname,$partlist); |
foreach (split(/:/,$ENV{'form.gradePartRespid'})){ |
my $submitted = 0; |
$statusflg = 1 if (exists ($record{'resource.'.$_.'.submission'})); |
my $graded = 1; |
|
foreach (keys(%status)) { |
|
$submitted = 1 if ($status{$_} ne 'nothing'); |
|
$graded = 0 if ($status{$_} =~ /^correct/); |
|
my ($foo,$partid,$foo1) = split(/\./,$_); |
|
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
|
$submitted = 0; |
|
} |
} |
} |
next if ($statusflg eq ''); |
next if (!$submitted && ($submitonly eq 'yes' || $submitonly eq 'graded')); |
|
next if (!$graded && $submitonly eq 'graded'); |
} |
} |
push @nextlist,$student if ($ctr < $ntstu); |
push @nextlist,$student if ($ctr < $ntstu); |
last if ($ctr == $ntstu); |
last if ($ctr == $ntstu); |
Line 1828 sub processHandGrade {
|
Line 1977 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 1836 sub saveHandGrade {
|
Line 1985 sub saveHandGrade {
|
my %newrecord = (); |
my %newrecord = (); |
my ($pts,$wgt) = ('',''); |
my ($pts,$wgt) = ('',''); |
foreach (split(/:/,$ENV{'form.partlist'.$newflg})) { |
foreach (split(/:/,$ENV{'form.partlist'.$newflg})) { |
|
#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 1856 sub saveHandGrade {
|
Line 2007 sub saveHandGrade {
|
$pts = ($ENV{'form.GD_BOX'.$newflg.'_'.$_} ne '' ? |
$pts = ($ENV{'form.GD_BOX'.$newflg.'_'.$_} ne '' ? |
$ENV{'form.GD_BOX'.$newflg.'_'.$_} : |
$ENV{'form.GD_BOX'.$newflg.'_'.$_} : |
$ENV{'form.RADVAL'.$newflg.'_'.$_}); |
$ENV{'form.RADVAL'.$newflg.'_'.$_}); |
return 'no_score' if ($pts eq '' && $ENV{'form.GD_SEL'.$newflg.'_'.$_} eq ''); |
if ($pts eq '' && $ENV{'form.GD_SEL'.$newflg.'_'.$_} eq '') { |
|
next; |
|
} |
$wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : |
$wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : |
$ENV{'form.WGT'.$newflg.'_'.$_}; |
$ENV{'form.WGT'.$newflg.'_'.$_}; |
my $partial= $pts/$wgt; |
my $partial= $pts/$wgt; |
next if ($partial eq $record{'resource.'.$_.'.awarded'}); #do not update score for part if not changed. |
if ($partial eq $record{'resource.'.$_.'.awarded'}) { |
$newrecord{'resource.'.$_.'.awarded'} = $partial |
#do not update score for part if not changed. |
if ($record{'resource.'.$_.'.awarded'} ne $partial); |
next; |
|
} |
|
if ($record{'resource.'.$_.'.awarded'} ne $partial) { |
|
$newrecord{'resource.'.$_.'.awarded'} = $partial; |
|
} |
my $reckey = 'resource.'.$_.'.solved'; |
my $reckey = 'resource.'.$_.'.solved'; |
if ($partial == 0) { |
if ($partial == 0) { |
$newrecord{$reckey} = 'incorrect_by_override' |
if ($record{$reckey} ne 'incorrect_by_override') { |
if ($record{$reckey} ne 'incorrect_by_override'); |
$newrecord{$reckey} = 'incorrect_by_override'; |
|
} |
} else { |
} else { |
$newrecord{$reckey} = 'correct_by_override' |
if ($record{$reckey} ne 'correct_by_override') { |
if ($record{$reckey} ne 'correct_by_override'); |
$newrecord{$reckey} = 'correct_by_override'; |
|
} |
|
} |
|
if ($submitter && |
|
($record{'resource.'.$_.'.submitted_by'} ne $submitter)) { |
|
$newrecord{'resource.'.$_.'.submitted_by'} = $submitter; |
} |
} |
$newrecord{'resource.'.$_.'.submitted_by'} = $submitter |
$newrecord{'resource.'.$_.'.regrader'}= |
if ($submitter && ($record{'resource.'.$_.'.submitted_by'} ne $submitter)); |
"$ENV{'user.name'}:$ENV{'user.domain'}"; |
$newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; |
|
} |
} |
} |
} |
|
|
if (scalar(keys(%newrecord)) > 0) { |
if (scalar(keys(%newrecord)) > 0) { |
&Apache::lonnet::cstore(\%newrecord,$symb, |
&Apache::lonnet::cstore(\%newrecord,$symb, |
$ENV{'request.course.id'},$domain,$stuname); |
$ENV{'request.course.id'},$domain,$stuname); |
Line 2098 sub viewgrades {
|
Line 2259 sub viewgrades {
|
my ($partid,$respid) = split (/_/,$_,2); |
my ($partid,$respid) = split (/_/,$_,2); |
next if $seen{$partid}; |
next if $seen{$partid}; |
$seen{$partid}++; |
$seen{$partid}++; |
my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_}); |
my $handgrade=$$handgrade{$_}; |
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 2140 sub viewgrades {
|
Line 2301 sub viewgrades {
|
$result.= '<table border=0><tr><td bgcolor="#777777">'."\n". |
$result.= '<table border=0><tr><td bgcolor="#777777">'."\n". |
'<table border=0><tr bgcolor="#deffff"><td> <b>No.</b> </td>'. |
'<table border=0><tr bgcolor="#deffff"><td> <b>No.</b> </td>'. |
'<td>'.&nameUserString('header')."</td>\n"; |
'<td>'.&nameUserString('header')."</td>\n"; |
my (@parts) = sort(&getpartlist($url)); |
my (@parts) = sort(&getpartlist($url,$symb)); |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
$display =~ s|^Number of Attempts|Tries<br />|; # makes the column narrower |
$display =~ s|^Number of Attempts|Tries<br />|; # makes the column narrower |
Line 2257 sub editgrades {
|
Line 2418 sub editgrades {
|
my %columns = (); |
my %columns = (); |
my ($i,$ctr,$count,$rec_update) = (0,0,0,0); |
my ($i,$ctr,$count,$rec_update) = (0,0,0,0); |
|
|
my (@parts) = sort(&getpartlist($url)); |
my (@parts) = sort(&getpartlist($url,$symb)); |
my $header; |
my $header; |
while ($ctr < $ENV{'form.totalparts'}) { |
while ($ctr < $ENV{'form.totalparts'}) { |
my $partid = $ENV{'form.partid_'.$ctr}; |
my $partid = $ENV{'form.partid_'.$ctr}; |
Line 2522 ENDPICK
|
Line 2683 ENDPICK
|
} |
} |
|
|
sub csvupload_fields { |
sub csvupload_fields { |
my ($url) = @_; |
my ($url,$symb) = @_; |
my (@parts) = &getpartlist($url); |
my (@parts) = &getpartlist($url,$symb); |
my @fields=(['username','Student Username'],['domain','Student Domain']); |
my @fields=(['username','Student Username'],['domain','Student Domain']); |
foreach my $part (sort(@parts)) { |
foreach my $part (sort(@parts)) { |
my @datum; |
my @datum; |
Line 2606 sub csvuploadmap {
|
Line 2767 sub csvuploadmap {
|
&csvuploadmap_header($request,$symb,$url,$datatoken,$#records+1); |
&csvuploadmap_header($request,$symb,$url,$datatoken,$#records+1); |
my ($i,$keyfields); |
my ($i,$keyfields); |
if (@records) { |
if (@records) { |
my @fields=&csvupload_fields($url); |
my @fields=&csvupload_fields($url,$symb); |
|
|
if ($ENV{'form.upfile_associate'} eq 'reverse') { |
if ($ENV{'form.upfile_associate'} eq 'reverse') { |
&Apache::loncommon::csv_print_samples($request,\@records); |
&Apache::loncommon::csv_print_samples($request,\@records); |
Line 2755 LISTJAVASCRIPT
|
Line 2916 LISTJAVASCRIPT
|
$result.='<input type="hidden" name="page" />'."\n". |
$result.='<input type="hidden" name="page" />'."\n". |
'<input type="hidden" name="title" />'."\n"; |
'<input type="hidden" name="title" />'."\n"; |
|
|
$result.=' <b>View Problems Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n". |
$result.=' <b>View Problems Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n". |
'<input type="radio" name="vProb" value="yes" /> yes '."<br>\n"; |
'<input type="radio" name="vProb" value="yes" /> yes '."<br>\n"; |
|
|
$result.=' <b>Submission Details: </b>'. |
$result.=' <b>Submission Details: </b>'. |
Line 2894 sub displayPage {
|
Line 3055 sub displayPage {
|
$studentTable.='<tr bgcolor="#ffffe6"><td align="center" valign="top" >'.$question. |
$studentTable.='<tr bgcolor="#ffffe6"><td align="center" valign="top" >'.$question. |
(scalar(@{$parts}) == 1 ? '' : '<br>('.scalar(@{$parts}).' parts)').'</td>'; |
(scalar(@{$parts}) == 1 ? '' : '<br>('.scalar(@{$parts}).' parts)').'</td>'; |
$studentTable.='<td valign="top">'; |
$studentTable.='<td valign="top">'; |
if ($ENV{'form.vProb'} eq 'yes') { |
if ($ENV{'form.vProb'} eq 'yes' ) { |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1); |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
|
undef,'both'); |
} else { |
} else { |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$ENV{'request.course.id'}); |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$ENV{'request.course.id'}); |
$companswer =~ s|<form(.*?)>||g; |
$companswer =~ s|<form(.*?)>||g; |
Line 2916 sub displayPage {
|
Line 3078 sub displayPage {
|
} else { |
} else { |
my %responseType = (); |
my %responseType = (); |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
$responseType{$partid} = $curRes->responseType($partid); |
my @responseIds =$curRes->responseIds($partid); |
|
my @responseType =$curRes->responseType($partid); |
|
my %responseIds; |
|
for (my $i=0;$i<=$#responseIds;$i++) { |
|
$responseIds{$responseIds[$i]}=$responseType[$i]; |
|
} |
|
$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') { |
my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : ''); |
Line 2953 sub displayPage {
|
Line 3122 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 2961 sub displaySubByDates {
|
Line 3130 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; |
return '<br /> <font color="red">Nothing submitted - no attempts</font><br />' |
if (!exists($$record{'1:timestamp'})) { |
if (!exists($$record{'1:timestamp'})); |
return '<br /> <font color="red">Nothing submitted - no attempts</font><br />'; |
|
} |
for ($version=1;$version<=$$record{'version'};$version++) { |
for ($version=1;$version<=$$record{'version'};$version++) { |
my $timestamp = scalar(localtime($$record{$version.':timestamp'})); |
my $timestamp = scalar(localtime($$record{$version.':timestamp'})); |
$studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>'; |
$studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>'; |
my @versionKeys = split(/\:/,$$record{$version.':keys'}); |
my @versionKeys = split(/\:/,$$record{$version.':keys'}); |
my @displaySub = (); |
my @displaySub = (); |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
my @matchKey = grep /^resource\.$partid\..*?\.submission$/,@versionKeys; |
my @matchKey = sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys); |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
# next if ($$record{"$version:resource.$partid.solved"} eq ''); |
$displaySub[0].=(exists $$record{$version.':'.$matchKey[0]}) ? |
foreach my $matchKey (@matchKey) { |
'<b>Part '.$partid.' '. |
if (exists $$record{$version.':'.$matchKey}) { |
($$record{"$version:resource.$partid.tries"} eq '' ? 'Trial not counted' : |
my ($responseId)=($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/); |
'Trial '.$$record{"$version:resource.$partid.tries"}).'</b> '. |
$displaySub[0].='<b>Part '.$partid.' '; |
&cleanRecord($$record{$version.':'.$matchKey[0]},$$responseType{$partid},$$symbx).'<br />' : ''; |
$displaySub[0].='<font color="#999999">(ID '. |
$displaySub[1].=(exists $$record{"$version:resource.$partid.award"}) ? |
$responseId.')</font> '; |
'<b>Part '.$partid.'</b> '. |
if ($$record{"$version:resource.$partid.tries"} eq '') { |
lc($$record{"$version:resource.$partid.award"}).' '. |
$displaySub[0].='Trial not counted'; |
$mark{$$record{"$version:resource.$partid.solved"}}.'<br />' : ''; |
} else { |
$displaySub[2].=(exists $$record{"$version:resource.$partid.regrader"}) ? |
$displaySub[0].='Trial '. |
$$record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : ''; |
$$record{"$version:resource.$partid.tries"}; |
} |
} |
$displaySub[2].=(exists $$record{"$version:resource.regrader"}) ? |
my $responseType=$responseType->{$partid}->{$responseId}; |
$$record{"$version:resource.regrader"} : ''; # needed because old essay regrader has not parts info |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
$studentTable.='<td>'.$displaySub[0].' </td><td>'.$displaySub[1]. |
if (!exists($orders{$partid}->{$responseId})) { |
($displaySub[2] eq '' ? '' : 'Manually graded by '.$displaySub[2]).' </td></tr>'; |
$orders{$partid}->{$responseId}= |
|
&get_order($partid,$responseId,$symb,$uname,$udom); |
|
} |
|
$displaySub[0].='</b> '. |
|
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:").'<br />'; |
|
} |
|
} |
|
if (exists $$record{"$version:resource.$partid.award"}) { |
|
$displaySub[1].='<b>Part '.$partid.'</b> '. |
|
lc($$record{"$version:resource.$partid.award"}).' '. |
|
$mark{$$record{"$version:resource.$partid.solved"}}. |
|
'<br />'; |
|
} |
|
if (exists $$record{"$version:resource.$partid.regrader"}) { |
|
$displaySub[2].=$$record{"$version:resource.$partid.regrader"}. |
|
' (<b>Part:</b> '.$partid.')'; |
|
} |
|
} |
|
# needed because old essay regrader has not parts info |
|
if (exists $$record{"$version:resource.regrader"}) { |
|
$displaySub[2].=$$record{"$version:resource.regrader"}; |
|
} |
|
$studentTable.='<td>'.$displaySub[0].' </td><td>'.$displaySub[1]; |
|
if ($displaySub[2]) { |
|
$studentTable.='Manually graded by '.$displaySub[2]; |
|
} |
|
$studentTable.=' </td></tr>'; |
|
|
} |
} |
$studentTable.='</table></td></tr></table>'; |
$studentTable.='</table></td></tr></table>'; |
return $studentTable; |
return $studentTable; |
Line 3189 sub scantron_selectphase {
|
Line 3387 sub scantron_selectphase {
|
my $result; |
my $result; |
$result.= <<SCANTRONFORM; |
$result.= <<SCANTRONFORM; |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process"> |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process"> |
<input type="hidden" name="command" value="scantron_process" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
$default_form_data |
$default_form_data |
<table width="100%" border="0"> |
<table width="100%" border="0"> |
<tr> |
<tr> |
Line 3219 sub scantron_selectphase {
|
Line 3417 sub scantron_selectphase {
|
</td> |
</td> |
</tr> |
</tr> |
</table> |
</table> |
<input type="submit" value="Submit" /> |
<input type="submit" value="Validate Scantron Records" /> |
</form> |
</form> |
$grading_menu_button |
$grading_menu_button |
SCANTRONFORM |
SCANTRONFORM |
Line 3301 sub scantron_parse_scanline {
|
Line 3499 sub scantron_parse_scanline {
|
} |
} |
|
|
sub scantron_add_delay { |
sub scantron_add_delay { |
|
my ($delayqueue,$scanline,$errormessage,$errorcode)=@_; |
|
Apache->request->print('add_delay_error '.$_[2] ); |
|
push(@$delayqueue, |
|
{'line' => $scanline, 'emsg' => $errormessage, |
|
'ecode' => $errorcode } |
|
); |
} |
} |
|
|
sub scantron_find_student { |
sub scantron_find_student { |
my ($scantron_record,$idmap)=@_; |
my ($scantron_record,$idmap)=@_; |
my $scanID=$$scantron_record{'scantron.ID'}; |
my $scanID=$$scantron_record{'scantron.ID'}; |
foreach my $id (keys(%$idmap)) { |
foreach my $id (keys(%$idmap)) { |
Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>'); |
#Apache->request->print('<pre>checking studnet -'.$id.'- againt -'.$scanID.'- </pre>'); |
if (lc($id) eq lc($scanID)) { Apache->request->print('success');return $$idmap{$id}; } |
if (lc($id) eq lc($scanID)) { |
|
#Apache->request->print('success'); |
|
return $$idmap{$id}; |
|
} |
} |
} |
return undef; |
return undef; |
} |
} |
Line 3321 sub scantron_filter {
|
Line 3528 sub scantron_filter {
|
return 0; |
return 0; |
} |
} |
|
|
|
#FIXME I think I am doing this in the wrong order, I think it would be |
|
#better to make a several passes analyzing all of the lines in the |
|
#file for common errors wrong/invalid PID/username duplicated |
|
#PID/username, missing bubbles, double bubbles, missing/invalid CODE |
|
#and then get the instructor to fix all of these errors, then grade |
|
#the corrected one, I'll still need to catch error conditions, but |
|
#maybe most will taken care even before we start |
|
|
|
sub scantron_validate_file { |
|
my ($r) = @_; |
|
} |
|
|
sub scantron_process_students { |
sub scantron_process_students { |
my ($r) = @_; |
my ($r) = @_; |
my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($ENV{'form.selectpage'}); |
my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($ENV{'form.selectpage'}); |
Line 3336 sub scantron_process_students {
|
Line 3555 sub scantron_process_students {
|
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $map=$navmap->getResourceByUrl($sequence); |
my $map=$navmap->getResourceByUrl($sequence); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
$r->print("geto ".scalar(@resources)."<br />"); |
# $r->print("geto ".scalar(@resources)."<br />"); |
my $result= <<SCANTRONFORM; |
my $result= <<SCANTRONFORM; |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload"> |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload"> |
<input type="hidden" name="command" value="scantron_configphase" /> |
<input type="hidden" name="command" value="scantron_configphase" /> |
Line 3345 SCANTRONFORM
|
Line 3564 SCANTRONFORM
|
$r->print($result); |
$r->print($result); |
|
|
my @delayqueue; |
my @delayqueue; |
my $totalcorrect; |
my %completedstudents; |
my $totalincorrect; |
|
|
|
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r, |
'Scantron Status','Scantron Progress',scalar(@scanlines)); |
'Scantron Status','Scantron Progress',scalar(@scanlines)); |
|
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
|
'Processing first student'); |
|
my $start=&Time::HiRes::time(); |
foreach my $line (@scanlines) { |
foreach my $line (@scanlines) { |
my $studentcorrect; |
$r->print('<pre>line is'.$line.'</pre>'); |
my $studentincorrect; |
|
|
|
chomp($line); |
chomp($line); |
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
my ($uname,$udom); |
my ($uname,$udom); |
if ($uname=&scantron_find_student($scan_record,\%idmap)) { |
unless ($uname=&scantron_find_student($scan_record,\%idmap)) { |
&scantron_add_delay(\@delayqueue,$line, |
&scantron_add_delay(\@delayqueue,$line, |
'Unable to find a student that matches'); |
'Unable to find a student that matches',1); |
|
next; |
|
} |
|
if (exists $completedstudents{$uname}) { |
|
&scantron_add_delay(\@delayqueue,$line, |
|
'Student '.$uname.' has multiple sheets',2); |
|
next; |
} |
} |
$r->print('<pre>doing studnet'.$uname.'</pre>'); |
$r->print('<pre>doing studnet'.$uname.'</pre>'); |
($uname,$udom)=split(/:/,$uname); |
($uname,$udom)=split(/:/,$uname); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::appenv(%$scan_record); |
&Apache::lonnet::appenv(%$scan_record); |
# &Apache::lonhomework::showhash(%ENV); |
# &Apache::lonhomework::showhash(%ENV); |
$Apache::lonxml::debug=1; |
# $Apache::lonxml::debug=1; |
&Apache::lonxml::debug("line is $line"); |
# &Apache::lonxml::debug("line is $line"); |
|
|
my $i=0; |
my $i=0; |
foreach my $resource (@resources) { |
foreach my $resource (@resources) { |
Line 3379 SCANTRONFORM
|
Line 3605 SCANTRONFORM
|
'grade_domain' =>$udom, |
'grade_domain' =>$udom, |
'grade_courseid'=>$ENV{'request.course.id'}, |
'grade_courseid'=>$ENV{'request.course.id'}, |
'grade_symb' =>$resource->symb())); |
'grade_symb' =>$resource->symb())); |
my %score=&Apache::lonnet::restore($resource->symb(), |
# my %score=&Apache::lonnet::restore($resource->symb(), |
$ENV{'request.course.id'}, |
# $ENV{'request.course.id'}, |
$udom,$uname); |
# $udom,$uname); |
foreach my $part ($resource->{PARTS}) { |
# foreach my $part ($resource->{PARTS}) { |
if ($score{'resource.'.$part.'.solved'} =~ /^correct/) { |
# if ($score{'resource.'.$part.'.solved'} =~ /^correct/) { |
$studentcorrect++; |
# $studentcorrect++; |
$totalcorrect++; |
# $totalcorrect++; |
} else { |
# } else { |
$studentincorrect++; |
# $studentincorrect++; |
$totalincorrect++; |
# $totalincorrect++; |
} |
# } |
} |
# } |
$r->print('<pre>'. |
# $r->print('<pre>'. |
$resource->symb().'-'. |
# $resource->symb().'-'. |
$resource->src().'-'.'</pre>result is'.$result); |
# $resource->src().'-'.'</pre>result is'.$result); |
&Apache::lonhomework::showhash(%score); |
# &Apache::lonhomework::showhash(%score); |
# if ($i eq 3) {last;} |
# if ($i eq 3) {last;} |
} |
} |
|
$completedstudents{$uname}={'line'=>$line}; |
|
} continue { |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('form.counter'); |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonnet::delenv('scantron\.'); |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
'last student Who got a '.$studentcorrect.' correct and '. |
'last student'); |
$studentincorrect.' incorrect. The class has gotten '. |
#last; |
$totalcorrect.' correct and '.$totalincorrect.' incorrect'); |
|
last; |
|
#FIXME |
#FIXME |
#get iterator for $sequence |
#get iterator for $sequence |
#foreach question 'submit' the students answer to the server |
#foreach question 'submit' the students answer to the server |
Line 3411 SCANTRONFORM
|
Line 3637 SCANTRONFORM
|
# generate data to pass back that includes grade recevied |
# generate data to pass back that includes grade recevied |
#} |
#} |
} |
} |
$Apache::lonxml::debug=0; |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
my $lasttime = &Time::HiRes::time()-$start; |
|
$r->print("<p>took $lasttime</p>"); |
|
|
|
#$Apache::lonxml::debug=0; |
foreach my $delay (@delayqueue) { |
foreach my $delay (@delayqueue) { |
#FIXME |
#FIXME |
#print out each delayed student with interface to select how |
#print out each delayed student with interface to select how |
Line 3478 sub gradingmenu {
|
Line 3708 sub gradingmenu {
|
} |
} |
formname.command.value = cmd; |
formname.command.value = cmd; |
formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+ |
formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+ |
":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); |
":saveSub="+pullDownSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status); |
if (val < 5) formname.submit(); |
if (val < 5) formname.submit(); |
if (val == 5) { |
if (val == 5) { |
if (!checkReceiptNo(formname,'notOK')) { return false;} |
if (!checkReceiptNo(formname,'notOK')) { return false;} |
Line 3546 GRADINGMENUJS
|
Line 3776 GRADINGMENUJS
|
|
|
$result.='<tr bgcolor="#ffffe6"valign="top"><td>'. |
$result.='<tr bgcolor="#ffffe6"valign="top"><td>'. |
'<input type="radio" name="radioChoice" value="submission" '. |
'<input type="radio" name="radioChoice" value="submission" '. |
($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students'. |
($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students '. |
'<br /> -->For students with '. |
'<select name="submitonly">'. |
'<input type="radio" name="submitonly" value="yes" '. |
'<option value="yes" '. |
($saveSub eq 'yes' ? 'checked' : '').' /> submissions or '. |
($saveSub eq 'yes' ? 'selected="on"' : '').'>with submissions</option>'. |
'<input type="radio" name="submitonly" value="all" '. |
'<option value="graded" '. |
($saveSub eq 'all' ? 'checked' : '').' /> for all</td></tr>'."\n"; |
($saveSub eq 'graded' ? 'selected="on"' : '').'>with ungraded submissions</option>'. |
|
'<option value="all" '. |
|
($saveSub eq 'all' ? 'selected="on"' : '').'>with any status</option></select></td></tr>'."\n"; |
|
|
$result.='<tr bgcolor="#ffffe6"valign="top"><td>'. |
$result.='<tr bgcolor="#ffffe6"valign="top"><td>'. |
'<input type="radio" name="radioChoice" value="viewgrades" '. |
'<input type="radio" name="radioChoice" value="viewgrades" '. |
Line 3597 sub handler {
|
Line 3829 sub handler {
|
|
|
undef(%perm); |
undef(%perm); |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
$request->content_type('text/xml'); |
&Apache::loncommon::content_type($request,'text/xml'); |
} else { |
} else { |
$request->content_type('text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
} |
} |
$request->send_http_header; |
$request->send_http_header; |
return '' if $request->header_only; |
return '' if $request->header_only; |
Line 3694 sub handler {
|
Line 3926 sub handler {
|
} |
} |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
$request->print(&scantron_selectphase($request)); |
$request->print(&scantron_selectphase($request)); |
|
} elsif ($command eq 'scantron_validate' && $perm{'mgr'}) { |
|
$request->print(&scantron_validate_file($request)); |
} elsif ($command eq 'scantron_process' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_process' && $perm{'mgr'}) { |
$request->print(&scantron_process_students($request)); |
$request->print(&scantron_process_students($request)); |
} elsif ($command) { |
} elsif ($command) { |
Line 3713 sub send_header {
|
Line 3947 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 { |