version 1.566, 2009/05/01 14:16:13
|
version 1.567, 2009/05/04 22:41:37
|
Line 7787 sub scantron_upload_scantron_data_save {
|
Line 7787 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 />"); |
$r->print('<h3>'.&mt("Uploading file to [_1]",$coursedata{'description'}).'</h3>'); |
my $fname=$env{'form.upfile.filename'}; |
my $fname=$env{'form.upfile.filename'}; |
#FIXME |
#FIXME |
#copied from lonnet::userfileupload() |
#copied from lonnet::userfileupload() |
Line 7809 sub scantron_upload_scantron_data_save {
|
Line 7809 sub scantron_upload_scantron_data_save {
|
} else { |
} else { |
my $result=&Apache::lonnet::finishuserfileupload($env{'form.courseid'},$env{'form.domainid'},'upfile',$fname); |
my $result=&Apache::lonnet::finishuserfileupload($env{'form.courseid'},$env{'form.domainid'},'upfile',$fname); |
if ($result =~ m|^/uploaded/|) { |
if ($result =~ m|^/uploaded/|) { |
$r->print(&mt("<span class=\"LC_success\">Success:</span> Successfully uploaded [_1] bytes of data into location [_2]", |
$r->print(&mt('[_1]Success:[_2] Successfully uploaded [_3] bytes of data into location: [_4]', |
(length($env{'form.upfile'})-1), |
'<span class="LC_success">','</span>',(length($env{'form.upfile'})-1), |
'<span class="LC_filename">'.$result."</span>")); |
'<span class="LC_filename">'.$result.'</span>')); |
|
$r->print(&validate_uploaded_scantron_file($env{'form.domainid'}, |
|
$env{'form.courseid'},$fname)); |
} 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 7827 sub scantron_upload_scantron_data_save {
|
Line 7828 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())) { |