version 1.744, 2017/12/18 14:46:10
|
version 1.767, 2020/05/08 13:49:02
|
Line 46 use Apache::lonenc;
|
Line 46 use Apache::lonenc;
|
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
use Apache::lonquickgrades; |
use Apache::lonquickgrades; |
use Apache::bridgetask(); |
use Apache::bridgetask(); |
|
use Apache::lontexconvert(); |
use String::Similarity; |
use String::Similarity; |
|
use HTML::Parser(); |
|
use File::MMagic; |
use LONCAPA; |
use LONCAPA; |
|
|
use POSIX qw(floor); |
use POSIX qw(floor); |
Line 116 sub getpartlist {
|
Line 119 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 @metakeys = split(/,/,&Apache::lonnet::metadata($url,'keys')); |
my $toolsymb; |
|
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 308 sub reset_caches {
|
Line 315 sub reset_caches {
|
$add_to_form = { 'code_for_randomlist' => $scancode,}; |
$add_to_form = { 'code_for_randomlist' => $scancode,}; |
} |
} |
} |
} |
my $analyze = |
my $analyze = |
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
&get_analyze($symb,$uname,$udom,undef,$add_to_form, |
undef,undef,undef,$bubbles_per_row); |
undef,undef,undef,$bubbles_per_row); |
if (ref($analyze) eq 'HASH') { |
if (ref($analyze) eq 'HASH') { |
Line 338 sub cleanRecord {
|
Line 345 sub cleanRecord {
|
if ($response =~ /^(option|rank)$/) { |
if ($response =~ /^(option|rank)$/) { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my @answer = %answer; |
my @answer = %answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my ($toprow,$bottomrow); |
my ($toprow,$bottomrow); |
foreach my $foil (@$order) { |
foreach my $foil (@$order) { |
Line 356 sub cleanRecord {
|
Line 363 sub cleanRecord {
|
} elsif ($response eq 'match') { |
} elsif ($response eq 'match') { |
my %answer=&Apache::lonnet::str2hash($answer); |
my %answer=&Apache::lonnet::str2hash($answer); |
my @answer = %answer; |
my @answer = %answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
%answer = map {&HTML::Entities::encode($_, '"<>&')} @answer; |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"}); |
my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); |
my @items=&Apache::lonnet::str2array($record->{$version."resource.$partid.$respid.submissionitems"}); |
my ($toprow,$middlerow,$bottomrow); |
my ($toprow,$middlerow,$bottomrow); |
Line 413 sub cleanRecord {
|
Line 420 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. |
} |
} |
|
$answer = &Apache::lontexconvert::msgtexconverted($answer); |
return '<br /><br /><blockquote><tt>'.&keywords_highlight($answer).'</tt></blockquote>'; |
return '<br /><br /><blockquote><tt>'.&keywords_highlight($answer).'</tt></blockquote>'; |
|
|
} elsif ( $response eq 'organic') { |
} elsif ( $response eq 'organic') { |
my $result=&mt('Smile representation: [_1]', |
my $result=&mt('Smile representation: [_1]', |
'"<tt>'.&HTML::Entities::encode($answer, '"<>&').'</tt>"'); |
'"<tt>'.&HTML::Entities::encode($answer, '"<>&').'</tt>"'); |
Line 498 COMMONJSFUNCTIONS
|
Line 505 COMMONJSFUNCTIONS
|
#--- Dumps the class list with usernames,list of sections, |
#--- Dumps the class list with usernames,list of sections, |
#--- section, ids and fullnames for each user. |
#--- section, ids and fullnames for each user. |
sub getclasslist { |
sub getclasslist { |
my ($getsec,$filterlist,$getgroup) = @_; |
my ($getsec,$filterbyaccstatus,$getgroup,$symb,$submitonly,$filterbysubmstatus) = @_; |
my @getsec; |
my @getsec; |
my @getgroup; |
my @getgroup; |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status')); |
Line 526 sub getclasslist {
|
Line 533 sub getclasslist {
|
# |
# |
my %sections; |
my %sections; |
my %fullnames; |
my %fullnames; |
|
my ($cdom,$cnum,$partlist); |
|
if (($filterbysubmstatus) && ($submitonly ne 'all') && ($symb ne '')) { |
|
$cdom = $env{"course.$env{'request.course.id'}.domain"}; |
|
$cnum = $env{"course.$env{'request.course.id'}.num"}; |
|
my $res_error; |
|
($partlist,my $handgrade,my $responseType) = &response_type($symb,\$res_error); |
|
} |
foreach my $student (keys(%$classlist)) { |
foreach my $student (keys(%$classlist)) { |
my $end = |
my $end = |
$classlist->{$student}->[&Apache::loncoursedata::CL_END()]; |
$classlist->{$student}->[&Apache::loncoursedata::CL_END()]; |
Line 542 sub getclasslist {
|
Line 556 sub getclasslist {
|
my $group = |
my $group = |
$classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
$classlist->{$student}->[&Apache::loncoursedata::CL_GROUP()]; |
# filter students according to status selected |
# filter students according to status selected |
if ($filterlist && (!($stu_status =~ /Any/))) { |
if ($filterbyaccstatus && (!($stu_status =~ /Any/))) { |
if (!($stu_status =~ $status)) { |
if (!($stu_status =~ $status)) { |
delete($classlist->{$student}); |
delete($classlist->{$student}); |
next; |
next; |
Line 559 sub getclasslist {
|
Line 573 sub getclasslist {
|
} |
} |
} |
} |
if (($grp eq 'none') && !$group) { |
if (($grp eq 'none') && !$group) { |
$exclude = 0; |
$exclude = 0; |
} |
} |
} |
} |
if ($exclude) { |
if ($exclude) { |
delete($classlist->{$student}); |
delete($classlist->{$student}); |
|
next; |
} |
} |
} |
} |
|
if (($filterbysubmstatus) && ($submitonly ne 'all') && ($symb ne '')) { |
|
my $udom = |
|
$classlist->{$student}->[&Apache::loncoursedata::CL_SDOM()]; |
|
my $uname = |
|
$classlist->{$student}->[&Apache::loncoursedata::CL_SNAME()]; |
|
if (($symb ne '') && ($udom ne '') && ($uname ne '')) { |
|
if ($submitonly eq 'queued') { |
|
my %queue_status = |
|
&Apache::bridgetask::get_student_status($symb,$cdom,$cnum, |
|
$udom,$uname); |
|
if (!defined($queue_status{'gradingqueue'})) { |
|
delete($classlist->{$student}); |
|
next; |
|
} |
|
} else { |
|
my (%status) =&student_gradeStatus($symb,$udom,$uname,$partlist); |
|
my $submitted = 0; |
|
my $graded = 0; |
|
my $incorrect = 0; |
|
foreach (keys(%status)) { |
|
$submitted = 1 if ($status{$_} ne 'nothing'); |
|
$graded = 1 if ($status{$_} =~ /^ungraded/); |
|
$incorrect = 1 if ($status{$_} =~ /^incorrect/); |
|
|
|
my ($foo,$partid,$foo1) = split(/\./,$_); |
|
if ($status{'resource.'.$partid.'.submitted_by'} ne '') { |
|
$submitted = 0; |
|
} |
|
} |
|
if (!$submitted && ($submitonly eq 'yes' || |
|
$submitonly eq 'incorrect' || |
|
$submitonly eq 'graded')) { |
|
delete($classlist->{$student}); |
|
next; |
|
} elsif (!$graded && ($submitonly eq 'graded')) { |
|
delete($classlist->{$student}); |
|
next; |
|
} elsif (!$incorrect && $submitonly eq 'incorrect') { |
|
delete($classlist->{$student}); |
|
next; |
|
} |
|
} |
|
} |
|
} |
$section = ($section ne '' ? $section : 'none'); |
$section = ($section ne '' ? $section : 'none'); |
if (&canview($section)) { |
if (&canview($section)) { |
if (!@getsec || grep(/^\Q$section\E$/,@getsec)) { |
if (!@getsec || grep(/^\Q$section\E$/,@getsec)) { |
Line 580 sub getclasslist {
|
Line 639 sub getclasslist {
|
delete($classlist->{$student}); |
delete($classlist->{$student}); |
} |
} |
} |
} |
my %seen = (); |
|
my @sections = sort(keys(%sections)); |
my @sections = sort(keys(%sections)); |
return ($classlist,\@sections,\%fullnames); |
return ($classlist,\@sections,\%fullnames); |
} |
} |
Line 596 sub canmodify {
|
Line 654 sub canmodify {
|
#can modify the requested section |
#can modify the requested section |
return 1; |
return 1; |
} else { |
} else { |
# can't modify the request section |
# can't modify the requested section |
return 0; |
return 0; |
} |
} |
} |
} |
Line 609 sub canview {
|
Line 667 sub canview {
|
my ($sec)=@_; |
my ($sec)=@_; |
if ($perm{'vgr'}) { |
if ($perm{'vgr'}) { |
if (!defined($perm{'vgr_section'})) { |
if (!defined($perm{'vgr_section'})) { |
# can modify whole class |
# can view whole class |
return 1; |
return 1; |
} else { |
} else { |
if ($sec eq $perm{'vgr_section'}) { |
if ($sec eq $perm{'vgr_section'}) { |
#can modify the requested section |
#can view the requested section |
return 1; |
return 1; |
} else { |
} else { |
# can't modify the request section |
# can't view the requested section |
return 0; |
return 0; |
} |
} |
} |
} |
} |
} |
#can't modify |
#can't view |
return 0; |
return 0; |
} |
} |
|
|
Line 762 sub initialverifyreceipt {
|
Line 820 sub initialverifyreceipt {
|
|
|
#--- Check whether a receipt number is valid.--- |
#--- Check whether a receipt number is valid.--- |
sub verifyreceipt { |
sub verifyreceipt { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
|
|
my $courseid = $env{'request.course.id'}; |
my $courseid = $env{'request.course.id'}; |
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
my $receipt = &Apache::lonnet::recprefix($courseid).'-'. |
$env{'form.receipt'}; |
$env{'form.receipt'}; |
$receipt =~ s/[^\-\d]//g; |
$receipt =~ s/[^\-\d]//g; |
|
|
my $title.= |
my $title = |
'<h3><span class="LC_info">'. |
'<h3><span class="LC_info">'. |
&mt('Verifying Receipt Number [_1]',$receipt). |
&mt('Verifying Receipt Number [_1]',$receipt). |
'</span></h3>'."\n"; |
'</span></h3>'."\n"; |
Line 852 sub verifyreceipt {
|
Line 910 sub verifyreceipt {
|
sub listStudents { |
sub listStudents { |
my ($request,$symb,$submitonly) = @_; |
my ($request,$symb,$submitonly) = @_; |
|
|
|
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'}; |
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
unless ($submitonly) { |
unless ($submitonly) { |
$submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
$submitonly = $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
} |
} |
|
|
my $result=''; |
my $result=''; |
Line 907 LISTJAVASCRIPT
|
Line 966 LISTJAVASCRIPT
|
"\n"; |
"\n"; |
|
|
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
$gradeTable .= &Apache::lonhtmlcommon::start_pick_box(); |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
unless ($is_tool) { |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text')) |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="no" checked="checked" /> '.&mt('no').' </label>'."\n" |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
.'<label><input type="radio" name="vProb" value="yes" /> '.&mt('one student').' </label>'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vProb" value="all" /> '.&mt('all students').' </label><br />'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </label>'."\n" |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Answer')) |
.'<label><input type="radio" name="vAns" value="yes" /> '.&mt('one student').' </label>'."\n" |
.'<label><input type="radio" name="vAns" value="no" /> '.&mt('no').' </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="yes" /> '.&mt('one student').' </label>'."\n" |
.&Apache::lonhtmlcommon::row_closure(); |
.'<label><input type="radio" name="vAns" value="all" checked="checked" /> '.&mt('all students').' </label><br />'."\n" |
|
.&Apache::lonhtmlcommon::row_closure(); |
|
} |
|
|
my $submission_options; |
my $submission_options; |
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; |
|
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', |
|
last => 'last submission with details', |
|
datesub => 'all submissions', |
|
all => 'all submissions with details', |
|
); |
|
} |
$submission_options.= |
$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" /> '. |
&mt('last submission').' </label></span>'."\n". |
$optiontext{'lastonly'}.' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
'<label><input type="radio" name="lastSub" value="last" /> '. |
&mt('last submission with details').' </label></span>'."\n". |
$optiontext{'last'}.' </label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. |
'<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '. |
&mt('all submissions').'</label></span>'."\n". |
$optiontext{'datesub'}.'</label></span>'."\n". |
'<span class="LC_nobreak">'. |
'<span class="LC_nobreak">'. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
'<label><input type="radio" name="lastSub" value="all" /> '. |
&mt('all submissions with details').'</label></span>'; |
$optiontext{'all'}.'</label></span>'; |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Submissions')) |
my $viewtitle; |
|
if ($is_tool) { |
|
$viewtitle = &mt('View Transactions'); |
|
} else { |
|
$viewtitle = &mt('View Submissions'); |
|
} |
|
$gradeTable .= &Apache::lonhtmlcommon::row_title($viewtitle) |
.$submission_options |
.$submission_options |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
|
|
|
my $closure; |
|
if (($is_tool) && (exists($env{'form.Status'}))) { |
|
$closure = 1; |
|
} |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Grading Increments')) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Grading Increments')) |
.'<select name="increment">' |
.'<select name="increment">' |
.'<option value="1">'.&mt('Whole Points').'</option>' |
.'<option value="1">'.&mt('Whole Points').'</option>' |
Line 946 LISTJAVASCRIPT
|
Line 1033 LISTJAVASCRIPT
|
.'<option value=".25">'.&mt('Quarter Points').'</option>' |
.'<option value=".25">'.&mt('Quarter Points').'</option>' |
.'<option value=".1">'.&mt('Tenths of a Point').'</option>' |
.'<option value=".1">'.&mt('Tenths of a Point').'</option>' |
.'</select>' |
.'</select>' |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure($closure); |
|
|
$gradeTable .= |
$gradeTable .= |
&build_section_inputs(). |
&build_section_inputs(). |
Line 957 LISTJAVASCRIPT
|
Line 1044 LISTJAVASCRIPT
|
if (exists($env{'form.Status'})) { |
if (exists($env{'form.Status'})) { |
$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n"; |
$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n"; |
} else { |
} else { |
|
if ($is_tool) { |
|
$closure = 1; |
|
} |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
.&Apache::lonhtmlcommon::StatusOptions( |
.&Apache::lonhtmlcommon::StatusOptions( |
$saveStatus,undef,1,'javascript:reLoadList(this.form);') |
$saveStatus,undef,1,'javascript:reLoadList(this.form);') |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure($closure); |
} |
} |
|
|
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Check For Plagiarism')) |
unless ($is_tool) { |
.'<input type="checkbox" name="checkPlag" checked="checked" />' |
$closure = 1; |
.&Apache::lonhtmlcommon::row_closure(1) |
$gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Check For Plagiarism')) |
.&Apache::lonhtmlcommon::end_pick_box(); |
.'<input type="checkbox" name="checkPlag" checked="checked" />' |
|
.&Apache::lonhtmlcommon::row_closure($closure); |
|
} |
|
$gradeTable .= &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>' |
.&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" |
.$regrademsg."\n" |
.'<input type="hidden" name="command" value="processGroup" />' |
.'<input type="hidden" name="command" value="processGroup" />' |
.'</p>'; |
.'</p>'; |
|
|
Line 1115 LISTJAVASCRIPT
|
Line 1213 LISTJAVASCRIPT
|
#---- Called from the listStudents routine |
#---- Called from the listStudents routine |
|
|
sub check_script { |
sub check_script { |
my ($form, $type)=@_; |
my ($form,$type) = @_; |
my $chkallscript= &Apache::lonhtmlcommon::scripttag(' |
my $chkallscript = &Apache::lonhtmlcommon::scripttag(' |
function checkall() { |
function checkall() { |
for (i=0; i<document.forms.'.$form.'.elements.length; i++) { |
for (i=0; i<document.forms.'.$form.'.elements.length; i++) { |
ele = document.forms.'.$form.'.elements[i]; |
ele = document.forms.'.$form.'.elements[i]; |
Line 1161 sub check_buttons {
|
Line 1259 sub check_buttons {
|
|
|
# Displays the submissions for one student or a group of students |
# Displays the submissions for one student or a group of students |
sub processGroup { |
sub processGroup { |
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
my $ctr = 0; |
my $ctr = 0; |
my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my $total = scalar(@stuchecked)-1; |
my $total = scalar(@stuchecked)-1; |
Line 1908 sub show_problem {
|
Line 2006 sub show_problem {
|
sub files_exist { |
sub files_exist { |
my ($r, $symb) = @_; |
my ($r, $symb) = @_; |
my @students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
my @students = &Apache::loncommon::get_env_multiple('form.stuinfo'); |
|
|
foreach my $student (@students) { |
foreach my $student (@students) { |
my ($uname,$udom,$fullname) = split(/:/,$student); |
my ($uname,$udom,$fullname) = split(/:/,$student); |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
Line 1928 sub files_exist {
|
Line 2025 sub files_exist {
|
sub download_all_link { |
sub download_all_link { |
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
unless (&files_exist($r, $symb)) { |
unless (&files_exist($r, $symb)) { |
$r->print(&mt('There are currently no submitted documents.')); |
$r->print(&mt('There are currently no submitted documents.')); |
return; |
return; |
} |
} |
|
|
my $all_students = |
my $all_students = |
join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo')); |
join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo')); |
|
|
Line 1951 sub submit_download_link {
|
Line 2047 sub submit_download_link {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) { return ''; } |
if (!$symb) { return ''; } |
#FIXME: Figure out which type of problem this is and provide appropriate download |
#FIXME: Figure out which type of problem this is and provide appropriate download |
&download_all_link($request,$symb); |
my $res_error; |
|
my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error); |
|
if (ref($res_error)) { |
|
if ($$res_error) { |
|
$request->print(&mt('An error occurred retrieving response types')); |
|
return; |
|
} |
|
} |
|
my ($numupload,$numessay) = (0,0); |
|
if (ref($responseType) eq 'HASH') { |
|
foreach my $part (sort(keys(%$responseType))) { |
|
foreach my $id (sort(keys(%{ $responseType->{$part} }))) { |
|
my $responsetype = $responseType->{$part}->{$id}; |
|
if ($responsetype eq 'essay') { |
|
my $uploadedfiletypes = |
|
&Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes",$symb); |
|
if ($uploadedfiletypes) { |
|
$numupload++; |
|
} else { |
|
$numessay++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if (($numupload) || ($numessay)) { |
|
my $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'}; |
|
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'}; |
|
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
|
(undef,undef,my $fullname) = &getclasslist($getsec,1,$getgroup,$symb,$submitonly,1); |
|
if (ref($fullname) eq 'HASH') { |
|
my @students = map { $_.':'.$fullname->{$_} } (keys(%{$fullname})); |
|
if (@students) { |
|
@{$env{'form.stuinfo'}} = @students; |
|
if ($numupload) { |
|
&download_all_link($request,$symb); |
|
} |
|
# FIXME Need to provide a mechanism to download essays, i.e., if $numessay > 0 |
|
# Needs to omit user's identity if resource instance is for an anonymous survey. |
|
} else { |
|
$request->print(&mt('No students match the criteria you selected')); |
|
} |
|
} else { |
|
$request->print(&mt('Could not retrieve student information')); |
|
} |
|
} else { |
|
$request->print(&mt('No essayresponse items found')); |
|
} |
|
return; |
} |
} |
|
|
sub build_section_inputs { |
sub build_section_inputs { |
Line 1977 sub submission {
|
Line 2121 sub submission {
|
|
|
my $probtitle=&Apache::lonnet::gettitle($symb); |
my $probtitle=&Apache::lonnet::gettitle($symb); |
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; } |
|
my $is_tool = ($symb =~ /ext\.tool$/); |
|
my ($essayurl,%coursedesc_by_cid); |
|
|
if (!&canview($usec)) { |
if (!&canview($usec)) { |
$request->print( |
$request->print( |
Line 1989 sub submission {
|
Line 2135 sub submission {
|
} |
} |
|
|
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; } |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
unless ($is_tool) { |
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; } |
|
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; } |
|
} |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : ''); |
my $checkIcon = '<img alt="'.&mt('Check Mark'). |
my $checkIcon = '<img alt="'.&mt('Check Mark'). |
'" src="'.$request->dir_config('lonIconsURL'). |
'" src="'.$request->dir_config('lonIconsURL'). |
Line 2078 sub submission {
|
Line 2226 sub submission {
|
$request->print($prnmsg); |
$request->print($prnmsg); |
|
|
# if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
if (1) { |
unless ($is_tool) { |
|
|
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
keyh => 'Keyword Highlighting for Essays', |
keyh => 'Keyword Highlighting for Essays', |
Line 2105 sub submission {
|
Line 2253 sub submission {
|
# |
# |
# Load the other essays for similarity check |
# Load the other essays for similarity check |
# |
# |
my (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
(undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb); |
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
$apath=&escape($apath); |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$apath=~s/\W/\_/gs; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
&init_old_essays($symb,$apath,$adom,$aname); |
if ($cdom ne '' && $cnum ne '') { |
|
my ($map,$id,$res) = &Apache::lonnet::decode_symb($symb); |
|
if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(default(?:|_\d+)\.(?:sequence|page))$}) { |
|
my $apath = $1.'_'.$id; |
|
$apath=~s/\W/\_/gs; |
|
&init_old_essays($symb,$apath,$cdom,$cnum); |
|
} |
|
} |
|
} else { |
|
my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/); |
|
$apath=&escape($apath); |
|
$apath=~s/\W/\_/gs; |
|
&init_old_essays($symb,$apath,$adom,$aname); |
|
} |
} |
} |
} |
} |
|
|
Line 2163 sub submission {
|
Line 2324 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">'.&mt('Submissions').'</h3>'; |
.'<h3 class="LC_hcell">'.$boxtitle.'</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 ($env{'form.handgrade'} eq 'no') { |
# if ($env{'form.handgrade'} eq 'no') { |
if (1) { |
unless ($is_tool) { |
$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 2178 sub submission {
|
Line 2343 sub submission {
|
my $fullname; |
my $fullname; |
my $col_fullnames = []; |
my $col_fullnames = []; |
# if ($env{'form.handgrade'} eq 'yes') { |
# if ($env{'form.handgrade'} eq 'yes') { |
if (1) { |
unless ($is_tool) { |
(my $sub_result,$fullname,$col_fullnames)= |
(my $sub_result,$fullname,$col_fullnames)= |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
&check_collaborators($symb,$uname,$udom,\%record,$handgrade, |
$counter); |
$counter); |
Line 2193 sub submission {
|
Line 2358 sub submission {
|
# (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 |
|
|
my ($string,$timestamp)= &get_last_submission(\%record); |
my ($string,$timestamp)= &get_last_submission(\%record,$is_tool); |
|
|
my $lastsubonly; |
my $lastsubonly; |
|
|
if ($$timestamp eq '') { |
if ($$timestamp eq '') { |
$lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; |
$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 { |
} else { |
$lastsubonly = |
$lastsubonly = |
'<div class="LC_grade_submissions_body">' |
'<div class="LC_grade_submissions_body">' |
Line 2252 sub submission {
|
Line 2421 sub submission {
|
&most_similar($uname,$udom,$symb,$subval); |
&most_similar($uname,$udom,$symb,$subval); |
if ($osim) { |
if ($osim) { |
$osim=int($osim*100.0); |
$osim=int($osim*100.0); |
my %old_course_desc = |
|
&Apache::lonnet::coursedescription($ocrsid, |
|
{'one_time' => 1}); |
|
|
|
if ($hide eq 'anon') { |
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 />'. |
$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 />'; |
&mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; |
} else { |
} else { |
$similar="<hr /><h3><span class=\"LC_warning\">". |
$similar='<hr />'; |
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
if ($essayurl eq 'lib/templates/simpleproblem.problem') { |
$osim, |
$similar .= '<h3><span class="LC_warning">'. |
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
&mt('Essay is [_1]% similar to an essay by [_2]', |
$old_course_desc{'description'}, |
$osim, |
$old_course_desc{'num'}, |
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')'). |
$old_course_desc{'domain'}). |
'</span></h3>'; |
'</span></h3><blockquote><i>'. |
} else { |
&keywords_highlight($oessay). |
my %old_course_desc; |
'</i></blockquote><hr />'; |
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 />'; |
} |
} |
} |
} |
} |
} |
Line 2381 sub submission {
|
Line 2578 sub submission {
|
my %seen = (); |
my %seen = (); |
my @partlist; |
my @partlist; |
my @gradePartRespid; |
my @gradePartRespid; |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id; |
|
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 2507 sub check_collaborators {
|
Line 2709 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)=@_; |
my ($returnhash,$is_tool)=@_; |
my (@string,$timestamp,%lasthidden); |
my (@string,$timestamp,%lasthidden); |
if ($$returnhash{'version'}) { |
if ($$returnhash{'version'}) { |
my %lasthash=(); |
my %lasthash=(); |
Line 2573 sub get_last_submission {
|
Line 2775 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">'.&mt('Nothing submitted - no attempts.').'</span>'; |
'<span class="LC_warning">'.$msg.'</span>'; |
} |
} |
return (\@string,\$timestamp); |
return (\@string,\$timestamp); |
} |
} |
Line 3561 VIEWJAVASCRIPT
|
Line 3769 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 3641 sub viewgrades {
|
Line 3854 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 { |
$result.= '<h3>'.$common_header.' '.&mt('(submission status: "[_1]")',$submission_status).'</h3>'; |
my $text; |
|
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 3654 sub viewgrades {
|
Line 3873 sub viewgrades {
|
my %weight = (); |
my %weight = (); |
my $ctsparts = 0; |
my $ctsparts = 0; |
my %seen = (); |
my %seen = (); |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id; |
|
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 3709 sub viewgrades {
|
Line 3933 sub viewgrades {
|
if ($env{'form.submitonly'} eq 'all') { |
if ($env{'form.submitonly'} eq 'all') { |
$result.= '<h3>'.$specific_header.'</h3>'; |
$result.= '<h3>'.$specific_header.'</h3>'; |
} else { |
} else { |
$result.= '<h3>'.$specific_header.' '.&mt('(submission status: "[_1]")',$submission_status).'</h3>'; |
my $text; |
|
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 3723 sub viewgrades {
|
Line 3953 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'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
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'); } |
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name',$toolsymb); } |
my ($partid) = &split_part_type($part); |
my ($partid) = &split_part_type($part); |
push(@partids,$partid); |
push(@partids,$partid); |
# |
# |
Line 3767 sub viewgrades {
|
Line 3997 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); |
$_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets,$is_tool); |
} |
} |
$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 3855 sub viewgrades {
|
Line 4085 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) = @_; |
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets,$is_tool) = @_; |
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 3961 sub viewstudentgrade {
|
Line 4191 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 3998 sub editgrades {
|
Line 4232 sub editgrades {
|
$ctr++; |
$ctr++; |
} |
} |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); |
|
my $totcolspan = 0; |
foreach my $partid (@partid) { |
foreach my $partid (@partid) { |
$header .= '<th align="center">'.&mt('Old Score').'</th>'. |
$header .= '<th align="center">'.&mt('Old Score').'</th>'. |
'<th align="center">'.&mt('New Score').'</th>'; |
'<th align="center">'.&mt('New Score').'</th>'; |
Line 4006 sub editgrades {
|
Line 4241 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'); |
my $display=&Apache::lonnet::metadata($url,$stores.'.display',$toolsymb); |
$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 4014 sub editgrades {
|
Line 4249 sub editgrades {
|
'<th align="center">'.&mt('New').' '.$display.'</th>'; |
'<th align="center">'.&mt('New').' '.$display.'</th>'; |
$columns{$partid}+=2; |
$columns{$partid}+=2; |
} |
} |
|
$totcolspan += $columns{$partid}; |
} |
} |
foreach my $partid (@partid) { |
foreach my $partid (@partid) { |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
Line 4029 sub editgrades {
|
Line 4265 sub editgrades {
|
my @noupdate; |
my @noupdate; |
my ($updateCtr,$noupdateCtr) = (1,1); |
my ($updateCtr,$noupdateCtr) = (1,1); |
for ($i=0; $i<$env{'form.total'}; $i++) { |
for ($i=0; $i<$env{'form.total'}; $i++) { |
my $line; |
|
my $user = $env{'form.ctr'.$i}; |
my $user = $env{'form.ctr'.$i}; |
my ($uname,$udom)=split(/:/,$user); |
my ($uname,$udom)=split(/:/,$user); |
my %newrecord; |
my %newrecord; |
my $updateflag = 0; |
my $updateflag = 0; |
$line .= '<td>'.&nameUserString(undef,$$fullname{$user},$uname,$udom).'</td>'; |
|
my $usec=$classlist->{"$uname:$udom"}[5]; |
my $usec=$classlist->{"$uname:$udom"}[5]; |
if (!&canmodify($usec)) { |
my $canmodify = &canmodify($usec); |
my $numcols=scalar(@partid)*4+2; |
my $line = '<td'.($canmodify?'':' colspan="2"').'>'. |
|
&nameUserString(undef,$$fullname{$user},$uname,$udom).'</td>'; |
|
if (!$canmodify) { |
push(@noupdate, |
push(@noupdate, |
$line."<td colspan=\"$numcols\"><span class=\"LC_warning\">". |
$line."<td colspan=\"$totcolspan\"><span class=\"LC_warning\">". |
&mt('Not allowed to modify student')."</span></td></tr>"); |
&mt('Not allowed to modify student')."</span></td>"); |
next; |
next; |
} |
} |
my %aggregate = (); |
my %aggregate = (); |
Line 4157 sub editgrades {
|
Line 4393 sub editgrades {
|
} |
} |
} |
} |
if (@noupdate) { |
if (@noupdate) { |
# my $numcols=(scalar(@partid)*(scalar(@parts)-1)*2)+3; |
my $numcols=$totcolspan+2; |
my $numcols=scalar(@partid)*4+2; |
|
$result .= &Apache::loncommon::start_data_table_row('LC_empty_row'). |
$result .= &Apache::loncommon::start_data_table_row('LC_empty_row'). |
'<td align="center" colspan="'.$numcols.'">'. |
'<td align="center" colspan="'.$numcols.'">'. |
&mt('No Changes Occurred For the Students Below'). |
&mt('No Changes Occurred For the Students Below'). |
Line 4257 sub csvupload_javascript_forward_associa
|
Line 4492 sub csvupload_javascript_forward_associa
|
tw=eval('vf.f'+i+'.selectedIndex'); |
tw=eval('vf.f'+i+'.selectedIndex'); |
if (tw==1) { foundID=1; } |
if (tw==1) { foundID=1; } |
if (tw==2) { founduname=1; } |
if (tw==2) { founduname=1; } |
if (tw==3) { foundclicker=1; } |
if (tw==3) { foundclicker=1; } |
if (tw>4) { foundsomething=1; } |
if (tw>4) { foundsomething=1; } |
} |
} |
if (founduname==0 && foundID==0 && Æ’oundclicker==0) { |
if (founduname==0 && foundID==0 && Æ’oundclicker==0) { |
Line 4318 ENDPICK
|
Line 4553 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 4332 sub csvupload_fields {
|
Line 4571 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'); |
my $display=&Apache::lonnet::metadata($url,$part.'.display',$toolsymb); |
my $name=$part; |
my $name=$part; |
if (!$display) { $display = $name; } |
if (!$display) { $display = $name; } |
@datum=($name,$display); |
@datum=($name,$display); |
if ($name=~/^stores_(.*)_awarded/) { |
if ($name=~/^stores_(.*)_awarded/) { |
push(@fields,['stores_'.$1.'_points',"Points [Part: $1]"]); |
push(@fields,['stores_'.$1.'_points',"Points [Part: $1]"]); |
Line 4498 sub get_fields {
|
Line 4737 sub get_fields {
|
} |
} |
|
|
sub csvuploadassign { |
sub csvuploadassign { |
my ($request,$symb)= @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $error_msg = ''; |
my $error_msg = ''; |
my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
Line 4614 sub csvuploadassign {
|
Line 4853 sub csvuploadassign {
|
$grades{$store_key}=$entries{$fields{$dest}}; |
$grades{$store_key}=$entries{$fields{$dest}}; |
} |
} |
} |
} |
if (! %grades) { |
if (! %grades) { |
push(@skipped,&mt("[_1]: no data to save","$username:$domain")); |
push(@skipped,&mt("[_1]: no data to save","$username:$domain")); |
} else { |
} else { |
$grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}"; |
$grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}"; |
Line 4685 LISTJAVASCRIPT
|
Line 4924 LISTJAVASCRIPT
|
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'}; |
|
my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'}; |
|
|
my $result='<h3><span class="LC_info"> '. |
my $result='<h3><span class="LC_info"> '. |
&mt('Manual Grading by Page or Sequence').'</span></h3>'; |
&mt('Manual Grading by Page or Sequence').'</span></h3>'; |
Line 4774 LISTJAVASCRIPT
|
Line 5014 LISTJAVASCRIPT
|
'<th>'.&nameUserString('header').'</th>'. |
'<th>'.&nameUserString('header').'</th>'. |
&Apache::loncommon::end_data_table_header_row(); |
&Apache::loncommon::end_data_table_header_row(); |
|
|
my (undef,undef,$fullname) = &getclasslist($getsec,'1'); |
my (undef,undef,$fullname) = &getclasslist($getsec,'1',$getgroup); |
my $ptr = 1; |
my $ptr = 1; |
foreach my $student (sort |
foreach my $student (sort |
{ |
{ |
Line 4824 sub getSymbMap {
|
Line 5064 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_problem(); }, 0) ) { |
if ($navmap->hasResource($sequence, sub { shift->is_gradable(); }, 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 4921 sub displayPage {
|
Line 5161 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_problem()) { |
if (ref($curRes) && $curRes->is_gradable()) { |
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 4935 sub displayPage {
|
Line 5176 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 ($env{'form.vProb'} eq 'yes' ) { |
if ($is_tool) { |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
$studentTable.=' <b>'.$title.'</b><br />'; |
undef,'both',\%form); |
} else { |
} else { |
if ($env{'form.vProb'} eq 'yes' ) { |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
$studentTable.=&show_problem($request,$symbx,$uname,$udom,1, |
$companswer =~ s|<form(.*?)>||g; |
undef,'both',\%form); |
$companswer =~ s|</form>||g; |
} else { |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form); |
# $companswer =~ s/$1/ /ms; |
$companswer =~ s|<form(.*?)>||g; |
# $request->print('match='.$1."<br />\n"); |
$companswer =~ s|</form>||g; |
# } |
# while ($companswer =~ /(<a href\=\"javascript:newWindow.*?Script Vars<\/a>)/s) { #<a href="javascript:newWindow</a> |
# $companswer =~ s|<table border=\"1\">|<table border=\"0\">|g; |
# $companswer =~ s/$1/ /ms; |
$studentTable.=' <b>'.$title.'</b> <br /> <b>'.&mt('Correct answer').':</b><br />'.$companswer; |
# $request->print('match='.$1."<br />\n"); |
|
# } |
|
# $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 '') { |
$studentTable.='<br /> <span class="LC_warning">'.&mt('No recorded submission for this problem.').'</span><br />'; |
my $msg = &mt('No recorded submission for this problem.'); |
|
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 4967 sub displayPage {
|
Line 5216 sub displayPage {
|
$responseType{$partid} = \%responseIds; |
$responseType{$partid} = \%responseIds; |
} |
} |
$studentTable.= &displaySubByDates($symbx,\%record,$parts,\%responseType,$checkIcon,$uname,$udom); |
$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 5008 sub displaySubByDates {
|
Line 5256 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>'.&mt('Submission').'</th>'. |
'<th>'.($is_tool?&mt('Grade'):&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 5022 sub displaySubByDates {
|
Line 5271 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'})) { |
return '<br /> <span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br />'; |
if ($is_tool) { |
|
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 5055 sub displaySubByDates {
|
Line 5308 sub displaySubByDates {
|
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) { |
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) { |
$hidden = 1; |
$hidden = 1; |
} |
} |
my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) |
my @matchKey; |
: sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); |
if ($isTask) { |
|
@matchKey = sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys); |
|
} elsif ($is_tool) { |
|
@matchKey = sort(grep /^resource\.\Q$partid\E\.awarded$/,@versionKeys); |
|
} else { |
|
@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 ''); |
my $display_part=&get_display_part($partid,$symb); |
my $display_part=&get_display_part($partid,$symb); |
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) { |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
$displaySub[0].=$$record{"$version:resource.$partid.awarded"}; |
: ($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 ($trial,$rndseed,$newvariation); |
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) |
if ($type eq 'randomizetry') { |
: ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); |
$trial = $$record{"$where.$partid.tries"}; |
$displaySub[0].='<span class="LC_nobreak">'; |
$rndseed = $$record{"$where.$partid.rndseed"}; |
$displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>' |
} |
.' <span class="LC_internal_info">' |
if ($$record{"$where.$partid.tries"} eq '') { |
.'('.&mt('Response ID: [_1]',$responseId).')' |
$displaySub[0].=&mt('Trial not counted'); |
.'</span>' |
} else { |
.' <b>'; |
$displaySub[0].=&mt('Trial: [_1]', |
if ($hidden) { |
$$record{"$where.$partid.tries"}); |
$displaySub[0].= &mt('Anonymous Survey').'</b>'; |
if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) { |
} else { |
if (($rndseed ne $lastrndseed{$partid}) && |
my ($trial,$rndseed,$newvariation); |
(($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) { |
if ($type eq 'randomizetry') { |
$newvariation = ' ('.&mt('New variation this try').')'; |
$trial = $$record{"$where.$partid.tries"}; |
} |
$rndseed = $$record{"$where.$partid.rndseed"}; |
} |
} |
$lastrndseed{$partid} = $rndseed; |
if ($$record{"$where.$partid.tries"} eq '') { |
$lasttype{$partid} = $type; |
$displaySub[0].=&mt('Trial not counted'); |
} |
} else { |
my $responseType=($isTask ? 'Task' |
$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}); |
: $responseType->{$partid}->{$responseId}); |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if (!exists($orders{$partid})) { $orders{$partid}={}; } |
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
if ((!exists($orders{$partid}->{$responseId})) || ($trial)) { |
$orders{$partid}->{$responseId}= |
$orders{$partid}->{$responseId}= |
&get_order($partid,$responseId,$symb,$uname,$udom, |
&get_order($partid,$responseId,$symb,$uname,$udom, |
$no_increment,$type,$trial,$rndseed); |
$no_increment,$type,$trial,$rndseed); |
} |
} |
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
$displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak |
$displaySub[0].=' '. |
$displaySub[0].=' '. |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />'; |
|
} |
} |
} |
} |
} |
} |
} |
Line 5119 sub displaySubByDates {
|
Line 5380 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"}; |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
unless ($is_tool) { |
|
$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"}; |
' (<b>'.&mt('Part').':</b> '.$display_part.')'; |
unless ($is_tool) { |
|
$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 5385 the homework problem.
|
Line 5654 the homework problem.
|
|
|
sub defaultFormData { |
sub defaultFormData { |
my ($symb)=@_; |
my ($symb)=@_; |
return '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'; |
return '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'; |
} |
} |
|
|
|
|
Line 5538 sub scantron_uploads {
|
Line 5807 sub scantron_uploads {
|
sub scantron_scantab { |
sub scantron_scantab { |
my $result='<select name="scantron_format">'."\n"; |
my $result='<select name="scantron_format">'."\n"; |
$result.='<option></option>'."\n"; |
$result.='<option></option>'."\n"; |
my @lines = &get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
if (@lines > 0) { |
if (@lines > 0) { |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if (($line =~ /^\#/) || ($line eq '')); |
next if (($line =~ /^\#/) || ($line eq '')); |
Line 5550 sub scantron_scantab {
|
Line 5819 sub scantron_scantab {
|
return $result; |
return $result; |
} |
} |
|
|
=pod |
|
|
|
=item get_scantronformat_file |
|
|
|
Returns an array containing lines from the scantron format file for |
|
the domain of the course. |
|
|
|
If a url for a custom.tab file is listed in domain's configuration.db, |
|
lines are from this file. |
|
|
|
Otherwise, if a default.tab has been published in RES space by the |
|
domainconfig user, lines are from this file. |
|
|
|
Otherwise, fall back to getting lines from the legacy file on the |
|
local server: /home/httpd/lonTabs/default_scantronformat.tab |
|
|
|
=cut |
|
|
|
sub get_scantronformat_file { |
|
my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$cdom); |
|
my $gottab = 0; |
|
my @lines; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if ($domconfig{'scantron'}{'scantronformat'} ne '') { |
|
my $formatfile = &Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'}); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
} |
|
if (!$gottab) { |
|
my $confname = $cdom.'-domainconfig'; |
|
my $default = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab'; |
|
my $formatfile = &Apache::lonnet::getfile($default); |
|
if ($formatfile ne '-1') { |
|
@lines = split("\n",$formatfile,-1); |
|
$gottab = 1; |
|
} |
|
} |
|
if (!$gottab) { |
|
my @domains = &Apache::lonnet::current_machine_domains(); |
|
if (grep(/^\Q$cdom\E$/,@domains)) { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} else { |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab'); |
|
@lines = <$fh>; |
|
close($fh); |
|
} |
|
} |
|
return @lines; |
|
} |
|
|
|
=pod |
=pod |
|
|
=item scantron_CODElist |
=item scantron_CODElist |
Line 5690 sub scantron_selectphase {
|
Line 5903 sub scantron_selectphase {
|
# Chunk of form to prompt for a scantron file upload. |
# Chunk of form to prompt for a scantron file upload. |
|
|
$r->print(' |
$r->print(' |
<br /> |
<br />'); |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
|
'.&Apache::loncommon::start_data_table_header_row().' |
|
<th> |
|
'.&mt('Specify a bubblesheet data file to upload.').' |
|
</th> |
|
'.&Apache::loncommon::end_data_table_header_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td> |
|
'); |
|
my $default_form_data=&defaultFormData($symb); |
|
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 $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.'); |
&js_escape(\$alertmsg); |
&js_escape(\$alertmsg); |
|
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom); |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
$r->print(&Apache::lonhtmlcommon::scripttag(' |
function checkUpload(formname) { |
function checkUpload(formname) { |
if (formname.upfile.value == "") { |
if (formname.upfile.value == "") { |
Line 5712 sub scantron_selectphase {
|
Line 5916 sub scantron_selectphase {
|
return false; |
return false; |
} |
} |
formname.submit(); |
formname.submit(); |
}')); |
}'."\n".$formatjs)); |
$r->print(' |
$r->print(' |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
<form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post"> |
'.$default_form_data.' |
'.$default_form_data.' |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
<input name="courseid" type="hidden" value="'.$cnum.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="domainid" type="hidden" value="'.$cdom.'" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
'.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').' |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
<br /> |
'.&Apache::loncommon::start_data_table_header_row().' |
<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
<th> |
</form> |
'.&mt('Specify a bubblesheet data file to upload.').' |
'); |
</th> |
|
'.&Apache::loncommon::end_data_table_header_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td> |
|
'.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').'<br />'."\n"); |
|
if ($formatoptions) { |
|
$r->print('</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td>'.$formattitle.(' 'x2).$formatoptions.' |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::start_data_table_row().' |
|
<td>' |
|
); |
|
} else { |
|
$r->print(' <br />'); |
|
} |
|
$r->print('<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::end_data_table().' |
|
</form>' |
|
); |
|
|
$r->print(' |
|
</td> |
|
'.&Apache::loncommon::end_data_table_row().' |
|
'.&Apache::loncommon::end_data_table().' |
|
'); |
|
} |
} |
|
|
# Chunk of form to prompt for a file to grade and how: |
# Chunk of form to prompt for a file to grade and how: |
Line 5842 sub scantron_selectphase {
|
Line 6064 sub scantron_selectphase {
|
return; |
return; |
} |
} |
|
|
=pod |
|
|
|
=item get_scantron_config |
|
|
|
Parse and return the bubblesheet configuration line selected as a |
|
hash of configuration file fields. |
|
|
|
Arguments: |
|
which - the name of the configuration to parse from the file. |
|
|
|
|
|
Returns: |
|
If the named configuration is not in the file, an empty |
|
hash is returned. |
|
a hash with the fields |
|
name - internal name for the this configuration setup |
|
description - text to display to operator that describes this config |
|
CODElocation - if 0 or the string 'none' |
|
- no CODE exists for this config |
|
if -1 || the string 'letter' |
|
- a CODE exists for this config and is |
|
a string of letters |
|
Unsupported value (but planned for future support) |
|
if a positive integer |
|
- The CODE exists as the first n items from |
|
the question section of the form |
|
if the string 'number' |
|
- The CODE exists for this config and is |
|
a string of numbers |
|
CODEstart - (only matter if a CODE exists) column in the line where |
|
the CODE starts |
|
CODElength - length of the CODE |
|
IDstart - column where the student/employee ID starts |
|
IDlength - length of the student/employee ID info |
|
Qstart - column where the information from the bubbled |
|
'questions' start |
|
Qlength - number of columns comprising a single bubble line from |
|
the sheet. (usually either 1 or 10) |
|
Qon - either a single character representing the character used |
|
to signal a bubble was chosen in the positional setup, or |
|
the string 'letter' if the letter of the chosen bubble is |
|
in the final, or 'number' if a number representing the |
|
chosen bubble is in the file (1->A 0->J) |
|
Qoff - the character used to represent that a bubble was |
|
left blank |
|
PaperID - if the scanning process generates a unique number for each |
|
sheet scanned the column that this ID number starts in |
|
PaperIDlength - number of columns that comprise the unique ID number |
|
for the sheet of paper |
|
FirstName - column that the first name starts in |
|
FirstNameLength - number of columns that the first name spans |
|
|
|
LastName - column that the last name starts in |
|
LastNameLength - number of columns that the last name spans |
|
BubblesPerRow - number of bubbles available in each row used to |
|
bubble an answer. (If not specified, 10 assumed). |
|
|
|
=cut |
|
|
|
sub get_scantron_config { |
|
my ($which) = @_; |
|
my @lines = &get_scantronformat_file(); |
|
my %config; |
|
#FIXME probably should move to XML it has already gotten a bit much now |
|
foreach my $line (@lines) { |
|
my ($name,$descrip)=split(/:/,$line); |
|
if ($name ne $which ) { next; } |
|
chomp($line); |
|
my @config=split(/:/,$line); |
|
$config{'name'}=$config[0]; |
|
$config{'description'}=$config[1]; |
|
$config{'CODElocation'}=$config[2]; |
|
$config{'CODEstart'}=$config[3]; |
|
$config{'CODElength'}=$config[4]; |
|
$config{'IDstart'}=$config[5]; |
|
$config{'IDlength'}=$config[6]; |
|
$config{'Qstart'}=$config[7]; |
|
$config{'Qlength'}=$config[8]; |
|
$config{'Qoff'}=$config[9]; |
|
$config{'Qon'}=$config[10]; |
|
$config{'PaperID'}=$config[11]; |
|
$config{'PaperIDlength'}=$config[12]; |
|
$config{'FirstName'}=$config[13]; |
|
$config{'FirstNamelength'}=$config[14]; |
|
$config{'LastName'}=$config[15]; |
|
$config{'LastNamelength'}=$config[16]; |
|
$config{'BubblesPerRow'}=$config[17]; |
|
last; |
|
} |
|
return %config; |
|
} |
|
|
|
=pod |
=pod |
|
|
=item username_to_idmap |
=item username_to_idmap |
Line 5981 sub username_to_idmap {
|
Line 6111 sub username_to_idmap {
|
Process a requested correction to a scanline. |
Process a requested correction to a scanline. |
|
|
Arguments: |
Arguments: |
$scantron_config - hash from &get_scantron_config() |
$scantron_config - hash from &Apache::lonnet::get_scantron_config() |
$scan_data - hash of correction information |
$scan_data - hash of correction information |
(see &scantron_getfile()) |
(see &scantron_getfile()) |
$line - existing scanline |
$line - existing scanline |
Line 6664 sub scantron_filter {
|
Line 6794 sub scantron_filter {
|
|
|
sub scantron_process_corrections { |
sub scantron_process_corrections { |
my ($r) = @_; |
my ($r) = @_; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $which=$env{'form.scantron_line'}; |
my $which=$env{'form.scantron_line'}; |
Line 6833 sub check_for_error {
|
Line 6963 sub check_for_error {
|
sub scantron_warning_screen { |
sub scantron_warning_screen { |
my ($button_text,$symb)=@_; |
my ($button_text,$symb)=@_; |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'}); |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $CODElist; |
my $CODElist; |
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
Line 6989 sub scantron_validate_file {
|
Line 7119 sub scantron_validate_file {
|
#get the student pick code ready |
#get the student pick code ready |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
my $nav_error; |
my $nav_error; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config); |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
Line 7449 sub scantron_validate_ID {
|
Line 7579 sub scantron_validate_ID {
|
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $nav_error; |
my $nav_error; |
Line 7696 sub verify_bubbles_checked {
|
Line 7826 sub verify_bubbles_checked {
|
my $ansnumstr = join('","',@ansnums); |
my $ansnumstr = join('","',@ansnums); |
my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); |
my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines."); |
&js_escape(\$warning); |
&js_escape(\$warning); |
my $output = &Apache::lonhtmlcommon::scripttag((<<ENDSCRIPT)); |
my $output = &Apache::lonhtmlcommon::scripttag(<<ENDSCRIPT); |
function verify_bubble_radio(form) { |
function verify_bubble_radio(form) { |
var ansnumArray = new Array ("$ansnumstr"); |
var ansnumArray = new Array ("$ansnumstr"); |
var need_bubble_count = 0; |
var need_bubble_count = 0; |
Line 7919 sub prompt_for_corrections {
|
Line 8049 sub prompt_for_corrections {
|
|
|
Arguments: |
Arguments: |
$r - Apache request object |
$r - Apache request object |
$scan_config - hash from &get_scantron_config() |
$scan_config - hash from &Apache::lonnet::get_scantron_config() |
$line - Number of the line being displayed. |
$line - Number of the line being displayed. |
$questionnum - Question number (may include subquestion) |
$questionnum - Question number (may include subquestion) |
$error - Type of error. |
$error - Type of error. |
Line 8083 sub get_codes {
|
Line 8213 sub get_codes {
|
|
|
sub scantron_validate_CODE { |
sub scantron_validate_CODE { |
my ($r,$currentphase) = @_; |
my ($r,$currentphase) = @_; |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
if ($scantron_config{'CODElocation'} && |
if ($scantron_config{'CODElocation'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODEstart'} && |
$scantron_config{'CODElength'}) { |
$scantron_config{'CODElength'}) { |
Line 8157 sub scantron_validate_doublebubble {
|
Line 8287 sub scantron_validate_doublebubble {
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
Line 8339 sub scantron_validate_missingbubbles {
|
Line 8469 sub scantron_validate_missingbubbles {
|
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
&Apache::lonnet::decode_symb($env{'form.selectpage'}); |
|
|
#get scantron line setup |
#get scantron line setup |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
Line 8468 sub hand_bubble_option {
|
Line 8598 sub hand_bubble_option {
|
} |
} |
} |
} |
if ($needs_hand_bubbles) { |
if ($needs_hand_bubbles) { |
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. |
return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'. |
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). |
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />'). |
Line 8487 sub scantron_process_students {
|
Line 8617 sub scantron_process_students {
|
} |
} |
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
|
|
my %scantron_config=&get_scantron_config($env{'form.scantron_format'}); |
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my ($scanlines,$scan_data)=&scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
Line 8555 SCANTRONFORM
|
Line 8685 SCANTRONFORM
|
return ''; # Dunno why the other returns return '' rather than just returning. |
return ''; # Dunno why the other returns return '' rather than just returning. |
} |
} |
|
|
my %lettdig = &letter_to_digits(); |
my %lettdig = &Apache::lonnet::letter_to_digits(); |
my $numletts = scalar(keys(%lettdig)); |
my $numletts = scalar(keys(%lettdig)); |
my %orderedforcode; |
my %orderedforcode; |
|
|
Line 8880 sub grade_student_bubbles {
|
Line 9010 sub grade_student_bubbles {
|
} |
} |
|
|
sub scantron_upload_scantron_data { |
sub scantron_upload_scantron_data { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $dom = $env{'request.role.domain'}; |
my $dom = $env{'request.role.domain'}; |
|
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($dom); |
my $domdesc = &Apache::lonnet::domain($dom,'description'); |
my $domdesc = &Apache::lonnet::domain($dom,'description'); |
$r->print(&Apache::loncommon::coursebrowser_javascript($dom)); |
$r->print(&Apache::loncommon::coursebrowser_javascript($dom)); |
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid', |
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid', |
Line 8921 sub scantron_upload_scantron_data {
|
Line 9052 sub scantron_upload_scantron_data {
|
return; |
return; |
} |
} |
|
|
|
'.$formatjs.' |
')); |
')); |
$r->print(' |
$r->print(' |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
<h3>'.&mt('Send bubblesheet data to a course').'</h3> |
Line 8936 sub scantron_upload_scantron_data {
|
Line 9068 sub scantron_upload_scantron_data {
|
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_title(&mt('Domain')). |
&Apache::lonhtmlcommon::row_title(&mt('Domain')). |
'<input name="domainid" type="hidden" />'.$domdesc. |
'<input name="domainid" type="hidden" />'.$domdesc. |
&Apache::lonhtmlcommon::row_closure(). |
&Apache::lonhtmlcommon::row_closure()); |
|
if ($formatoptions) { |
|
$r->print(&Apache::lonhtmlcommon::row_title($formattitle).$formatoptions. |
|
&Apache::lonhtmlcommon::row_closure()); |
|
} |
|
$r->print( |
&Apache::lonhtmlcommon::row_title(&mt('File to upload')). |
&Apache::lonhtmlcommon::row_title(&mt('File to upload')). |
'<input type="file" name="upfile" size="50" />'. |
'<input type="file" name="upfile" size="50" />'. |
&Apache::lonhtmlcommon::row_closure(1). |
&Apache::lonhtmlcommon::row_closure(1). |
Line 8949 sub scantron_upload_scantron_data {
|
Line 9086 sub scantron_upload_scantron_data {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub scantron_upload_dataformat { |
|
my ($dom) = @_; |
|
my ($formatoptions,$formattitle,$formatjs); |
|
$formatjs = <<'END'; |
|
function toggleScantab(form) { |
|
return; |
|
} |
|
END |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$dom); |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}}) > 1) { |
|
if (($domconfig{'scantron'}{'config'}{'dat'}) && |
|
(ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH')) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) { |
|
my ($onclick,$formatextra,$singleline); |
|
my @lines = &Apache::lonnet::get_scantronformat_file(); |
|
my $count = 0; |
|
foreach my $line (@lines) { |
|
next if ($line =~ /^#/); |
|
$singleline = $line; |
|
$count ++; |
|
} |
|
if ($count > 1) { |
|
$formatextra = '<div style="display:none" id="bubbletype">'. |
|
'<span class="LC_nobreak">'. |
|
&mt('Bubblesheet type:').' '. |
|
&scantron_scantab().'</span></div>'; |
|
$onclick = ' onclick="toggleScantab(this.form);"'; |
|
$formatjs = <<"END"; |
|
function toggleScantab(form) { |
|
var divid = 'bubbletype'; |
|
if (document.getElementById(divid)) { |
|
var radioname = 'fileformat'; |
|
var num = form.elements[radioname].length; |
|
if (num) { |
|
for (var i=0; i<num; i++) { |
|
if (form.elements[radioname][i].checked) { |
|
var chosen = form.elements[radioname][i].value; |
|
if (chosen == 'dat') { |
|
document.getElementById(divid).style.display = 'none'; |
|
} else if (chosen == 'csv') { |
|
document.getElementById(divid).style.display = 'block'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
END |
|
} elsif ($count == 1) { |
|
my $formatname = (split(/:/,$singleline,2))[0]; |
|
$formatextra = '<input type="hidden" name="scantron_format" value="'.$formatname.'" />'; |
|
} |
|
$formattitle = &mt('File format'); |
|
$formatoptions = '<label><input name="fileformat" type="radio" value="dat" checked="checked"'.$onclick.' />'. |
|
&mt('Plain Text (no delimiters)'). |
|
'</label>'.(' 'x2). |
|
'<label><input name="fileformat" type="radio" value="csv"'.$onclick.' />'. |
|
&mt('Comma separated values').'</label>'.$formatextra; |
|
} |
|
} |
|
} |
|
} elsif (keys(%{$domconfig{'scantron'}{'config'}}) == 1) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) { |
|
$formattitle = &mt('Bubblesheet type'); |
|
$formatoptions = &scantron_scantab(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($formatoptions,$formattitle,$formatjs); |
|
} |
|
|
sub scantron_upload_scantron_data_save { |
sub scantron_upload_scantron_data_save { |
my($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $doanotherupload= |
my $doanotherupload= |
'<br /><form action="/adm/grades" method="post">'."\n". |
'<br /><form action="/adm/grades" method="post">'."\n". |
'<input type="hidden" name="command" value="scantronupload" />'."\n". |
'<input type="hidden" name="command" value="scantronupload" />'."\n". |
Line 8975 sub scantron_upload_scantron_data_save {
|
Line 9190 sub scantron_upload_scantron_data_save {
|
&mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', |
&mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.', |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1)); |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1)); |
} else { |
} else { |
my $result = |
my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$env{'form.domainid'}); |
&Apache::lonnet::userfileupload('upfile','','scantron','','','', |
my $parser; |
|
if (ref($domconfig{'scantron'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') { |
|
my $is_csv; |
|
my @possibles = keys(%{$domconfig{'scantron'}{'config'}}); |
|
if (@possibles > 1) { |
|
if ($env{'form.fileformat'} eq 'csv') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) { |
|
$is_csv = 1; |
|
} |
|
} |
|
} |
|
} |
|
} elsif (@possibles == 1) { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH') { |
|
if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') { |
|
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}}) > 1) { |
|
$is_csv = 1; |
|
} |
|
} |
|
} |
|
} |
|
if ($is_csv) { |
|
$parser = $domconfig{'scantron'}{'config'}{'csv'}; |
|
} |
|
} |
|
} |
|
my $result = |
|
&Apache::lonnet::userfileupload('upfile','scantron','scantron',$parser,'','', |
$env{'form.courseid'},$env{'form.domainid'}); |
$env{'form.courseid'},$env{'form.domainid'}); |
if ($result =~ m{^/uploaded/}) { |
if ($result =~ m{^/uploaded/}) { |
$r->print( |
$r->print( |
Line 9021 sub validate_uploaded_scantron_file {
|
Line 9266 sub validate_uploaded_scantron_file {
|
$idmap{$lckey} = $idmap{$key}; |
$idmap{$lckey} = $idmap{$key}; |
} |
} |
my %unique_formats; |
my %unique_formats; |
my @formatlines = &get_scantronformat_file(); |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
foreach my $line (@formatlines) { |
foreach my $line (@formatlines) { |
chomp($line); |
chomp($line); |
my @config = split(/:/,$line); |
my @config = split(/:/,$line); |
Line 9122 sub valid_file {
|
Line 9367 sub valid_file {
|
} |
} |
|
|
sub scantron_download_scantron_data { |
sub scantron_download_scantron_data { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
my $default_form_data=&defaultFormData($symb); |
my $default_form_data=&defaultFormData($symb); |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 9162 sub checkscantron_results {
|
Line 9407 sub checkscantron_results {
|
my ($r,$symb) = @_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $cid = $env{'request.course.id'}; |
my $cid = $env{'request.course.id'}; |
my %lettdig = &letter_to_digits(); |
my %lettdig = &Apache::lonnet::letter_to_digits(); |
my $numletts = scalar(keys(%lettdig)); |
my $numletts = scalar(keys(%lettdig)); |
my $cnum = $env{'course.'.$cid.'.num'}; |
my $cnum = $env{'course.'.$cid.'.num'}; |
my $cdom = $env{'course.'.$cid.'.domain'}; |
my $cdom = $env{'course.'.$cid.'.domain'}; |
my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'}); |
my (undef, undef, $sequence) = &Apache::lonnet::decode_symb($env{'form.selectpage'}); |
my %record; |
my %record; |
my %scantron_config = |
my %scantron_config = |
&Apache::grades::get_scantron_config($env{'form.scantron_format'}); |
&Apache::lonnet::get_scantron_config($env{'form.scantron_format'}); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
Line 9493 sub verify_scantron_grading {
|
Line 9738 sub verify_scantron_grading {
|
return ($counter,$record); |
return ($counter,$record); |
} |
} |
|
|
sub letter_to_digits { |
|
my %lettdig = ( |
|
A => 1, |
|
B => 2, |
|
C => 3, |
|
D => 4, |
|
E => 5, |
|
F => 6, |
|
G => 7, |
|
H => 8, |
|
I => 9, |
|
J => 0, |
|
); |
|
return %lettdig; |
|
} |
|
|
|
|
|
#-------- end of section for handling grading scantron forms ------- |
#-------- end of section for handling grading scantron forms ------- |
# |
# |
Line 9564 sub grading_menu {
|
Line 9793 sub grading_menu {
|
icon => 'grade_students.png', |
icon => 'grade_students.png', |
linktitle => 'Grade current resource for a selection of students.' |
linktitle => 'Grade current resource for a selection of students.' |
}, |
}, |
{ linktext => 'Grade ungraded submissions.', |
{ linktext => 'Grade ungraded submissions', |
url => $url1b, |
url => $url1b, |
permission => 'F', |
permission => 'F', |
icon => 'ungrade_sub.png', |
icon => 'ungrade_sub.png', |
Line 9658 sub submit_options_table {
|
Line 9887 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). |
$result.=&selectfield(1,$is_tool). |
'<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 9677 sub submit_options_download {
|
Line 9907 sub submit_options_download {
|
my ($request,$symb) = @_; |
my ($request,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
|
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". |
'<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.=' |
$result.=' |
<h2> |
<h2> |
'.&mt('Select Students for Which to Download Submissions').' |
'.&mt('Select Students for whom to Download Submissions').' |
</h2>'.&selectfield(1).' |
</h2>'.&selectfield(1,$is_tool).' |
<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 9700 sub submit_options {
|
Line 9931 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).' |
$result.=&selectfield(1,$is_tool).' |
<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> |
</div> |
</div> |
|
|
|
|
</form>'; |
</form>'; |
return $result; |
return $result; |
} |
} |
|
|
sub selectfield { |
sub selectfield { |
my ($full)=@_; |
my ($full,$is_tool)=@_; |
my %options = |
my %options; |
(&substatus_options, |
if ($is_tool) { |
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
%options = |
|
(&transtatus_options, |
|
'select_form_order' => ['yes','incorrect','all']); |
|
} else { |
|
%options = |
|
(&substatus_options, |
|
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
|
} |
my $result='<div class="LC_columnSection"> |
my $result='<div class="LC_columnSection"> |
|
|
<fieldset> |
<fieldset> |
Line 9744 sub selectfield {
|
Line 9981 sub selectfield {
|
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
'.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').' |
</fieldset>'; |
</fieldset>'; |
if ($full) { |
if ($full) { |
$result.=' |
my $heading = &mt('Submission Status'); |
|
if ($is_tool) { |
|
$heading = &mt('Transaction Status'); |
|
} |
|
$result.=' |
<fieldset> |
<fieldset> |
<legend> |
<legend> |
'.&mt('Submission Status').' |
'.$heading.' |
</legend>'. |
</legend>'. |
&Apache::loncommon::select_form('all','submitonly',\%options). |
&Apache::loncommon::select_form('all','submitonly',\%options). |
'</fieldset>'; |
'</fieldset>'; |
Line 9766 sub substatus_options {
|
Line 10007 sub substatus_options {
|
); |
); |
} |
} |
|
|
|
sub transtatus_options { |
|
return &Apache::lonlocal::texthash( |
|
'yes' => 'with score transactions', |
|
'incorrect' => 'with less than full credit', |
|
'all' => 'with any status', |
|
); |
|
} |
|
|
sub reset_perm { |
sub reset_perm { |
undef(%perm); |
undef(%perm); |
} |
} |
Line 9960 ENDUPFORM
|
Line 10209 ENDUPFORM
|
<input type="text" name="givenanswer" size="50" /> |
<input type="text" name="givenanswer" size="50" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
<input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" /> |
ENDGRADINGFORM |
ENDGRADINGFORM |
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
$result.='</td>'.&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); |
&Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM); |
<label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
<label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" /> |
</form>' |
</form> |
ENDPERCFORM |
ENDPERCFORM |
$result.='</td>'. |
$result.='</td>'. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
Line 9974 ENDPERCFORM
|
Line 10223 ENDPERCFORM
|
} |
} |
|
|
sub process_clicker_file { |
sub process_clicker_file { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
|
|
my %Saveable_Parameters=&clicker_grading_parameters(); |
my %Saveable_Parameters=&clicker_grading_parameters(); |
Line 10046 sub process_clicker_file {
|
Line 10295 sub process_clicker_file {
|
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1); |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1); |
return $result; |
return $result; |
} |
} |
|
my $mimetype; |
|
if ($env{'form.upfiletype'} eq 'iclicker') { |
|
my $mm = new File::MMagic; |
|
$mimetype = $mm->checktype_contents($env{'form.upfile'}); |
|
unless (($mimetype eq 'text/plain') || ($mimetype eq 'text/html')) { |
|
$result.= '<p>'. |
|
&Apache::lonhtmlcommon::confirm_success( |
|
&mt('File format is neither csv (iclicker 6) nor xml (iclicker 7)'),1).'</p>'; |
|
return $result; |
|
} |
|
} elsif (($env{'form.upfiletype'} ne 'interwrite') && ($env{'form.upfiletype'} ne 'turning')) { |
|
$result .= '<p>'. |
|
&Apache::lonhtmlcommon::confirm_success( |
|
&mt('Invalid clicker type: choose one of: i>clicker, Interwrite PRS, or Turning Technologies.'),1).'</p>'; |
|
return $result; |
|
} |
|
|
# Were able to get all the info needed, now analyze the file |
# Were able to get all the info needed, now analyze the file |
|
|
Line 10072 ENDHEADER
|
Line 10337 ENDHEADER
|
my $errormsg=''; |
my $errormsg=''; |
my $number=0; |
my $number=0; |
if ($env{'form.upfiletype'} eq 'iclicker') { |
if ($env{'form.upfiletype'} eq 'iclicker') { |
($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); |
if ($mimetype eq 'text/plain') { |
} |
($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); |
if ($env{'form.upfiletype'} eq 'interwrite') { |
} elsif ($mimetype eq 'text/html') { |
|
($errormsg,$number)=&iclickerxml_eval(\@questiontitles,\%responses); |
|
} |
|
} elsif ($env{'form.upfiletype'} eq 'interwrite') { |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses); |
} |
} elsif ($env{'form.upfiletype'} eq 'turning') { |
if ($env{'form.upfiletype'} eq 'turning') { |
|
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses); |
} |
} |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
$result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'. |
Line 10130 ENDHEADER
|
Line 10397 ENDHEADER
|
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Username").": <input type='text' name='uname".$id."' /> ". |
"\n".&mt("Domain").": ". |
"\n".&mt("Domain").": ". |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '. |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,0,$id); |
&Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,'',$id); |
$unknown_count++; |
$unknown_count++; |
} |
} |
} |
} |
Line 10185 sub iclicker_eval {
|
Line 10452 sub iclicker_eval {
|
return ($errormsg,$number); |
return ($errormsg,$number); |
} |
} |
|
|
|
sub iclickerxml_eval { |
|
my ($questiontitles,$responses)=@_; |
|
my $number=0; |
|
my $errormsg=''; |
|
my @state; |
|
my %respbyid; |
|
my $p = HTML::Parser->new |
|
( |
|
xml_mode => 1, |
|
start_h => |
|
[sub { |
|
my ($tagname,$attr) = @_; |
|
push(@state,$tagname); |
|
if ("@state" eq "ssn p") { |
|
my $title = $attr->{qn}; |
|
$title =~ s/(^\s+|\s+$)//g; |
|
$questiontitles->[$number]=$title; |
|
} elsif ("@state" eq "ssn p v") { |
|
my $id = $attr->{id}; |
|
my $entry = $attr->{ans}; |
|
$id=~s/^[\#0]+//; |
|
$entry =~s/[^a-zA-Z0-9\.\*\-\+]+//g; |
|
$respbyid{$id}[$number] = $entry; |
|
} |
|
}, "tagname, attr"], |
|
end_h => |
|
[sub { |
|
my ($tagname) = @_; |
|
if ("@state" eq "ssn p") { |
|
$number++; |
|
} |
|
pop(@state); |
|
}, "tagname"], |
|
); |
|
|
|
$p->parse($env{'form.upfile'}); |
|
$p->eof; |
|
foreach my $id (keys(%respbyid)) { |
|
$responses->{$id}=join(',',@{$respbyid{$id}}); |
|
} |
|
return ($errormsg,$number); |
|
} |
|
|
sub interwrite_eval { |
sub interwrite_eval { |
my ($questiontitles,$responses)=@_; |
my ($questiontitles,$responses)=@_; |
my $number=0; |
my $number=0; |
Line 10243 sub turning_eval {
|
Line 10553 sub turning_eval {
|
|
|
|
|
sub assign_clicker_grades { |
sub assign_clicker_grades { |
my ($r,$symb)=@_; |
my ($r,$symb) = @_; |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
# See which part we are saving to |
# See which part we are saving to |
my $res_error; |
my $res_error; |
Line 10254 sub assign_clicker_grades {
|
Line 10564 sub assign_clicker_grades {
|
# FIXME: This should probably look for the first handgradeable part |
# FIXME: This should probably look for the first handgradeable part |
my $part=$$partlist[0]; |
my $part=$$partlist[0]; |
# Start screen output |
# Start screen output |
my $result=&Apache::loncommon::start_data_table(). |
my $result = &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
'<th>'.&mt('Assigning grades based on clicker file').'</th>'. |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::start_data_table_row().'<td>'; |
&Apache::loncommon::start_data_table_row().'<td>'; |
# Get correct result |
# Get correct result |
# FIXME: Possibly need delimiter other than ":" |
# FIXME: Possibly need delimiter other than ":" |
my @correct=(); |
my @correct=(); |
Line 10320 sub assign_clicker_grades {
|
Line 10630 sub assign_clicker_grades {
|
for (my $i=0;$i<$number;$i++) { |
for (my $i=0;$i<$number;$i++) { |
if ($correct[$i] eq '-') { |
if ($correct[$i] eq '-') { |
$realnumber--; |
$realnumber--; |
} elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) { |
} elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) { |
if ($gradingmechanism eq 'attendance') { |
if ($gradingmechanism eq 'attendance') { |
$sum+=$pcorrect; |
$sum+=$pcorrect; |
} elsif ($correct[$i] eq '*') { |
} elsif ($correct[$i] eq '*') { |
Line 10379 sub navmap_errormsg {
|
Line 10689 sub navmap_errormsg {
|
} |
} |
|
|
sub startpage { |
sub startpage { |
my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js) = @_; |
my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js,$onload) = @_; |
|
my %args; |
|
if ($onload) { |
|
my %loaditems = ( |
|
'onload' => $onload, |
|
); |
|
$args{'add_entries'} = \%loaditems; |
|
} |
if ($nomenu) { |
if ($nomenu) { |
$r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'})); |
$args{'only_body'} = 1; |
|
$r->print(&Apache::loncommon::start_page("Student's Version",$js,\%args)); |
} else { |
} else { |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
$r->print(&Apache::loncommon::start_page('Grading',$js, |
$args{'bread_crumbs'} = $crumbs; |
{'bread_crumbs' => $crumbs})); |
$r->print(&Apache::loncommon::start_page('Grading',$js,\%args)); |
&Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading')); |
if ($env{'request.course.id'}) { |
|
&Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading')); |
|
} |
} |
} |
unless ($nodisplayflag) { |
unless ($nodisplayflag) { |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)); |
$r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)); |
} |
} |
} |
} |
|
|
sub select_problem { |
sub select_problem { |
my ($r)=@_; |
my ($r)=@_; |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">'); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1)); |
$r->print(&Apache::lonstathelpers::problem_selector('.',undef,1,undef,undef,undef,undef,1)); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="hidden" name="command" value="gradingmenu" />'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
$r->print('<input type="submit" value="'.&mt('Next').' →" /></form>'); |
} |
} |
Line 10569 sub handler {
|
Line 10889 sub handler {
|
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1); |
$request->print(&csvuploadassign($request,$symb)); |
$request->print(&csvuploadassign($request,$symb)); |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
|
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
$request->print(&scantron_selectphase($request,undef,$symb)); |
$request->print(&scantron_selectphase($request,undef,$symb)); |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
Line 10583 sub handler {
|
Line 10904 sub handler {
|
} elsif ($command eq 'scantronupload' && |
} elsif ($command eq 'scantronupload' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
&Apache::lonnet::allowed('usc',$env{'request.course.id'}))) { |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1); |
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1, |
|
undef,undef,undef,undef,'toggleScantab(document.rules);'); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
$request->print(&scantron_upload_scantron_data($request,$symb)); |
} elsif ($command eq 'scantronupload_save' && |
} elsif ($command eq 'scantronupload_save' && |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
(&Apache::lonnet::allowed('usc',$env{'request.role.domain'})|| |
Line 10603 sub handler {
|
Line 10925 sub handler {
|
} elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) { |
} elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) { |
&startpage($request,$symb, |
&startpage($request,$symb, |
[{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'}, |
[{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'}, |
{href=>'', text=>'Download submissions'}]); |
{href=>'', text=>'Download submitted files'}]); |
&submit_download_link($request,$symb); |
&submit_download_link($request,$symb); |
} elsif ($command) { |
} elsif ($command) { |
&startpage($request,$symb,[{href=>'', text=>'Access denied'}]); |
&startpage($request,$symb,[{href=>'', text=>'Access denied'}]); |
Line 10615 sub handler {
|
Line 10937 sub handler {
|
} |
} |
if ($env{'form.inhibitmenu'}) { |
if ($env{'form.inhibitmenu'}) { |
$request->print(&Apache::loncommon::end_page()); |
$request->print(&Apache::loncommon::end_page()); |
} else { |
} elsif ($env{'request.course.id'}) { |
&Apache::lonquickgrades::endGradeScreen($request); |
&Apache::lonquickgrades::endGradeScreen($request); |
} |
} |
&reset_caches(); |
&reset_caches(); |
Line 10766 Side Effects: None.
|
Line 11088 Side Effects: None.
|
$r - Apache request object |
$r - Apache request object |
$i - number of the current scanline |
$i - number of the current scanline |
$scan_record - hash ref as returned from &scantron_parse_scanline() |
$scan_record - hash ref as returned from &scantron_parse_scanline() |
$scan_config - hash ref as returned from &get_scantron_config() |
$scan_config - hash ref as returned from &Apache::lonnet::get_scantron_config() |
$line - full contents of the current scanline |
$line - full contents of the current scanline |
$error - error condition, valid values are |
$error - error condition, valid values are |
'incorrectCODE', 'duplicateCODE', |
'incorrectCODE', 'duplicateCODE', |