version 1.565, 2009/05/01 01:07:49
|
version 1.575, 2009/05/23 19:01:13
|
Line 2135 KEYWORDS
|
Line 2135 KEYWORDS
|
{'one_time' => 1}); |
{'one_time' => 1}); |
|
|
$similar="<hr /><h3><span class=\"LC_warning\">". |
$similar="<hr /><h3><span class=\"LC_warning\">". |
&mt('Essay is [_1]% similar to an essay by [_2] ([_3]:[_4]) in course [_5] (course id [_6]:[_7])', |
&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', |
$osim, |
$osim, |
&Apache::loncommon::plainname($oname,$odom), |
&Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', |
$oname,$odom, |
|
$old_course_desc{'description'}, |
$old_course_desc{'description'}, |
$old_course_desc{'num'}, |
$old_course_desc{'num'}, |
$old_course_desc{'domain'}). |
$old_course_desc{'domain'}). |
Line 2463 sub processHandGrade {
|
Line 2462 sub processHandGrade {
|
undef,$feedurl,undef, |
undef,$feedurl,undef, |
undef,undef,$showsymb, |
undef,undef,$showsymb, |
$restitle); |
$restitle); |
$request->print('<br />'.&mt('Sending message to [_1]:[_2]',$uname,$udom).': '. |
$request->print('<br />'.&mt('Sending message to [_1]',$uname.':'.$udom).': '. |
$msgstatus); |
$msgstatus); |
} |
} |
if ($env{'form.collaborator'.$ctr}) { |
if ($env{'form.collaborator'.$ctr}) { |
Line 3681 sub split_part_type {
|
Line 3680 sub split_part_type {
|
# |
# |
#--- Javascript to handle csv upload |
#--- Javascript to handle csv upload |
sub csvupload_javascript_reverse_associate { |
sub csvupload_javascript_reverse_associate { |
my $error1=&mt('You need to specify the username or ID'); |
my $error1=&mt('You need to specify the username or the student/employee ID'); |
my $error2=&mt('You need to specify at least one grading field'); |
my $error2=&mt('You need to specify at least one grading field'); |
return(<<ENDPICK); |
return(<<ENDPICK); |
function verify(vf) { |
function verify(vf) { |
Line 3721 ENDPICK
|
Line 3720 ENDPICK
|
} |
} |
|
|
sub csvupload_javascript_forward_associate { |
sub csvupload_javascript_forward_associate { |
my $error1=&mt('You need to specify the username or ID'); |
my $error1=&mt('You need to specify the username or the student/employee ID'); |
my $error2=&mt('You need to specify at least one grading field'); |
my $error2=&mt('You need to specify at least one grading field'); |
return(<<ENDPICK); |
return(<<ENDPICK); |
function verify(vf) { |
function verify(vf) { |
Line 4090 sub csvuploadassign {
|
Line 4089 sub csvuploadassign {
|
$countdone++; |
$countdone++; |
} |
} |
} |
} |
$request->print('<br /><span class="LC_info">'.&mt("Saved [_1] students",$countdone)."</span>\n"); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
if (@skipped) { |
if (@skipped) { |
$request->print('<p><span class="LC_warning">'.&mt('Skipped Students').'</span></p>'); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).'<br />'); |
foreach my $student (@skipped) { $request->print("$student<br />\n"); } |
$request->print(join(', ',@skipped)); |
} |
} |
if (@notallowed) { |
if (@notallowed) { |
$request->print('<p><span class="LC_error">'.&mt('Students Not Allowed to Modify').'</span></p>'); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('Modification of scores not allowed for the following username(s):'),1).'<br />'); |
foreach my $student (@notallowed) { $request->print("$student<br />\n"); } |
$request->print(join(', ',@notallowed)); |
} |
} |
$request->print("<br />\n"); |
$request->print("<br />\n"); |
$request->print(&show_grading_menu_form($symb)); |
$request->print(&show_grading_menu_form($symb)); |
Line 5069 sub scantron_selectphase {
|
Line 5068 sub scantron_selectphase {
|
<td> '.&mt('Sequence to grade:').' </td><td> '.$sequence_selector.' </td> |
<td> '.&mt('Sequence to grade:').' </td><td> '.$sequence_selector.' </td> |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
<td> '.&mt('Filename of scoring office file:').' </td><td> '.$file_selector.' </td> |
<td> '.&mt('Filename of bubblesheet data file:').' </td><td> '.$file_selector.' </td> |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
<td> '.&mt('Format of data file:').' </td><td> '.$format_selector.' </td> |
<td> '.&mt('Format of bubblesheet data file:').' </td><td> '.$format_selector.' </td> |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
<td> '.&mt('Saved CODEs to validate against:').' </td><td> '.$CODE_selector.' </td> |
<td> '.&mt('Saved CODEs to validate against:').' </td><td> '.$CODE_selector.' </td> |
Line 5090 sub scantron_selectphase {
|
Line 5089 sub scantron_selectphase {
|
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
<td colspan="2"> |
<td colspan="2"> |
<input type="submit" value="'.&mt('Grading: Validate Scantron Records').'" /> |
<input type="submit" value="'.&mt('Grading: Validate Bubblesheet Records').'" /> |
</td> |
</td> |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table_row().' |
'.&Apache::loncommon::end_data_table().' |
'.&Apache::loncommon::end_data_table().' |
Line 5109 sub scantron_selectphase {
|
Line 5108 sub scantron_selectphase {
|
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
'.&Apache::loncommon::start_data_table('LC_scantron_action').' |
'.&Apache::loncommon::start_data_table_header_row().' |
'.&Apache::loncommon::start_data_table_header_row().' |
<th> |
<th> |
'.&mt('Specify a Scantron data file to upload.').' |
'.&mt('Specify a bubblesheet data file to upload.').' |
</th> |
</th> |
'.&Apache::loncommon::end_data_table_header_row().' |
'.&Apache::loncommon::end_data_table_header_row().' |
'.&Apache::loncommon::start_data_table_row().' |
'.&Apache::loncommon::start_data_table_row().' |
Line 5136 sub scantron_selectphase {
|
Line 5135 sub scantron_selectphase {
|
<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" />').' |
'.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').' |
<br /> |
<br /> |
<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Scantron Data').'" /> |
<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
</form> |
</form> |
'); |
'); |
|
|
Line 5178 sub scantron_selectphase {
|
Line 5177 sub scantron_selectphase {
|
&Apache::loncommon::start_data_table('LC_scantron_action')."\n". |
&Apache::loncommon::start_data_table('LC_scantron_action')."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
'<th colspan="2"> |
'<th colspan="2"> |
'.&mt('Review scantron data and submissions for a previously graded folder/sequence')."\n". |
'.&mt('Review bubblesheet data and submissions for a previously graded folder/sequence')."\n". |
'</th>'."\n". |
'</th>'."\n". |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_row()."\n". |
&Apache::loncommon::start_data_table_row()."\n". |
Line 5200 sub scantron_selectphase {
|
Line 5199 sub scantron_selectphase {
|
&Apache::loncommon::start_data_table_row()."\n". |
&Apache::loncommon::start_data_table_row()."\n". |
'<td colspan="2">'."\n". |
'<td colspan="2">'."\n". |
'<input type="hidden" name="command" value="checksubmissions" />'."\n". |
'<input type="hidden" name="command" value="checksubmissions" />'."\n". |
'<input type="submit" value="'.&mt('Review Scantron Data and Submission Records').'" />'."\n". |
'<input type="submit" value="'.&mt('Review Bubblesheet Data and Submission Records').'" />'."\n". |
'</td>'."\n". |
'</td>'."\n". |
&Apache::loncommon::end_data_table_row()."\n". |
&Apache::loncommon::end_data_table_row()."\n". |
&Apache::loncommon::end_data_table()."\n". |
&Apache::loncommon::end_data_table()."\n". |
Line 5241 sub scantron_selectphase {
|
Line 5240 sub scantron_selectphase {
|
CODEstart - (only matter if a CODE exists) column in the line where |
CODEstart - (only matter if a CODE exists) column in the line where |
the CODE starts |
the CODE starts |
CODElength - length of the CODE |
CODElength - length of the CODE |
IDstart - column where the student/employee ID number starts |
IDstart - column where the student/employee ID starts |
IDlength - length of the student/employee ID info |
IDlength - length of the student/employee ID info |
Qstart - column where the information from the bubbled |
Qstart - column where the information from the bubbled |
'questions' start |
'questions' start |
Line 5341 sub username_to_idmap {
|
Line 5340 sub username_to_idmap {
|
$whichline - line number of the passed in scanline |
$whichline - line number of the passed in scanline |
$field - type of change to process |
$field - type of change to process |
(either |
(either |
'ID' -> correct the student/employee ID number |
'ID' -> correct the student/employee ID |
'CODE' -> correct the CODE |
'CODE' -> correct the CODE |
'answer' -> fixup the submitted answers) |
'answer' -> fixup the submitted answers) |
|
|
Line 6251 sub scantron_validate_file {
|
Line 6250 sub scantron_validate_file {
|
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'<input type="radio" name="verifyrecord" value="0" checked="checked" />'.&mt('No'). |
'</label></span><br />'. |
'</label></span><br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt('Grading will take longer if you use verification.').'<br />'. |
&mt("Alternatively, the 'Review scantron data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'. |
&mt("Alternatively, the 'Review bubblesheet data' utility (see grading menu) can be used for all students after grading is complete.").'<br /><br />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="submit" name="submit" value="'.&mt('Start Grading').'" />'. |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
'<input type="hidden" name="command" value="scantron_process" />'."\n"); |
} else { |
} else { |
Line 6777 sub scantron_get_correction {
|
Line 6776 sub scantron_get_correction {
|
if ($closest > 0) { |
if ($closest > 0) { |
foreach my $testcode (@{$closest}) { |
foreach my $testcode (@{$closest}) { |
my $checked=''; |
my $checked=''; |
if (!$i) { $checked=' checked="checked" '; } |
if (!$i) { $checked=' checked="checked"'; } |
$r->print(" |
$r->print(" |
<label> |
<label> |
<input type='radio' name='scantron_CODE_resolution' value='use_closest_$i' $checked /> |
<input type='radio' name='scantron_CODE_resolution' value='use_closest_$i'$checked /> |
".&mt("Use the similar CODE [_1] instead.", |
".&mt("Use the similar CODE [_1] instead.", |
"<b><tt>".$testcode."</tt></b>")." |
"<b><tt>".$testcode."</tt></b>")." |
</label> |
</label> |
Line 6791 sub scantron_get_correction {
|
Line 6790 sub scantron_get_correction {
|
} |
} |
} |
} |
if ($$scan_record{'scantron.CODE'}=~/\S/ ) { |
if ($$scan_record{'scantron.CODE'}=~/\S/ ) { |
my $checked; if (!$i) { $checked=' checked="checked" '; } |
my $checked; if (!$i) { $checked=' checked="checked"'; } |
$r->print(" |
$r->print(" |
<label> |
<label> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound' $checked /> |
<input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked /> |
".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.", |
".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.", |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
"<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")." |
</label>"); |
</label>"); |
Line 7018 sub prompt_for_corrections {
|
Line 7017 sub prompt_for_corrections {
|
($responsetype_per_response{$question-1} eq 'imageresponse') || |
($responsetype_per_response{$question-1} eq 'imageresponse') || |
($responsetype_per_response{$question-1} eq 'reactionresponse') || |
($responsetype_per_response{$question-1} eq 'reactionresponse') || |
($responsetype_per_response{$question-1} eq 'organicresponse')) { |
($responsetype_per_response{$question-1} eq 'organicresponse')) { |
$r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the exam directed students to leave [quant,_1,line] blank on their scantron sheets.",$lines).'<br /><br />'.&mt('A non-zero score can be assigned to the student during scantron grading by selecting a bubble in at least one line.').'<br />'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'<br />'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'<br /><br />'); |
$r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the exam directed students to leave [quant,_1,line] blank on their bubblesheets.",$lines).'<br /><br />'.&mt('A non-zero score can be assigned to the student during bubblesheet grading by selecting a bubble in at least one line.').'<br />'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'<br />'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'<br /><br />'); |
} else { |
} else { |
$r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."<br />"); |
$r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."<br />"); |
} |
} |
Line 7475 SCANTRONFORM
|
Line 7474 SCANTRONFORM
|
|
|
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam')); |
my $count=&get_todo_count($scanlines,$scan_data); |
my $count=&get_todo_count($scanlines,$scan_data); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Scantron Status', |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet Status', |
'Scantron Progress',$count, |
'Bubblesheet Progress',$count, |
'inline',undef,'scantronupload'); |
'inline',undef,'scantronupload'); |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state, |
'Processing first student'); |
'Processing first student'); |
Line 7740 sub scantron_upload_scantron_data {
|
Line 7739 sub scantron_upload_scantron_data {
|
|
|
</script> |
</script> |
|
|
|
<h3>'.&mt('Send scanned bubblesheet data to a course').'</h3> |
|
|
<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. |
&Apache::lonhtmlcommon::start_pick_box(). |
&Apache::lonhtmlcommon::start_pick_box(). |
Line 7758 sub scantron_upload_scantron_data {
|
Line 7759 sub scantron_upload_scantron_data {
|
&Apache::lonhtmlcommon::end_pick_box().'<br /> |
&Apache::lonhtmlcommon::end_pick_box().'<br /> |
|
|
<input name="command" value="scantronupload_save" type="hidden" /> |
<input name="command" value="scantronupload_save" type="hidden" /> |
<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Scantron Data').'" /> |
<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" /> |
</form> |
</form> |
'); |
'); |
return ''; |
return ''; |
Line 7776 sub scantron_upload_scantron_data_save {
|
Line 7777 sub scantron_upload_scantron_data_save {
|
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
if (!&Apache::lonnet::allowed('usc',$env{'form.domainid'}) && |
!&Apache::lonnet::allowed('usc', |
!&Apache::lonnet::allowed('usc', |
$env{'form.domainid'}.'_'.$env{'form.courseid'})) { |
$env{'form.domainid'}.'_'.$env{'form.courseid'})) { |
$r->print(&mt("You are not allowed to upload Scantron data to the requested course.")."<br />"); |
$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />"); |
if ($symb) { |
if ($symb) { |
$r->print(&show_grading_menu_form($symb)); |
$r->print(&show_grading_menu_form($symb)); |
} else { |
} else { |
Line 7785 sub scantron_upload_scantron_data_save {
|
Line 7786 sub scantron_upload_scantron_data_save {
|
return ''; |
return ''; |
} |
} |
my %coursedata=&Apache::lonnet::coursedescription($env{'form.domainid'}.'_'.$env{'form.courseid'}); |
my %coursedata=&Apache::lonnet::coursedescription($env{'form.domainid'}.'_'.$env{'form.courseid'}); |
$r->print(&mt("Doing upload to [_1]",$coursedata{'description'})." <br />"); |
my $uploadedfile; |
my $fname=$env{'form.upfile.filename'}; |
$r->print('<h3>'.&mt("Uploading file to [_1]",$coursedata{'description'}).'</h3>'); |
#FIXME |
|
#copied from lonnet::userfileupload() |
|
#make that function able to target a specified course |
|
# Replace Windows backslashes by forward slashes |
|
$fname=~s/\\/\//g; |
|
# Get rid of everything but the actual filename |
|
$fname=~s/^.*\/([^\/]+)$/$1/; |
|
# Replace spaces by underscores |
|
$fname=~s/\s+/\_/g; |
|
# Replace all other weird characters by nothing |
|
$fname=~s/[^\w\.\-]//g; |
|
# See if there is anything left |
|
unless ($fname) { return 'error: no uploaded file'; } |
|
my $uploadedfile=$fname; |
|
$fname='scantron_orig_'.$fname; |
|
if (length($env{'form.upfile'}) < 2) { |
if (length($env{'form.upfile'}) < 2) { |
$r->print(&mt("<span class=\"LC_error\">Error:</span> The file you attempted to upload, [_1] contained no information. Please check that you entered the correct filename.",'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"')."</span>")); |
$r->print(&mt('[_1]Error:[_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.','<span class="LC_error">','</span>','<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>')); |
} else { |
} else { |
my $result=&Apache::lonnet::finishuserfileupload($env{'form.courseid'},$env{'form.domainid'},'upfile',$fname); |
my $result = |
if ($result =~ m|^/uploaded/|) { |
&Apache::lonnet::userfileupload('upfile','','scantron','','','', |
$r->print(&mt("<span class=\"LC_success\">Success:</span> Successfully uploaded [_1] bytes of data into location [_2]", |
$env{'form.courseid'},$env{'form.domainid'}); |
(length($env{'form.upfile'})-1), |
if ($result =~ m{^/uploaded/}) { |
'<span class="LC_filename">'.$result."</span>")); |
$r->print(&mt('[_1]Success:[_2] Successfully uploaded [_3] bytes of data into location: [_4]', |
|
'<span class="LC_success">','</span>',(length($env{'form.upfile'})-1), |
|
'<span class="LC_filename">'.$result.'</span>')); |
|
($uploadedfile) = ($result =~ m{/([^/]+)$}); |
|
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
|
$env{'form.courseid'},$uploadedfile)); |
} else { |
} else { |
$r->print(&mt("<span class=\"LC_error\">Error:</span> An error ([_1]) occurred when attempting to upload the file, [_2]", |
$r->print(&mt('[_1]Error:[_2] An error ([_3]) occurred when attempting to upload the file, [_4]', |
$result, |
'<span class="LC_error">','</span>',$result, |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"')."</span>")); |
'<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>')); |
|
|
} |
} |
} |
} |
if ($symb) { |
if ($symb) { |
Line 7825 sub scantron_upload_scantron_data_save {
|
Line 7815 sub scantron_upload_scantron_data_save {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub validate_uploaded_scantron_file { |
|
my ($cdom,$cname,$fname) = @_; |
|
my $scanlines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.$fname); |
|
my @lines; |
|
if ($scanlines ne '-1') { |
|
@lines=split("\n",$scanlines,-1); |
|
} |
|
my $output; |
|
if (@lines) { |
|
my (%counts,$max_match_format); |
|
my ($max_match_count,$max_match_pct) = (0,0); |
|
my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cname); |
|
my %idmap = &username_to_idmap($classlist); |
|
foreach my $key (keys(%idmap)) { |
|
my $lckey = lc($key); |
|
$idmap{$lckey} = $idmap{$key}; |
|
} |
|
my %unique_formats; |
|
my @formatlines = &get_scantronformat_file(); |
|
foreach my $line (@formatlines) { |
|
chomp($line); |
|
my @config = split(/:/,$line); |
|
my $idstart = $config[5]; |
|
my $idlength = $config[6]; |
|
if (($idstart ne '') && ($idlength > 0)) { |
|
if (ref($unique_formats{$idstart.':'.$idlength}) eq 'ARRAY') { |
|
push(@{$unique_formats{$idstart.':'.$idlength}},$config[0].':'.$config[1]); |
|
} else { |
|
$unique_formats{$idstart.':'.$idlength} = [$config[0].':'.$config[1]]; |
|
} |
|
} |
|
} |
|
foreach my $key (keys(%unique_formats)) { |
|
my ($idstart,$idlength) = split(':',$key); |
|
%{$counts{$key}} = ( |
|
'found' => 0, |
|
'total' => 0, |
|
); |
|
foreach my $line (@lines) { |
|
next if ($line =~ /^#/); |
|
next if ($line =~ /^[\s\cz]*$/); |
|
my $id = substr($line,$idstart-1,$idlength); |
|
$id = lc($id); |
|
if (exists($idmap{$id})) { |
|
$counts{$key}{'found'} ++; |
|
} |
|
$counts{$key}{'total'} ++; |
|
} |
|
if ($counts{$key}{'total'}) { |
|
my $percent_match = (100*$counts{$key}{'found'})/($counts{$key}{'total'}); |
|
if (($max_match_format eq '') || ($percent_match > $max_match_pct)) { |
|
$max_match_pct = $percent_match; |
|
$max_match_format = $key; |
|
$max_match_count = $counts{$key}{'total'}; |
|
} |
|
} |
|
} |
|
if (ref($unique_formats{$max_match_format}) eq 'ARRAY') { |
|
my $format_descs; |
|
my $numwithformat = @{$unique_formats{$max_match_format}}; |
|
for (my $i=0; $i<$numwithformat; $i++) { |
|
my ($name,$desc) = split(':',$unique_formats{$max_match_format}[$i]); |
|
if ($i<$numwithformat-2) { |
|
$format_descs .= '"<i>'.$desc.'</i>", '; |
|
} elsif ($i==$numwithformat-2) { |
|
$format_descs .= '"<i>'.$desc.'</i>" '.&mt('and').' '; |
|
} elsif ($i==$numwithformat-1) { |
|
$format_descs .= '"<i>'.$desc.'</i>"'; |
|
} |
|
} |
|
my $showpct = sprintf("%.0f",$max_match_pct).'%'; |
|
$output .= '<br />'.&mt('Comparison of student IDs in the uploaded file with the course roster found matches for [_1] of the [_2] entries in the file (for the format defined for [_3]).','<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs). |
|
'<br />'.&mt('A low percentage of matches results from one of the following:').'<ul>'. |
|
'<li>'.&mt('The file was uploaded to the wrong course').'</li>'. |
|
'<li>'.&mt('The data are not in the format expected for the domain: [_1]', |
|
'<i>'.$cdom.'</i>').'</li>'. |
|
'<li>'.&mt('Students did not bubble their IDs, or mis-bubbled them').'</li>'. |
|
'<li>'.&mt('The course roster is not up to date').'</li>'. |
|
'</ul>'; |
|
} |
|
} else { |
|
$output = '<span class="LC_warning">'.&mt('Uploaded file contained no data').'</span>'; |
|
} |
|
return $output; |
|
} |
|
|
sub valid_file { |
sub valid_file { |
my ($requested_file)=@_; |
my ($requested_file)=@_; |
foreach my $filename (sort(&scantron_filenames())) { |
foreach my $filename (sort(&scantron_filenames())) { |
Line 8000 sub checkscantron_results {
|
Line 8076 sub checkscantron_results {
|
} |
} |
} |
} |
} |
} |
$r->print('<p>'.&mt('Comparison of scantron data (including corrections) with corresponding submission records (most recent submission) for <b>[quant,_1,student]</b> ([_2] scantron lines/student).',$numstudents,$env{'form.scantron_maxbubble'}).'</p>'); |
$r->print('<p>'.&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for <b>[quant,_1,student]</b> ([_2] scantron lines/student).',$numstudents,$env{'form.scantron_maxbubble'}).'</p>'); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
$r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>'); |
if ($passed) { |
if ($passed) { |
$r->print(&mt('Students with exact correspondence between scantron data and submissions are as follows:').'<br /><br />'); |
$r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />'); |
$r->print(&Apache::loncommon::start_data_table()."\n". |
$r->print(&Apache::loncommon::start_data_table()."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
Line 8012 sub checkscantron_results {
|
Line 8088 sub checkscantron_results {
|
&Apache::loncommon::end_data_table().'<br />'); |
&Apache::loncommon::end_data_table().'<br />'); |
} |
} |
if ($failed) { |
if ($failed) { |
$r->print(&mt('Students with differences between scantron data and submissions are as follows:').'<br /><br />'); |
$r->print(&mt('Students with differences between bubblesheet data and submissions are as follows:').'<br /><br />'); |
$r->print(&Apache::loncommon::start_data_table()."\n". |
$r->print(&Apache::loncommon::start_data_table()."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
&Apache::loncommon::start_data_table_header_row()."\n". |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
'<th>'.&mt('Source').'</th><th>'.&mt('Bubble records').'</th><th>'.&mt('Name').'</th><th>'.&mt('ID').'</th>'. |
&Apache::loncommon::end_data_table_header_row()."\n". |
&Apache::loncommon::end_data_table_header_row()."\n". |
$badstudents."\n". |
$badstudents."\n". |
&Apache::loncommon::end_data_table()).'<br />'. |
&Apache::loncommon::end_data_table()).'<br />'. |
&mt('Differences can occur if submissions were modified using manual grading after a scantron grading pass.').'<br />'.&mt('If unexpected discrepancies were detected, it is recommended that you inspect the original scantron sheets.'); |
&mt('Differences can occur if submissions were modified using manual grading after a bubblesheet grading pass.').'<br />'.&mt('If unexpected discrepancies were detected, it is recommended that you inspect the original bubblesheets.'); |
} |
} |
$r->print('</form><br />'.$grading_menu_button); |
$r->print('</form><br />'.$grading_menu_button); |
return; |
return; |
Line 8580 sub process_clicker {
|
Line 8656 sub process_clicker {
|
my %checked; |
my %checked; |
foreach my $gradingmechanism ('attendance','personnel','specific','given') { |
foreach my $gradingmechanism ('attendance','personnel','specific','given') { |
if ($env{'form.gradingmechanism'} eq $gradingmechanism) { |
if ($env{'form.gradingmechanism'} eq $gradingmechanism) { |
$checked{$gradingmechanism}="checked='checked'"; |
$checked{$gradingmechanism}=' checked="checked"'; |
} |
} |
} |
} |
|
|
Line 8644 function sanitycheck() {
|
Line 8720 function sanitycheck() {
|
<input type="hidden" name="saveState" value="$env{'form.saveState'}" /> |
<input type="hidden" name="saveState" value="$env{'form.saveState'}" /> |
<input type="file" name="upfile" size="50" /> |
<input type="file" name="upfile" size="50" /> |
<br /><label>$type: $selectform</label> |
<br /><label>$type: $selectform</label> |
<br /><label><input type="radio" name="gradingmechanism" value="attendance" $checked{'attendance'} onClick="sanitycheck()" />$attendance </label> |
<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onClick="sanitycheck()" />$attendance </label> |
<br /><label><input type="radio" name="gradingmechanism" value="personnel" $checked{'personnel'} onClick="sanitycheck()" />$personnel</label> |
<br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onClick="sanitycheck()" />$personnel</label> |
<br /><label><input type="radio" name="gradingmechanism" value="specific" $checked{'specific'} onClick="sanitycheck()" />$specific </label> |
<br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onClick="sanitycheck()" />$specific </label> |
<input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> |
<input type="text" name="specificid" value="$env{'form.specificid'}" size="20" /> |
<br /><label><input type="radio" name="gradingmechanism" value="given" $checked{'given'} onClick="sanitycheck()" />$given </label> |
<br /><label><input type="radio" name="gradingmechanism" value="given"$checked{'given'} onClick="sanitycheck()" />$given </label> |
<br /> |
<br /> |
<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'}" /> |