version 1.596.2.12.2.60.2.6, 2024/08/23 20:52:28
|
version 1.596.2.12.2.61, 2024/07/01 22:51:46
|
Line 46 use Apache::lonenc;
|
Line 46 use Apache::lonenc;
|
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
use Apache::bridgetask(); |
use Apache::bridgetask(); |
use Apache::lontexconvert(); |
use Apache::lontexconvert(); |
use String::Similarity; |
|
use HTML::Parser(); |
use HTML::Parser(); |
use File::MMagic; |
use File::MMagic; |
|
use String::Similarity; |
use LONCAPA; |
use LONCAPA; |
|
|
use POSIX qw(floor); |
use POSIX qw(floor); |
Line 118 sub getpartlist {
|
Line 118 sub getpartlist {
|
my $res = $navmap->getBySymb($symb); |
my $res = $navmap->getBySymb($symb); |
my $partlist = $res->parts(); |
my $partlist = $res->parts(); |
my $url = $res->src(); |
my $url = $res->src(); |
my $toolsymb; |
my @metakeys = split(/,/,&Apache::lonnet::metadata($url,'keys')); |
if ($url =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
|
my @metakeys = split(/,/,&Apache::lonnet::metadata($url,'keys',$toolsymb)); |
|
|
|
my @stores; |
my @stores; |
foreach my $part (@{ $partlist }) { |
foreach my $part (@{ $partlist }) { |
Line 303 sub showResourceInfo {
|
Line 299 sub showResourceInfo {
|
} else { |
} else { |
return '<br clear="all" />'; |
return '<br clear="all" />'; |
} |
} |
} |
} |
return $result; |
return $result; |
} |
} |
|
|
Line 590 sub cleanRecord {
|
Line 586 sub cleanRecord {
|
return $result; |
return $result; |
} |
} |
} elsif ( $response =~ m/(?:numerical|formula|custom)/) { |
} elsif ( $response =~ m/(?:numerical|formula|custom)/) { |
# Respect multiple input fields, see Bug #5409 |
# Respect multiple input fields, see Bug #5409 |
$answer = |
$answer = |
&Apache::loncommon::format_previous_attempt_value('submission', |
&Apache::loncommon::format_previous_attempt_value('submission', |
$answer); |
$answer); |
Line 1041 sub verifyreceipt {
|
Line 1037 sub verifyreceipt {
|
sub listStudents { |
sub listStudents { |
my ($request,$symb,$submitonly,$divforres) = @_; |
my ($request,$symb,$submitonly,$divforres) = @_; |
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my $cdom = $env{"course.$env{'request.course.id'}.domain"}; |
my $cdom = $env{"course.$env{'request.course.id'}.domain"}; |
my $cnum = $env{"course.$env{'request.course.id'}.num"}; |
my $cnum = $env{"course.$env{'request.course.id'}.num"}; |
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
Line 1108 LISTJAVASCRIPT
|
Line 1103 LISTJAVASCRIPT
|
"\n".$table; |
"\n".$table; |
|
|
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
unless ($is_tool) { |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n" |
.'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
|
} |
|
|
|
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; |
$env{'form.Status'} = $saveStatus; |
$env{'form.Status'} = $saveStatus; |
my %optiontext; |
my %optiontext = &Apache::lonlocal::texthash ( |
if ($is_tool) { |
|
%optiontext = &Apache::lonlocal::texthash ( |
|
lastonly => 'last transaction', |
|
last => 'last transaction with details', |
|
datesub => 'all transactions', |
|
all => 'all transactions with details', |
|
); |
|
} else { |
|
%optiontext = &Apache::lonlocal::texthash ( |
|
lastonly => 'last submission', |
lastonly => 'last submission', |
last => 'last submission with details', |
last => 'last submission with details', |
datesub => 'all submissions', |
datesub => 'all submissions', |
all => 'all submissions with details', |
all => 'all submissions with details', |
); |
); |
} |
|
my $submission_options = |
my $submission_options = |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="lastonly" /> '. |
'<label><input type="radio" name="lastSub" value="lastonly" /> '. |
Line 1153 LISTJAVASCRIPT
|
Line 1136 LISTJAVASCRIPT
|
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
$optiontext{'all'}.'</label></span>'; |
$optiontext{'all'}.'</label></span>'; |
my $viewtitle; |
|
if ($is_tool) { |
|
$viewtitle = &mt('View Transactions'); |
|
} else { |
|
$viewtitle = &mt('View Submissions'); |
|
} |
|
my ($compmsg,$nocompmsg); |
my ($compmsg,$nocompmsg); |
$nocompmsg = ' checked="checked"'; |
$nocompmsg = ' checked="checked"'; |
if ($numessay) { |
if ($numessay) { |
$compmsg = $nocompmsg; |
$compmsg = $nocompmsg; |
$nocompmsg = ''; |
$nocompmsg = ''; |
} |
} |
$gradeTable .= &Apache::lonhtmlcommon::row_title($viewtitle) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Submissions')) |
.$submission_options; |
.$submission_options; |
# Check if any gradable |
# Check if any gradable |
my $showmore; |
my $showmore; |
Line 1230 LISTJAVASCRIPT
|
Line 1207 LISTJAVASCRIPT
|
} |
} |
$gradeTable .= &Apache::lonhtmlcommon::row_closure(1) |
$gradeTable .= &Apache::lonhtmlcommon::row_closure(1) |
.&Apache::lonhtmlcommon::end_pick_box(); |
.&Apache::lonhtmlcommon::end_pick_box(); |
my $regrademsg; |
|
if ($is_tool) { |
|
$regrademsg =&mt("To view/grade/regrade, click on the check box(es) next to the student's name(s). Then click on the Next button."); |
|
} else { |
|
$regrademsg = &mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button."); |
|
} |
|
$gradeTable .= '<p>' |
$gradeTable .= '<p>' |
.$regrademsg."\n" |
.&mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n" |
.'<input type="hidden" name="command" value="processGroup" />' |
.'<input type="hidden" name="command" value="processGroup" />' |
.'</p>'; |
.'</p>'; |
|
|
Line 1672 INNERJS
|
Line 1644 INNERJS
|
my $end_page_msg_central = |
my $end_page_msg_central = |
&Apache::loncommon::end_page({'js_ready' => 1}); |
&Apache::loncommon::end_page({'js_ready' => 1}); |
|
|
|
|
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); |
$docopen=~s/^document\.//; |
$docopen=~s/^document\.//; |
|
|
Line 2308 sub submission {
|
Line 2281 sub submission {
|
|
|
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
my $probtitle=&Apache::lonnet::gettitle($symb); |
my $probtitle=&Apache::lonnet::gettitle($symb); |
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my ($essayurl,%coursedesc_by_cid); |
my ($essayurl,%coursedesc_by_cid); |
|
|
if (!&canview($usec)) { |
if (!&canview($usec)) { |
Line 2330 sub submission {
|
Line 2302 sub submission {
|
} |
} |
|
|
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
unless ($is_tool) { |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
|
} |
|
if (($numessay) && ($calledby eq 'submission') && (!exists($env{'form.compmsg'}))) { |
if (($numessay) && ($calledby eq 'submission') && (!exists($env{'form.compmsg'}))) { |
$env{'form.compmsg'} = 1; |
$env{'form.compmsg'} = 1; |
} |
} |
Line 2526 sub submission {
|
Line 2496 sub submission {
|
# Display student info |
# Display student info |
$request->print(($counter == 0 ? '' : '<br />')); |
$request->print(($counter == 0 ? '' : '<br />')); |
|
|
my $boxtitle = &mt('Submissions'); |
|
if ($is_tool) { |
|
$boxtitle = &mt('Transactions') |
|
} |
|
my $result='<div class="LC_Box">' |
my $result='<div class="LC_Box">' |
.'<h3 class="LC_hcell">'.$boxtitle.'</h3>'; |
.'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; |
$result.='<input type="hidden" name="name'.$counter. |
$result.='<input type="hidden" name="name'.$counter. |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
'" value="'.$env{'form.fullname'}.'" />'."\n"; |
if (($numresp > $numessay) && !$is_tool) { |
if ($numresp > $numessay) { |
$result.='<p class="LC_info">' |
$result.='<p class="LC_info">' |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
.&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon) |
."</p>\n"; |
."</p>\n"; |
Line 2557 sub submission {
|
Line 2523 sub submission {
|
# (3) All transactions (by date) |
# (3) All transactions (by date) |
# (4) The whole record (with detailed information for all transactions) |
# (4) The whole record (with detailed information for all transactions) |
|
|
my ($lastsubonly,$partinfo) = |
my ($string,$timestamp,$lastgradetime,$lastsubmittime) = |
&show_last_submission($uname,$udom,$symb,$essayurl,$responseType,$env{'form.lastSub'}, |
&get_last_submission(\%record); |
$is_tool,$fullname,\%record,\%coursedesc_by_cid); |
|
$request->print($partinfo); |
my $lastsubonly; |
$request->print($lastsubonly); |
|
|
|
|
if ($timestamp eq '') { |
|
$lastsubonly.='<div class="LC_grade_submissions_body">'.$string->[0].'</div>'; |
|
} else { |
|
my ($shownsubmdate,$showngradedate); |
|
if ($lastsubmittime && $lastgradetime) { |
|
$shownsubmdate = &Apache::lonlocal::locallocaltime($lastsubmittime); |
|
if ($lastgradetime > $lastsubmittime) { |
|
$showngradedate = &Apache::lonlocal::locallocaltime($lastgradetime); |
|
} |
|
} else { |
|
$shownsubmdate = $timestamp; |
|
} |
|
$lastsubonly = |
|
'<div class="LC_grade_submissions_body">' |
|
.'<b>'.&mt('Date Submitted:').'</b> '.$shownsubmdate."\n"; |
|
if ($showngradedate) { |
|
$lastsubonly .= '<br /><b>'.&mt('Date Graded:').'</b> '.$showngradedate."\n"; |
|
} |
|
|
|
my %seenparts; |
|
my @part_response_id = &flatten_responseType($responseType); |
|
foreach my $part (@part_response_id) { |
|
my ($partid,$respid) = @{ $part }; |
|
my $display_part=&get_display_part($partid,$symb); |
|
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
|
if (exists($seenparts{$partid})) { next; } |
|
$seenparts{$partid}=1; |
|
$request->print( |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <b>'.&mt('Collaborative submission by: [_1]', |
|
'<a href="javascript:viewSubmitter(\''. |
|
$env{"form.$uname:$udom:$partid:submitted_by"}. |
|
'\');" target="_self">'. |
|
$$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>'). |
|
'<br />'); |
|
next; |
|
} |
|
my $responsetype = $responseType->{$partid}->{$respid}; |
|
if (!exists($record{"resource.$partid.$respid.submission"})) { |
|
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <span class="LC_internal_info">'. |
|
'('.&mt('Response ID: [_1]',$respid).')'. |
|
'</span> '. |
|
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>'; |
|
next; |
|
} |
|
foreach my $submission (@$string) { |
|
my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
|
if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } |
|
my ($ressub,$hide,$draft,$subval) = split(/:/,$submission,4); |
|
# Similarity check |
|
my $similar=''; |
|
my ($type,$trial,$rndseed); |
|
if ($hide eq 'rand') { |
|
$type = 'randomizetry'; |
|
$trial = $record{"resource.$partid.tries"}; |
|
$rndseed = $record{"resource.$partid.rndseed"}; |
|
} |
|
if ($env{'form.checkPlag'}) { |
|
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
|
&most_similar($uname,$udom,$symb,$subval); |
|
if ($osim) { |
|
$osim=int($osim*100.0); |
|
if ($hide eq 'anon') { |
|
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
|
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
|
} else { |
|
$similar='<hr />'; |
|
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
|
$similar .= '<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2]', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
|
'</span></h3>'; |
|
} elsif ($ocrsid ne '') { |
|
my %old_course_desc; |
|
if (ref($coursedesc_by_cid{$ocrsid}) eq 'HASH') { |
|
%old_course_desc = %{$coursedesc_by_cid{$ocrsid}}; |
|
} else { |
|
my $args; |
|
if ($ocrsid ne $env{'request.course.id'}) { |
|
$args = {'one_time' => 1}; |
|
} |
|
%old_course_desc = |
|
&Apache::lonnet::coursedescription($ocrsid,$args); |
|
$coursedesc_by_cid{$ocrsid} = \%old_course_desc; |
|
} |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
|
$old_course_desc{'description'}, |
|
$old_course_desc{'num'}, |
|
$old_course_desc{'domain'}). |
|
'</span></h3>'; |
|
} else { |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in an unknown course', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
|
'</span></h3>'; |
|
} |
|
$similar .= '<blockquote><i>'. |
|
&keywords_highlight($oessay). |
|
'</i></blockquote><hr />'; |
|
} |
|
} |
|
} |
|
my $order=&get_order($partid,$respid,$symb,$uname,$udom, |
|
undef,$type,$trial,$rndseed); |
|
if (($env{'form.lastSub'} eq 'lastonly') || |
|
($env{'form.lastSub'} eq 'datesub') || |
|
($env{'form.lastSub'} =~ /^(last|all)$/)) { |
|
my $display_part=&get_display_part($partid,$symb); |
|
$lastsubonly.='<div class="LC_grade_submission_part">'. |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <span class="LC_internal_info">'. |
|
'('.&mt('Response ID: [_1]',$respid).')'. |
|
'</span> '; |
|
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); |
|
if (@$files) { |
|
if ($hide eq 'anon') { |
|
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
|
} else { |
|
$lastsubonly.='<br /><br />'.'<b>'.&mt('Submitted Files:').'</b>' |
|
.'<br /><span class="LC_warning">'; |
|
if(@$files == 1) { |
|
$lastsubonly .= &mt('Like all files provided by users, this file may contain viruses!'); |
|
} else { |
|
$lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!'); |
|
} |
|
$lastsubonly .= '</span>'; |
|
foreach my $file (@$files) { |
|
&Apache::lonnet::allowuploaded('/adm/grades',$file); |
|
$lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>'; |
|
} |
|
} |
|
$lastsubonly.='<br />'; |
|
} |
|
if ($hide eq 'anon') { |
|
$lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; |
|
} else { |
|
$lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'; |
|
if ($draft) { |
|
$lastsubonly.= ' <span class="LC_warning">'.&mt('Draft Copy').'</span>'; |
|
} |
|
$subval = |
|
&cleanRecord($subval,$responsetype,$symb,$partid, |
|
$respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed); |
|
if ($responsetype eq 'essay') { |
|
$subval =~ s{\n}{<br />}g; |
|
} |
|
$lastsubonly.=$subval."\n"; |
|
} |
|
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
|
$lastsubonly.='</div>'; |
|
} |
|
} |
|
} |
|
$lastsubonly.='</div>'."\n"; # End: LC_grade_submissions_body |
|
} |
|
$request->print($lastsubonly); |
if ($env{'form.lastSub'} eq 'datesub') { |
if ($env{'form.lastSub'} eq 'datesub') { |
my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); |
my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom)); |
Line 2615 sub submission {
|
Line 2745 sub submission {
|
my %seen = (); |
my %seen = (); |
my @partlist; |
my @partlist; |
my @gradePartRespid; |
my @gradePartRespid; |
my @part_response_id; |
my @part_response_id = &flatten_responseType($responseType); |
if ($is_tool) { |
|
@part_response_id = ([0,'']); |
|
} else { |
|
@part_response_id = &flatten_responseType($responseType); |
|
} |
|
$request->print( |
$request->print( |
'<div class="LC_Box">' |
'<div class="LC_Box">' |
.'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' |
.'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' |
Line 2686 sub submission {
|
Line 2811 sub submission {
|
return ''; |
return ''; |
} |
} |
|
|
sub show_last_submission { |
|
my ($uname,$udom,$symb,$essayurl,$responseType,$viewtype,$is_tool,$fullname, |
|
$record,$coursedesc_by_cid) = @_; |
|
my ($string,$timestamp,$lastgradetime,$lastsubmittime) = |
|
&get_last_submission($record,$is_tool); |
|
|
|
my ($lastsubonly,$partinfo); |
|
if ($timestamp eq '') { |
|
$lastsubonly.='<div class="LC_grade_submissions_body">'.$string->[0].'</div>'; |
|
} elsif ($is_tool) { |
|
$lastsubonly = |
|
'<div class="LC_grade_submissions_body">' |
|
.'<b>'.&mt('Date Grade Passed Back:').'</b> '.$timestamp."</div>\n"; |
|
} else { |
|
my ($shownsubmdate,$showngradedate); |
|
if ($lastsubmittime && $lastgradetime) { |
|
$shownsubmdate = &Apache::lonlocal::locallocaltime($lastsubmittime); |
|
if ($lastgradetime > $lastsubmittime) { |
|
$showngradedate = &Apache::lonlocal::locallocaltime($lastgradetime); |
|
} |
|
} else { |
|
$shownsubmdate = $timestamp; |
|
} |
|
$lastsubonly = |
|
'<div class="LC_grade_submissions_body">' |
|
.'<b>'.&mt('Date Submitted:').'</b> '.$shownsubmdate."\n"; |
|
if ($showngradedate) { |
|
$lastsubonly .= '<br /><b>'.&mt('Date Graded:').'</b> '.$showngradedate."\n"; |
|
} |
|
|
|
my %seenparts; |
|
my @part_response_id = &flatten_responseType($responseType); |
|
foreach my $part (@part_response_id) { |
|
my ($partid,$respid) = @{ $part }; |
|
my $display_part=&get_display_part($partid,$symb); |
|
if ($env{"form.$uname:$udom:$partid:submitted_by"}) { |
|
if (exists($seenparts{$partid})) { next; } |
|
$seenparts{$partid}=1; |
|
$partinfo .= |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <b>'.&mt('Collaborative submission by: [_1]', |
|
'<a href="javascript:viewSubmitter(\''. |
|
$env{"form.$uname:$udom:$partid:submitted_by"}. |
|
'\');" target="_self">'. |
|
$$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>'). |
|
'<br />'; |
|
next; |
|
} |
|
my $responsetype = $responseType->{$partid}->{$respid}; |
|
if (!exists($record->{"resource.$partid.$respid.submission"})) { |
|
$lastsubonly.="\n".'<div class="LC_grade_submission_part">'. |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <span class="LC_internal_info">'. |
|
'('.&mt('Response ID: [_1]',$respid).')'. |
|
'</span> '. |
|
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>'; |
|
next; |
|
} |
|
foreach my $submission (@$string) { |
|
my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
|
if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } |
|
my ($ressub,$hide,$draft,$subval) = split(/:/,$submission,4); |
|
# Similarity check |
|
my $similar=''; |
|
my ($type,$trial,$rndseed); |
|
if ($hide eq 'rand') { |
|
$type = 'randomizetry'; |
|
$trial = $record->{"resource.$partid.tries"}; |
|
$rndseed = $record->{"resource.$partid.rndseed"}; |
|
} |
|
if ($env{'form.checkPlag'}) { |
|
my ($oname,$odom,$ocrsid,$oessay,$osim)= |
|
&most_similar($uname,$udom,$symb,$subval); |
|
if ($osim) { |
|
$osim=int($osim*100.0); |
|
if ($hide eq 'anon') { |
|
$similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. |
|
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
|
} else { |
|
$similar='<hr />'; |
|
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
|
$similar .= '<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2]', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
|
'</span></h3>'; |
|
} else { |
|
my %old_course_desc; |
|
if ($ocrsid ne '') { |
|
if (ref($coursedesc_by_cid->{$ocrsid}) eq 'HASH') { |
|
%old_course_desc = %{$coursedesc_by_cid->{$ocrsid}}; |
|
} else { |
|
my $args; |
|
if ($ocrsid ne $env{'request.course.id'}) { |
|
$args = {'one_time' => 1}; |
|
} |
|
%old_course_desc = |
|
&Apache::lonnet::coursedescription($ocrsid,$args); |
|
$coursedesc_by_cid->{$ocrsid} = \%old_course_desc; |
|
} |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
|
$old_course_desc{'description'}, |
|
$old_course_desc{'num'}, |
|
$old_course_desc{'domain'}). |
|
'</span></h3>'; |
|
} else { |
|
$similar .= |
|
'<h3><span class="LC_warning">'. |
|
&mt('Essay is [_1]% similar to an essay by [_2] in an unknown course', |
|
$osim, |
|
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
|
'</span></h3>'; |
|
} |
|
} |
|
$similar .= '<blockquote><i>'. |
|
&keywords_highlight($oessay). |
|
'</i></blockquote><hr />'; |
|
} |
|
} |
|
} |
|
my $order=&get_order($partid,$respid,$symb,$uname,$udom, |
|
undef,$type,$trial,$rndseed); |
|
if (($viewtype eq 'lastonly') || |
|
($viewtype eq 'datesub') || |
|
($viewtype =~ /^(last|all)$/)) { |
|
my $display_part=&get_display_part($partid,$symb); |
|
$lastsubonly.='<div class="LC_grade_submission_part">'. |
|
'<b>'.&mt('Part: [_1]',$display_part).'</b>'. |
|
' <span class="LC_internal_info">'. |
|
'('.&mt('Response ID: [_1]',$respid).')'. |
|
'</span> '; |
|
my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record); |
|
if (@$files) { |
|
if ($hide eq 'anon') { |
|
$lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); |
|
} else { |
|
$lastsubonly.='<br /><br />'.'<b>'.&mt('Submitted Files:').'</b>' |
|
.'<br /><span class="LC_warning">'; |
|
if(@$files == 1) { |
|
$lastsubonly .= &mt('Like all files provided by users, this file may contain viruses!'); |
|
} else { |
|
$lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!'); |
|
} |
|
$lastsubonly .= '</span>'; |
|
foreach my $file (@$files) { |
|
&Apache::lonnet::allowuploaded('/adm/grades',$file); |
|
$lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>'; |
|
} |
|
} |
|
$lastsubonly.='<br />'; |
|
} |
|
if ($hide eq 'anon') { |
|
$lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; |
|
} else { |
|
$lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'; |
|
if ($draft) { |
|
$lastsubonly.= ' <span class="LC_warning">'.&mt('Draft Copy').'</span>'; |
|
} |
|
$subval = |
|
&cleanRecord($subval,$responsetype,$symb,$partid, |
|
$respid,$record,$order,undef,$uname,$udom,$type,$trial,$rndseed); |
|
if ($responsetype eq 'essay') { |
|
$subval =~ s{\n}{<br />}g; |
|
} |
|
$lastsubonly.=$subval."\n"; |
|
} |
|
if ($similar) {$lastsubonly.="<br /><br />$similar\n";} |
|
$lastsubonly.='</div>'; |
|
} |
|
} |
|
} |
|
$lastsubonly.='</div>'."\n"; # End: LC_grade_submissions_body |
|
} |
|
return ($lastsubonly,$partinfo); |
|
} |
|
|
|
sub check_collaborators { |
sub check_collaborators { |
my ($symb,$uname,$udom,$record,$handgrade,$counter) = @_; |
my ($symb,$uname,$udom,$record,$handgrade,$counter) = @_; |
my ($result,@col_fullnames); |
my ($result,@col_fullnames); |
Line 2924 sub check_collaborators {
|
Line 2869 sub check_collaborators {
|
|
|
#--- Retrieve the last submission for all the parts |
#--- Retrieve the last submission for all the parts |
sub get_last_submission { |
sub get_last_submission { |
my ($returnhash,$is_tool)=@_; |
my ($returnhash)=@_; |
my (@string,$timestamp,$lastgradetime,$lastsubmittime); |
my (@string,$timestamp,$lastgradetime,$lastsubmittime); |
if ($$returnhash{'version'}) { |
if ($$returnhash{'version'}) { |
my %lasthash=(); |
my %lasthash=(); |
Line 2951 sub get_last_submission {
|
Line 2896 sub get_last_submission {
|
$prevsolved{$1} = $solved{$1}; |
$prevsolved{$1} = $solved{$1}; |
$solved{$1} = $lasthash{$key}; |
$solved{$1} = $lasthash{$key}; |
} |
} |
} |
} |
foreach my $partid (keys(%handgraded)) { |
foreach my $partid (keys(%handgraded)) { |
if (($prevsolved{$partid} eq 'ungraded_attempted') && |
if (($prevsolved{$partid} eq 'ungraded_attempted') && |
(($solved{$partid} eq 'incorrect_by_override') || |
(($solved{$partid} eq 'incorrect_by_override') || |
Line 3023 sub get_last_submission {
|
Line 2968 sub get_last_submission {
|
} |
} |
} |
} |
if (!@string) { |
if (!@string) { |
my $msg; |
|
if ($is_tool) { |
|
$msg = &mt('No grade passed back.'); |
|
} else { |
|
$msg = &mt('Nothing submitted - no attempts.'); |
|
} |
|
$string[0] = |
$string[0] = |
'<span class="LC_warning">'.$msg.'</span>'; |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span>'; |
} |
} |
return (\@string,$timestamp,$lastgradetime,$lastsubmittime); |
return (\@string,$timestamp,$lastgradetime,$lastsubmittime); |
} |
} |
Line 4106 VIEWJAVASCRIPT
|
Line 4045 VIEWJAVASCRIPT
|
#--- show scores for a section or whole class w/ option to change/update a score |
#--- show scores for a section or whole class w/ option to change/update a score |
sub viewgrades { |
sub viewgrades { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
my ($is_tool,$toolsymb); |
|
if ($symb =~ /ext\.tool$/) { |
|
$is_tool = 1; |
|
$toolsymb = $symb; |
|
} |
|
&viewgrades_js($request); |
&viewgrades_js($request); |
|
|
#need to make sure we have the correct data for later EXT calls, |
#need to make sure we have the correct data for later EXT calls, |
Line 4210 sub viewgrades {
|
Line 4144 sub viewgrades {
|
if ($env{'form.submitonly'} eq 'all') { |
if ($env{'form.submitonly'} eq 'all') { |
$result.= '<h3>'.$common_header.'</h3>'; |
$result.= '<h3>'.$common_header.'</h3>'; |
} else { |
} else { |
my $text; |
$result.= '<h3>'.$common_header.' '.&mt('(submission status: "[_1]")',$submission_status).'</h3>'; |
if ($is_tool) { |
|
$text = &mt('(transaction status: "[_1]")',$submission_status); |
|
} else { |
|
$text = &mt('(submission status: "[_1]")',$submission_status); |
|
} |
|
$result.= '<h3>'.$common_header.' '.$text.'</h3>'; |
|
} |
} |
$result .= &Apache::loncommon::start_data_table(); |
$result .= &Apache::loncommon::start_data_table(); |
#radio buttons/text box for assigning points for a section or class. |
#radio buttons/text box for assigning points for a section or class. |
Line 4229 sub viewgrades {
|
Line 4157 sub viewgrades {
|
my %weight = (); |
my %weight = (); |
my $ctsparts = 0; |
my $ctsparts = 0; |
my %seen = (); |
my %seen = (); |
my @part_response_id; |
my @part_response_id = &flatten_responseType($responseType); |
if ($is_tool) { |
|
@part_response_id = ([0,'']); |
|
} else { |
|
@part_response_id = &flatten_responseType($responseType); |
|
} |
|
foreach my $part_response_id (@part_response_id) { |
foreach my $part_response_id (@part_response_id) { |
my ($partid,$respid) = @{ $part_response_id }; |
my ($partid,$respid) = @{ $part_response_id }; |
my $part_resp = join('_',@{ $part_response_id }); |
my $part_resp = join('_',@{ $part_response_id }); |
Line 4285 sub viewgrades {
|
Line 4208 sub viewgrades {
|
|
|
#table listing all the students in a section/class |
#table listing all the students in a section/class |
#header of table |
#header of table |
if ($env{'form.submitonly'} eq 'all') { |
if ($env{'form.submitonly'} eq 'all') { |
$result.= '<h3>'.$specific_header.'</h3>'; |
$result.= '<h3>'.$specific_header.'</h3>'; |
} else { |
} else { |
my $text; |
$result.= '<h3>'.$specific_header.' '.&mt('(submission status: "[_1]")',$submission_status).'</h3>'; |
if ($is_tool) { |
|
$text = &mt('(transaction status: "[_1]")',$submission_status); |
|
} else { |
|
$text = &mt('(submission status: "[_1]")',$submission_status); |
|
} |
|
$result.= '<h3>'.$specific_header.' '.$text.'</h3>'; |
|
} |
} |
$result.= &Apache::loncommon::start_data_table(). |
$result.= &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
Line 4308 sub viewgrades {
|
Line 4225 sub viewgrades {
|
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url)=&Apache::lonnet::decode_symb($symb); |
my @partids = (); |
my @partids = (); |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $narrowtext = &mt('Tries'); |
my $narrowtext = &mt('Tries'); |
$display =~ s|^Number of Attempts|$narrowtext <br />|; # makes the column narrower |
$display =~ s|^Number of Attempts|$narrowtext <br />|; # makes the column narrower |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name',$toolsymb); } |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); } |
my ($partid) = &split_part_type($part); |
my ($partid) = &split_part_type($part); |
push(@partids,$partid); |
push(@partids,$partid); |
# |
# |
Line 4352 sub viewgrades {
|
Line 4269 sub viewgrades {
|
return $a cmp $b; |
return $a cmp $b; |
} (keys(%$fullname))) { |
} (keys(%$fullname))) { |
$result.=&viewstudentgrade($symb,$env{'request.course.id'}, |
$result.=&viewstudentgrade($symb,$env{'request.course.id'}, |
$_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets,$is_tool); |
$_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets); |
} |
} |
$result.=&Apache::loncommon::end_data_table(); |
$result.=&Apache::loncommon::end_data_table(); |
$result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n"; |
$result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n"; |
Line 4440 sub viewgrades {
|
Line 4357 sub viewgrades {
|
|
|
#--- call by previous routine to display each student who satisfies submission filter. |
#--- call by previous routine to display each student who satisfies submission filter. |
sub viewstudentgrade { |
sub viewstudentgrade { |
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets,$is_tool) = @_; |
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets) = @_; |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); |
my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname); |
my $submitonly = $env{'form.submitonly'}; |
my $submitonly = $env{'form.submitonly'}; |
Line 4498 sub viewstudentgrade {
|
Line 4415 sub viewstudentgrade {
|
my ($aggtries,$totaltries); |
my ($aggtries,$totaltries); |
unless (exists($aggregates{$part})) { |
unless (exists($aggregates{$part})) { |
$totaltries = $record{'resource.'.$part.'.tries'}; |
$totaltries = $record{'resource.'.$part.'.tries'}; |
|
|
$aggtries = $totaltries; |
$aggtries = $totaltries; |
if ($$last_resets{$part}) { |
if ($$last_resets{$part}) { |
$aggtries = &get_num_tries(\%record,$$last_resets{$part}, |
$aggtries = &get_num_tries(\%record,$$last_resets{$part}, |
Line 4546 sub viewstudentgrade {
|
Line 4464 sub viewstudentgrade {
|
# record does not get update if unchanged |
# record does not get update if unchanged |
sub editgrades { |
sub editgrades { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
my $toolsymb; |
|
if ($symb =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
|
|
|
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section')); |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
my $title='<h2>'.&mt('Current Grade Status').'</h2>'; |
Line 4596 sub editgrades {
|
Line 4510 sub editgrades {
|
my ($part,$type) = &split_part_type($stores); |
my ($part,$type) = &split_part_type($stores); |
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($part !~ m/^\Q$partid\E/) { next;} |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
if ($type eq 'awarded' || $type eq 'solved') { next; } |
my $display=&Apache::lonnet::metadata($url,$stores.'.display',$toolsymb); |
my $display=&Apache::lonnet::metadata($url,$stores.'.display'); |
$display =~ s/\[Part: \Q$part\E\]//; |
$display =~ s/\[Part: \Q$part\E\]//; |
my $narrowtext = &mt('Tries'); |
my $narrowtext = &mt('Tries'); |
$display =~ s/Number of Attempts/$narrowtext/; |
$display =~ s/Number of Attempts/$narrowtext/; |
Line 4928 ENDPICK
|
Line 4842 ENDPICK
|
|
|
sub csvupload_fields { |
sub csvupload_fields { |
my ($symb,$errorref) = @_; |
my ($symb,$errorref) = @_; |
my $toolsymb; |
|
if ($symb =~ /ext\.tool$/) { |
|
$toolsymb = $symb; |
|
} |
|
my (@parts) = &getpartlist($symb,$errorref); |
my (@parts) = &getpartlist($symb,$errorref); |
if (ref($errorref)) { |
if (ref($errorref)) { |
if ($$errorref) { |
if ($$errorref) { |
Line 4945 sub csvupload_fields {
|
Line 4855 sub csvupload_fields {
|
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
foreach my $part (sort(@parts)) { |
foreach my $part (sort(@parts)) { |
my @datum; |
my @datum; |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
my $display=&Apache::lonnet::metadata($url,$part.'.display'); |
my $name=$part; |
my $name=$part; |
if (!$display) { $display = $name; } |
if (!$display) { $display = $name; } |
@datum=($name,$display); |
@datum=($name,$display); |
Line 5411 sub getSymbMap {
|
Line 5321 sub getSymbMap {
|
my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); }, |
my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); }, |
1,0,1); |
1,0,1); |
for my $sequence ($navmap->getById('0.0'), @sequences) { |
for my $sequence ($navmap->getById('0.0'), @sequences) { |
if ($navmap->hasResource($sequence, sub { shift->is_gradable(); }, 0) ) { |
if ($navmap->hasResource($sequence, sub { shift->is_problem(); }, 0) ) { |
my $title = $minder.'.'. |
my $title = $minder.'.'. |
&HTML::Entities::encode($sequence->compTitle(),'"\'&'); |
&HTML::Entities::encode($sequence->compTitle(),'"\'&'); |
push(@titles, $title); # minder in case two titles are identical |
push(@titles, $title); # minder in case two titles are identical |
Line 5508 sub displayPage {
|
Line 5418 sub displayPage {
|
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->BEGIN_MAP) { $depth++; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
if($curRes == $iterator->END_MAP) { $depth--; } |
|
|
if (ref($curRes) && $curRes->is_gradable()) { |
if (ref($curRes) && $curRes->is_problem()) { |
my $parts = $curRes->parts(); |
my $parts = $curRes->parts(); |
my $title = $curRes->compTitle(); |
my $title = $curRes->compTitle(); |
my $symbx = $curRes->symb(); |
my $symbx = $curRes->symb(); |
my $is_tool = ($symbx =~ /ext\.tool$/); |
|
$studentTable.= |
$studentTable.= |
&Apache::loncommon::start_data_table_row(). |
&Apache::loncommon::start_data_table_row(). |
'<td align="center" valign="top" >'.$prob. |
'<td align="center" valign="top" >'.$prob. |
Line 5523 sub displayPage {
|
Line 5432 sub displayPage {
|
'</td>'; |
'</td>'; |
$studentTable.='<td valign="top">'; |
$studentTable.='<td valign="top">'; |
my %form = ('CODE' => $env{'form.CODE'},); |
my %form = ('CODE' => $env{'form.CODE'},); |
if ($is_tool) { |
if ($env{'form.vProb'} eq 'yes' ) { |
$studentTable.=' <b>'.$title.'</b><br />'; |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
} else { |
undef,'both',\%form); |
if ($env{'form.vProb'} eq 'yes' ) { |
} else { |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
undef,'both',\%form); |
$companswer =~ s|<form(.*?)>||g; |
} else { |
$companswer =~ s|</form>||g; |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
$companswer =~ s|<form(.*?)>||g; |
# $companswer =~ s/$1/ /ms; |
$companswer =~ s|</form>||g; |
# $request->print('match='.$1."<br />\n"); |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
# } |
# $companswer =~ s/$1/ /ms; |
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
# $request->print('match='.$1."<br />\n"); |
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
# } |
|
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
|
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
|
} |
|
} |
} |
|
|
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
|
|
if ($env{'form.lastSub'} eq 'datesub') { |
if ($env{'form.lastSub'} eq 'datesub') { |
if ($record{'version'} eq '') { |
if ($record{'version'} eq '') { |
my $msg = &mt('No recorded submission for this problem.'); |
$studentTable.='<br /> <span class="LC_warning">'.&mt('No recorded submission for this problem.').'</span><br />'; |
if ($is_tool) { |
|
$msg = &mt('No recorded transactions for this external tool'); |
|
} |
|
$studentTable.='<br /> <span class="LC_warning">'.$msg.'</span><br />'; |
|
} else { |
} else { |
my %responseType = (); |
my %responseType = (); |
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
Line 5608 sub displaySubByDates {
|
Line 5509 sub displaySubByDates {
|
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_; |
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_; |
my $isCODE=0; |
my $isCODE=0; |
my $isTask = ($symb =~/\.task$/); |
my $isTask = ($symb =~/\.task$/); |
my $is_tool = ($symb =~/\.tool$/); |
|
if (exists($record->{'resource.CODE'})) { $isCODE=1; } |
if (exists($record->{'resource.CODE'})) { $isCODE=1; } |
my $studentTable=&Apache::loncommon::start_data_table(). |
my $studentTable=&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('Date/Time').'</th>'. |
'<th>'.&mt('Date/Time').'</th>'. |
($isCODE?'<th>'.&mt('CODE').'</th>':''). |
($isCODE?'<th>'.&mt('CODE').'</th>':''). |
($isTask?'<th>'.&mt('Version').'</th>':''). |
($isTask?'<th>'.&mt('Version').'</th>':''). |
'<th>'.($is_tool?&mt('Grade'):&mt('Submission')).'</th>'. |
'<th>'.&mt('Submission').'</th>'. |
'<th>'.&mt('Status').'</th>'. |
'<th>'.&mt('Status').'</th>'. |
&Apache::loncommon::end_data_table_header_row(); |
&Apache::loncommon::end_data_table_header_row(); |
my ($version); |
my ($version); |
Line 5623 sub displaySubByDates {
|
Line 5523 sub displaySubByDates {
|
my %orders; |
my %orders; |
$mark{'correct_by_student'} = $checkIcon; |
$mark{'correct_by_student'} = $checkIcon; |
if (!exists($$record{'1:timestamp'})) { |
if (!exists($$record{'1:timestamp'})) { |
if ($is_tool) { |
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
return '<br /> <span class="LC_warning">'.&mt('No grade passed back.').'</span><br />'; |
|
} else { |
|
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
|
} |
|
} |
} |
|
|
my $interaction; |
my $interaction; |
Line 5663 sub displaySubByDates {
|
Line 5559 sub displaySubByDates {
|
my @matchKey; |
my @matchKey; |
if ($isTask) { |
if ($isTask) { |
@matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)); |
@matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)); |
} elsif ($is_tool) { |
|
@matchKey = sort(grep(/^resource\.\Q$partid\E\.awarded$/,@versionKeys)); |
|
} else { |
} else { |
@matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
@matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
} |
} |
Line 5673 sub displaySubByDates {
|
Line 5567 sub displaySubByDates {
|
foreach my $matchKey (@matchKey) { |
foreach my $matchKey (@matchKey) { |
if (exists($$record{$version.':'.$matchKey}) && |
if (exists($$record{$version.':'.$matchKey}) && |
$$record{$version.':'.$matchKey} ne '') { |
$$record{$version.':'.$matchKey} ne '') { |
if ($is_tool) { |
|
$displaySub[0].=$$record{"$version:resource.$partid.awarded"}; |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
|
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
|
$displaySub[0].='<span class="LC_nobreak">'; |
|
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
|
.' <span class="LC_internal_info">' |
|
.'('.&mt('Response ID: [_1]',$responseId).')' |
|
.'</span>' |
|
.' <b>'; |
|
if ($hidden) { |
|
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
} else { |
} else { |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
my ($trial,$rndseed,$newvariation); |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
if ($type eq 'randomizetry') { |
$displaySub[0].='<span class="LC_nobreak">'; |
$trial = $$record{"$where.$partid.tries"}; |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
$rndseed = $$record{"$where.$partid.rndseed"}; |
.' <span class="LC_internal_info">' |
|
.'('.&mt('Response ID: [_1]',$responseId).')' |
|
.'</span>' |
|
.' <b>'; |
|
if ($hidden) { |
|
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
|
} else { |
|
my ($trial,$rndseed,$newvariation); |
|
if ($type eq 'randomizetry') { |
|
$trial = $$record{"$where.$partid.tries"}; |
|
$rndseed = $$record{"$where.$partid.rndseed"}; |
|
} |
|
if ($$record{"$where.$partid.tries"} eq '') { |
|
$displaySub[0].=&mt('Trial not counted'); |
|
} else { |
|
$displaySub[0].=&mt('Trial: [_1]', |
|
$$record{"$where.$partid.tries"}); |
|
if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) { |
|
if (($rndseed ne $lastrndseed{$partid}) && |
|
(($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) { |
|
$newvariation = ' ('.&mt('New variation this try').')'; |
|
} |
|
} |
|
$lastrndseed{$partid} = $rndseed; |
|
$lasttype{$partid} = $type; |
|
} |
|
my $responseType=($isTask ? 'Task' |
|
: $responseType->{$partid}->{$responseId}); |
|
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
|
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
|
$orders{$partid}->{$responseId}= |
|
&get_order($partid,$responseId,$symb,$uname,$udom, |
|
$no_increment,$type,$trial,$rndseed); |
|
} |
|
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
|
$displaySub[0].=' '. |
|
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
|
} |
} |
|
if ($$record{"$where.$partid.tries"} eq '') { |
|
$displaySub[0].=&mt('Trial not counted'); |
|
} else { |
|
$displaySub[0].=&mt('Trial: [_1]', |
|
$$record{"$where.$partid.tries"}); |
|
if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) { |
|
if (($rndseed ne $lastrndseed{$partid}) && |
|
(($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) { |
|
$newvariation = ' ('.&mt('New variation this try').')'; |
|
} |
|
} |
|
$lastrndseed{$partid} = $rndseed; |
|
$lasttype{$partid} = $type; |
|
} |
|
my $responseType=($isTask ? 'Task' |
|
: $responseType->{$partid}->{$responseId}); |
|
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
|
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
|
$orders{$partid}->{$responseId}= |
|
&get_order($partid,$responseId,$symb,$uname,$udom, |
|
$no_increment,$type,$trial,$rndseed); |
|
} |
|
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
|
$displaySub[0].=' '. |
|
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
} |
} |
} |
} |
} |
} |
Line 5732 sub displaySubByDates {
|
Line 5623 sub displaySubByDates {
|
lc($$record{"$where.$partid.award"}).' '. |
lc($$record{"$where.$partid.award"}).' '. |
$mark{$$record{"$where.$partid.solved"}}. |
$mark{$$record{"$where.$partid.solved"}}. |
'<br />'; |
'<br />'; |
} elsif (($is_tool) && (exists($$record{"$version:resource.$partid.solved"}))) { |
|
if ($$record{"$version:resource.$partid.solved"} =~ /^(in|)correct_by_passback$/) { |
|
$displaySub[1].=&mt('Grade passed back by external tool'); |
|
} |
|
} |
} |
if (exists $$record{"$where.$partid.regrader"}) { |
if (exists $$record{"$where.$partid.regrader"}) { |
$displaySub[2].=$$record{"$where.$partid.regrader"}; |
$displaySub[2].=$$record{"$where.$partid.regrader"}. |
unless ($is_tool) { |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
$displaySub[2].=' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
|
} |
|
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) { |
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) { |
$displaySub[2].= |
$displaySub[2].= |
$$record{"$version:resource.$partid.regrader"}; |
$$record{"$version:resource.$partid.regrader"}. |
unless ($is_tool) { |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
$displaySub[2].=' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
|
} |
|
} |
} |
} |
} |
# needed because old essay regrader has not parts info |
# needed because old essay regrader has not parts info |
Line 9506 END
|
Line 9389 END
|
my @lines = &Apache::lonnet::get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
my $count = 0; |
my $count = 0; |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if (($line =~ /^\#/) || ($line eq '')); |
next if ($line =~ /^#/); |
$singleline = $line; |
$singleline = $line; |
$count ++; |
$count ++; |
} |
} |
Line 9668 sub validate_uploaded_scantron_file {
|
Line 9551 sub validate_uploaded_scantron_file {
|
my %unique_formats; |
my %unique_formats; |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
foreach my $line (@formatlines) { |
foreach my $line (@formatlines) { |
next if (($line =~ /^\#/) || ($line eq '')); |
chomp($line); |
my @config = split(/:/,$line); |
my @config = split(/:/,$line); |
my $idstart = $config[5]; |
my $idstart = $config[5]; |
my $idlength = $config[6]; |
my $idlength = $config[6]; |
Line 10306 sub submit_options_table {
|
Line 10189 sub submit_options_table {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
&commonJSfunctions($request); |
&commonJSfunctions($request); |
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my $result; |
my $result; |
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
|
|
$result.=&selectfield(1,$is_tool). |
$result.=&selectfield(1). |
'<input type="hidden" name="command" value="viewgrades" /> |
'<input type="hidden" name="command" value="viewgrades" /> |
<div> |
<div> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
Line 10344 sub submit_options_download {
|
Line 10226 sub submit_options_download {
|
} |
} |
} |
} |
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
&commonJSfunctions($request); |
&commonJSfunctions($request); |
|
|
my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
Line 10353 sub submit_options_download {
|
Line 10234 sub submit_options_download {
|
$result.=' |
$result.=' |
<h2> |
<h2> |
'.&mt('Select Students for whom to Download Submitted Files').' |
'.&mt('Select Students for whom to Download Submitted Files').' |
</h2>'.&selectfield(1,$is_tool).' |
</h2>'.&selectfield(1).' |
<input type="hidden" name="command" value="downloadfileslink" /> |
<input type="hidden" name="command" value="downloadfileslink" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
</div> |
</div> |
Line 10369 sub submit_options {
|
Line 10250 sub submit_options {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
&commonJSfunctions($request); |
&commonJSfunctions($request); |
my $result; |
my $result; |
|
|
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
$result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n"; |
$result.=&selectfield(1,$is_tool).' |
$result.=&selectfield(1).' |
<input type="hidden" name="command" value="submission" /> |
<input type="hidden" name="command" value="submission" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
<input type="submit" value="'.&mt('Next').' →" /> |
</div> |
</div> |
Line 10385 sub submit_options {
|
Line 10265 sub submit_options {
|
} |
} |
|
|
sub selectfield { |
sub selectfield { |
my ($full,$is_tool)=@_; |
my ($full)=@_; |
my %options; |
my %options = |
if ($is_tool) { |
(&substatus_options, |
%options = |
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
(&transtatus_options, |
|
'select_form_order' => ['yes','incorrect','all']); |
|
} else { |
|
%options = |
|
(&substatus_options, |
|
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
|
} |
|
|
|
# |
# |
# PrepareClasslist() needs to be called to avoid getting a sections list |
# PrepareClasslist() needs to be called to avoid getting a sections list |
Line 10427 sub selectfield {
|
Line 10300 sub selectfield {
|
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
</fieldset>'; |
</fieldset>'; |
if ($full) { |
if ($full) { |
my $heading = &mt('Submission Status'); |
|
if ($is_tool) { |
|
$heading = &mt('Transaction Status'); |
|
} |
|
$result.=' |
$result.=' |
<fieldset> |
<fieldset> |
<legend> |
<legend> |
'.$heading.' |
'.&mt('Submission Status').' |
</legend>'. |
</legend>'. |
&Apache::loncommon::select_form('all','submitonly',\%options). |
&Apache::loncommon::select_form('all','submitonly',\%options). |
'</fieldset>'; |
'</fieldset>'; |
Line 11165 sub select_problem {
|
Line 11034 sub select_problem {
|
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
} |
} |
|
|
#----- display problem, answer, and submissions for a single student (no grading) |
|
|
|
sub view_as_user { |
|
my ($symb,$vuname,$vudom,$hasperm) = @_; |
|
my $plainname = &Apache::loncommon::plainname($vuname,$vudom,'lastname'); |
|
my $displayname = &nameUserString('',$plainname,$vuname,$vudom); |
|
my $output = &Apache::loncommon::get_student_view($symb,$vuname,$vudom, |
|
$env{'request.course.id'}, |
|
undef,{'disable_submit' => 1}). |
|
"\n\n". |
|
'<div class="LC_grade_show_user">'. |
|
'<h2>'.$displayname.'</h2>'. |
|
"\n". |
|
&Apache::loncommon::track_student_link('View recent activity', |
|
$vuname,$vudom,'check').' '. |
|
"\n"; |
|
if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) || |
|
(($env{'request.course.sec'} ne '') && |
|
&Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.$env{'request.course.sec'}))) { |
|
$output .= &Apache::loncommon::pprmlink(&mt('Set/Change parameters'), |
|
$vuname,$vudom,$symb,'check'); |
|
} |
|
$output .= "\n"; |
|
my $companswer = &Apache::loncommon::get_student_answers($symb,$vuname,$vudom, |
|
$env{'request.course.id'}); |
|
$companswer=~s|<form(.*?)>||g; |
|
$companswer=~s|</form>||g; |
|
$companswer=~s|name="submit"|name="would_have_been_submit"|g; |
|
$output .= '<div class="LC_Box">'. |
|
'<h3 class="LC_hcell">'.&mt('Correct answer for[_1]',$displayname).'</h3>'. |
|
$companswer. |
|
'</div>'."\n"; |
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my ($essayurl,%coursedesc_by_cid); |
|
(undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
|
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$vudom,$vuname); |
|
my $res_error; |
|
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = |
|
&response_type($symb,\$res_error); |
|
my $fullname; |
|
my $collabinfo; |
|
if ($numessay) { |
|
unless ($hasperm) { |
|
&init_perm(); |
|
} |
|
($collabinfo,$fullname)= |
|
&check_collaborators($symb,$vuname,$vudom,\%record,$handgrade,0); |
|
unless ($hasperm) { |
|
&reset_perm(); |
|
} |
|
} |
|
my $checkIcon = '<img alt="'.&mt('Check Mark'). |
|
'" src="'.$Apache::lonnet::perlvar{'lonIconsURL'}. |
|
'/check.gif" height="16" border="0" />'; |
|
my ($lastsubonly,$partinfo) = |
|
&show_last_submission($vuname,$vudom,$symb,$essayurl,$responseType,'datesub', |
|
'',$fullname,\%record,\%coursedesc_by_cid); |
|
$output .= '<div class="LC_Box">'. |
|
'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'."\n".$collabinfo."\n"; |
|
if (($numresp > $numessay) & !$is_tool) { |
|
$output .='<p class="LC_info">'. |
|
&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon). |
|
"</p>\n"; |
|
} |
|
$output .= $partinfo; |
|
$output .= $lastsubonly; |
|
$output .= &displaySubByDates($symb,\%record,$partlist,$responseType,$checkIcon,$vuname,$vudom); |
|
$output .= '</div></div>'."\n"; |
|
return $output; |
|
} |
|
|
|
sub handler { |
sub handler { |
my $request=$_[0]; |
my $request=$_[0]; |
&reset_caches(); |
&reset_caches(); |