version 1.130.2.1.2.3, 2003/09/25 08:30:57
|
version 1.143, 2003/10/08 18:25:18
|
Line 185 sub cleanRecord {
|
Line 185 sub cleanRecord {
|
$ENV{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$ENV{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : ''; |
$ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
$ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob. |
} |
} |
return '<br /><br /><blockquote>'.&keywords_highlight($answer).'</blockquote>'; |
return '<br /><br /><blockquote><pre>'.&keywords_highlight($answer).'</pre></blockquote>'; |
} |
} |
return $answer; |
return $answer; |
} |
} |
Line 218 sub commonJSfunctions {
|
Line 218 sub commonJSfunctions {
|
} |
} |
} |
} |
} else { |
} else { |
if (selectOne.selected) return selectOne.value; |
// only one value it must be the selected one |
|
return selectOne.value; |
} |
} |
} |
} |
</script> |
</script> |
Line 517 LISTJAVASCRIPT
|
Line 518 LISTJAVASCRIPT
|
my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'}; |
my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'}; |
$ENV{'form.Status'} = $saveStatus; |
$ENV{'form.Status'} = $saveStatus; |
|
|
$gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n". |
$gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only'."\n". |
'<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n". |
'<input type="radio" name="lastSub" value="last" /> last submission & parts info'."\n". |
'<input type="radio" name="lastSub" value="datesub" /> by dates and submissions'."\n". |
'<input type="radio" name="lastSub" value="datesub" /> by dates and submissions'."\n". |
'<input type="radio" name="lastSub" value="all" /> all details'."\n". |
'<input type="radio" name="lastSub" value="all" /> all details'."\n". |
'<input type="hidden" name="section" value="'.$getsec.'" />'."\n". |
'<input type="hidden" name="section" value="'.$getsec.'" />'."\n". |
Line 544 LISTJAVASCRIPT
|
Line 545 LISTJAVASCRIPT
|
$gradeTable.='<input type="button" '."\n". |
$gradeTable.='<input type="button" '."\n". |
'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". |
'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". |
'value="Next->" />'."\n"; |
'value="Next->" />'."\n"; |
|
$gradeTable.='<input type="checkbox" name="checkPlag" checked="on">Check For Plagiarism</input>'; |
my (undef, undef, $fullname) = &getclasslist($getsec,'1'); |
my (undef, undef, $fullname) = &getclasslist($getsec,'1'); |
$gradeTable.='<table border="0"><tr><td bgcolor="#777777">'. |
$gradeTable.='<table border="0"><tr><td bgcolor="#777777">'. |
'<table border="0"><tr bgcolor="#e6ffff">'; |
'<table border="0"><tr bgcolor="#e6ffff">'; |
Line 1461 KEYWORDS
|
Line 1462 KEYWORDS
|
my ($ressub,$subval) = split(/:/,$_,2); |
my ($ressub,$subval) = split(/:/,$_,2); |
# Similarity check |
# Similarity check |
my $similar=''; |
my $similar=''; |
my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval); |
my $oname; |
if ($osim) { |
my $odom; |
$osim=int($osim*100.0); |
my $ocrsid; |
$similar='<hr /><h3><font color="#FF0000">Essay is '.$osim. |
my $oessay; |
'% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom). |
my $osim; |
'</font></h3><blockquote><i>'. |
if($ENV{'form.checkPlag'}){ |
&keywords_highlight($oessay).'</i></blockquote><hr />'; |
($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval); |
|
if ($osim) { |
|
$osim=int($osim*100.0); |
|
$similar='<hr /><h3><font color="#FF0000">Essay is '.$osim. |
|
'% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom). |
|
'</font></h3><blockquote><i>'. |
|
&keywords_highlight($oessay).'</i></blockquote><hr />'; |
|
} |
} |
} |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
$partid.'</b> <font color="#999999">( ID '.$respid. |
Line 1480 KEYWORDS
|
Line 1488 KEYWORDS
|
'this file may contain virusses</font><br />':''). |
'this file may contain virusses</font><br />':''). |
'<b>Submitted Answer: </b>'. |
'<b>Submitted Answer: </b>'. |
&cleanRecord($subval,$responsetype,$symb). |
&cleanRecord($subval,$responsetype,$symb). |
'<br /><br />'.$similar."\n" |
'<br /><br />'.$similar."\n" |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
if ($ENV{'form.lastSub'} eq 'lastonly' || |
($ENV{'form.lastSub'} eq 'hdgrade' && |
($ENV{'form.lastSub'} eq 'hdgrade' && |
$$handgrade{$part} =~ /:yes$/)); |
$$handgrade{$part} =~ /:yes$/)); |
Line 2327 sub editgrades {
|
Line 2335 sub editgrades {
|
$newrecord{'resource.'.$_.'.awarded'} = 0; |
$newrecord{'resource.'.$_.'.awarded'} = 0; |
$newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; |
$newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}"; |
$updateflag = 1; |
$updateflag = 1; |
|
} elsif (!($old_part eq $partial && $old_score eq $score)) { |
|
$updateflag = 1; |
|
$newrecord{'resource.'.$_.'.awarded'} = $partial if $partial ne ''; |
|
$newrecord{'resource.'.$_.'.solved'} = $score; |
|
$rec_update++; |
} |
} |
|
|
$line .= '<td align="center">'.$old_aw.' </td>'. |
$line .= '<td align="center">'.$old_aw.' </td>'. |
'<td align="center">'.$awarded. |
'<td align="center">'.$awarded. |
($score eq 'excused' ? $score : '').' </td>'; |
($score eq 'excused' ? $score : '').' </td>'; |
|
|
if (!($old_part eq $partial && $old_score eq $score)) { |
|
$updateflag = 1; |
|
$newrecord{'resource.'.$_.'.awarded'} = $partial if $partial ne ''; |
|
$newrecord{'resource.'.$_.'.solved'} = $score; |
|
$rec_update++; |
|
} |
|
|
|
my $partid=$_; |
my $partid=$_; |
foreach my $stores (@parts) { |
foreach my $stores (@parts) { |
Line 2726 LISTJAVASCRIPT
|
Line 2733 LISTJAVASCRIPT
|
$result.='<form action="/adm/grades" method="post" name="displayPage">'."\n"; |
$result.='<form action="/adm/grades" method="post" name="displayPage">'."\n"; |
$result.=' <b>Problems from:</b> <select name="selectpage">'."\n"; |
$result.=' <b>Problems from:</b> <select name="selectpage">'."\n"; |
my ($titles,$symbx) = &getSymbMap($request); |
my ($titles,$symbx) = &getSymbMap($request); |
my ($curpage,$type,$mapId) = ($symb =~ /(.*?\.(page|sequence))___(\d+)___/); |
my ($curpage) =&Apache::lonnet::decode_symb($symb); |
|
# my ($curpage,$mapId) =&Apache::lonnet::decode_symb($symb); |
|
# my $type=($curpage =~ /\.(page|sequence)/); |
my $ctr=0; |
my $ctr=0; |
foreach (@$titles) { |
foreach (@$titles) { |
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
Line 2798 LISTJAVASCRIPT
|
Line 2807 LISTJAVASCRIPT
|
|
|
sub getSymbMap { |
sub getSymbMap { |
my ($request) = @_; |
my ($request) = @_; |
my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db', |
my $navmap = Apache::lonnavmaps::navmap->new(); |
$ENV{'request.course.fn'}.'_parms.db'); |
|
# $navmap->init(); |
|
|
|
my %symbx = (); |
my %symbx = (); |
my @titles = (); |
my @titles = (); |
Line 2845 sub displayPage {
|
Line 2852 sub displayPage {
|
&sub_page_js($request); |
&sub_page_js($request); |
$request->print($result); |
$request->print($result); |
|
|
my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db', |
my $navmap = Apache::lonnavmaps::navmap->new(); |
$ENV{'request.course.fn'}.'_parms.db',1, 1); |
my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($ENV{'form.page'}); |
my ($mapUrl, $id, $resUrl) = split(/___/, $ENV{'form.page'}); |
|
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
|
|
my $iterator = $navmap->getIterator($map->map_start(), |
my $iterator = $navmap->getIterator($map->map_start(), |
Line 3008 sub updateGradeByPage {
|
Line 3014 sub updateGradeByPage {
|
|
|
$request->print($result); |
$request->print($result); |
|
|
my $navmap = Apache::lonnavmaps::navmap-> new($ENV{'request.course.fn'}.'.db', |
my $navmap = Apache::lonnavmaps::navmap->new(); |
$ENV{'request.course.fn'}.'_parms.db',1, 1); |
my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $ENV{'form.page'}); |
my ($mapUrl, $id, $resUrl) = split(/___/, $ENV{'form.page'}); |
|
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps |
|
|
my $iterator = $navmap->getIterator($map->map_start(), |
my $iterator = $navmap->getIterator($map->map_start(), |
Line 3132 sub getSequenceDropDown {
|
Line 3137 sub getSequenceDropDown {
|
my ($request,$symb)=@_; |
my ($request,$symb)=@_; |
my $result='<select name="selectpage">'."\n"; |
my $result='<select name="selectpage">'."\n"; |
my ($titles,$symbx) = &getSymbMap($request); |
my ($titles,$symbx) = &getSymbMap($request); |
my ($curpage,$type,$mapId) = ($symb =~ /(.*?\.(page|sequence))___(\d+)___/); |
my ($curpage)=&Apache::lonnet::decode_symb($symb); |
my $ctr=0; |
my $ctr=0; |
foreach (@$titles) { |
foreach (@$titles) { |
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); |
Line 3146 sub getSequenceDropDown {
|
Line 3151 sub getSequenceDropDown {
|
} |
} |
|
|
sub scantron_uploads { |
sub scantron_uploads { |
#FIXME need to support scantron files put in another location, |
|
# maybe the course directory? a scantron dir in the course directory? |
|
if (!-e $Apache::lonnet::perlvar{'lonScansDir'}) { return ''}; |
if (!-e $Apache::lonnet::perlvar{'lonScansDir'}) { return ''}; |
my $result= '<select name="scantron_selectfile">'; |
my $result= '<select name="scantron_selectfile">'; |
opendir(DIR,$Apache::lonnet::perlvar{'lonScansDir'}); |
opendir(DIR,$Apache::lonnet::perlvar{'lonScansDir'}); |
Line 3184 sub scantron_selectphase {
|
Line 3187 sub scantron_selectphase {
|
my $file_selector=&scantron_uploads(); |
my $file_selector=&scantron_uploads(); |
my $format_selector=&scantron_scantab(); |
my $format_selector=&scantron_scantab(); |
my $result; |
my $result; |
#FIXME allow instructor to be able to download the scantron file |
|
# and to upload it, |
|
$result.= <<SCANTRONFORM; |
$result.= <<SCANTRONFORM; |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process"> |
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process"> |
<input type="hidden" name="command" value="scantron_validate" /> |
<input type="hidden" name="command" value="scantron_validate" /> |
Line 3230 sub get_scantron_config {
|
Line 3231 sub get_scantron_config {
|
my ($which) = @_; |
my ($which) = @_; |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my %config; |
my %config; |
#FIXME probably should move to XML it has already gotten a bit much now |
|
foreach my $line (<$fh>) { |
foreach my $line (<$fh>) { |
my ($name,$descrip)=split(/:/,$line); |
my ($name,$descrip)=split(/:/,$line); |
if ($name ne $which ) { next; } |
if ($name ne $which ) { next; } |
Line 3247 sub get_scantron_config {
|
Line 3247 sub get_scantron_config {
|
$config{'Qlength'}=$config[8]; |
$config{'Qlength'}=$config[8]; |
$config{'Qoff'}=$config[9]; |
$config{'Qoff'}=$config[9]; |
$config{'Qon'}=$config[10]; |
$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]; |
|
last; |
last; |
} |
} |
return %config; |
return %config; |
Line 3268 sub username_to_idmap {
|
Line 3262 sub username_to_idmap {
|
return %idmap; |
return %idmap; |
} |
} |
|
|
sub scantron_fixup_scanline { |
|
my ($scantron_config,$line,$field,$newvalue) = @_; |
|
if ($field eq 'ID') { |
|
if ($newvalue > $$scantron_config{'IDlength'}) { |
|
return ($line,1,'New value to large'); |
|
} |
|
if ($newvalue < $$scantron_config{'IDlength'}) { |
|
$newvalue=sprintf('%-'.$$scantron_config{'IDlength'}.'s', |
|
$newvalue); |
|
} |
|
substr($line,$$scantron_config{'IDstart'}-1, |
|
$$scantron_config{'IDlength'})=$newvalue; |
|
} |
|
return $line; |
|
} |
|
|
|
sub scantron_parse_scanline { |
sub scantron_parse_scanline { |
my ($line,$scantron_config)=@_; |
my ($line,$scantron_config)=@_; |
my %record; |
my %record; |
Line 3299 sub scantron_parse_scanline {
|
Line 3277 sub scantron_parse_scanline {
|
} |
} |
$record{'scantron.ID'}=substr($data,$$scantron_config{'IDstart'}-1, |
$record{'scantron.ID'}=substr($data,$$scantron_config{'IDstart'}-1, |
$$scantron_config{'IDlength'}); |
$$scantron_config{'IDlength'}); |
$record{'scantron.paperID'}= |
|
substr($data,$$scantron_config{'PaperID'}-1, |
|
$$scantron_config{'PaperIDlength'}); |
|
$record{'scantron.FirstName'}= |
|
substr($data,$$scantron_config{'FirstName'}-1, |
|
$$scantron_config{'FirstNamelength'}); |
|
$record{'scantron.LastName'}= |
|
substr($data,$$scantron_config{'LastName'}-1, |
|
$$scantron_config{'LastNamelength'}); |
|
my @alphabet=('A'..'Z'); |
my @alphabet=('A'..'Z'); |
my $questnum=0; |
my $questnum=0; |
while ($questions) { |
while ($questions) { |
Line 3318 sub scantron_parse_scanline {
|
Line 3287 sub scantron_parse_scanline {
|
my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest); |
my (@array)=split(/$$scantron_config{'Qon'}/,$currentquest); |
if (scalar(@array) gt 2) { |
if (scalar(@array) gt 2) { |
#FIXME do something intelligent with double bubbles |
#FIXME do something intelligent with double bubbles |
#actually not a concern right now, should be taking care of later |
|
Apache->request->print("<br ><b>Wha!!!</b> <pre>".scalar(@array). |
Apache->request->print("<br ><b>Wha!!!</b> <pre>".scalar(@array). |
'-'.$currentquest.'-'.$questnum.'</pre><br />'); |
'-'.$currentquest.'-'.$questnum.'</pre><br />'); |
} |
} |
Line 3370 sub scantron_filter {
|
Line 3338 sub scantron_filter {
|
#the corrected one, I'll still need to catch error conditions, but |
#the corrected one, I'll still need to catch error conditions, but |
#maybe most will taken care even before we start |
#maybe most will taken care even before we start |
|
|
sub scantron_process_corrections { |
|
my ($r) = @_; |
|
if ($ENV{'form.scantron_corrections'} =~ /^(duplicate|incorrect)ID$/) { |
|
my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'}); |
|
my $scanlines=&scantron_getfile(); |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my $which=$ENV{'form.scantron_line'}; |
|
my $line=&scantron_get_line($scanlines,$which); |
|
my $newstudent=$ENV{'form.scantron_username'}.':'. |
|
$ENV{'form.scantron_domain'}; |
|
my $newid=$classlist->{$newstudent}->[&Apache::loncoursedata::CL_ID]; |
|
($line,my $err,my $errmsg)= |
|
&scantron_fixup_scanline(\%scantron_config,$line,'ID',$newid); |
|
if ($err) { |
|
$r->print("Unable to accept last correction, an error occurred :$errmsg:"); |
|
} else { |
|
&scantron_put_line($scanlines,$which,$line); |
|
&scantron_putfile($scanlines); |
|
} |
|
} |
|
} |
|
|
|
sub scantron_validate_file { |
sub scantron_validate_file { |
my ($r) = @_; |
my ($r) = @_; |
my ($symb,$url)=&get_symb_and_url($r); |
|
if (!$symb) {return '';} |
|
my $default_form_data=&defaultFormData($symb,$url); |
|
|
|
if ($ENV{'form.scantron_corrections'}) { |
|
&scantron_process_corrections($r); |
|
} |
|
#get the student pick code ready |
|
$r->print(&Apache::loncommon::studentbrowser_javascript()); |
|
my $result= <<SCANTRONFORM; |
|
<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantronupload"> |
|
<input type="hidden" name="command" value="scantron_validate" /> |
|
<input type="hidden" name="selectpage" value="$ENV{'form.selectpage'}" /> |
|
<input type="hidden" name="scantron_format" value="$ENV{'form.scantron_format'}" /> |
|
<input type="hidden" name="scantron_selectfile" value="$ENV{'form.scantron_selectfile'}" /> |
|
$default_form_data |
|
SCANTRONFORM |
|
$r->print($result); |
|
|
|
my @validate_phases=( 'ID', |
|
'CODE', |
|
'doublebubble', |
|
'missingbubbles'); |
|
if (!$ENV{'form.validatepass'}) { |
|
$ENV{'form.valiadatepass'} = 0; |
|
} |
|
my $currentphase=$ENV{'form.valiadatepass'}; |
|
|
|
if ($ENV{'form.scantron_selectfile'}=~m-^/-) { |
|
#first pass copy file to classdir |
|
|
|
} |
|
my $stop=0; |
|
while (!$stop && $currentphase < scalar(@validate_phases)) { |
|
my $which="scantron_validate_".$validate_phases[$currentphase]; |
|
{ |
|
no strict 'refs'; |
|
($stop,$currentphase)=&$which($r,$currentphase); |
|
} |
|
} |
|
$r->print("<input type='hidden' name='validatepass' value='".$currentphase."' />"); |
|
return ''; |
|
} |
|
|
|
sub scantron_getfile { |
|
#my $scanlines=Apache::File->new($Apache::lonnet::perlvar{'lonScansDir'}."/$ENV{'form.scantron_selectfile'}"); |
|
#FIXME really would prefer a scantron directory but tokenwrapper |
|
# doesn't allow access to subdirs of userfiles |
|
my $lines; |
|
$lines=&Apache::lonnet::getfile('/uploaded/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'. |
|
'scantron_orig_'.$ENV{'form.scantron_selectfile'}); |
|
if ($lines eq '-1') { |
|
#FIXME need to actually replicate file to course space |
|
} |
|
my %scanlines; |
|
$scanlines{'orig'}=[split("\n",$lines)]; |
|
my $temp=$scanlines{'orig'}; |
|
$scanlines{'count'}=$#$temp; |
|
|
|
$lines=&Apache::lonnet::getfile('/uploaded/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'. |
|
'scantron_corrected_'.$ENV{'form.scantron_selectfile'}); |
|
if ($lines eq '-1') { |
|
$scanlines{'corrected'}=[]; |
|
} else { |
|
$scanlines{'corrected'}=[split("\n",$lines)]; |
|
} |
|
$lines=&Apache::lonnet::getfile('/uploaded/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'. |
|
'scantron_skipped_'.$ENV{'form.scantron_selectfile'}); |
|
if ($lines eq '-1') { |
|
$scanlines{'skipped'}=[]; |
|
} else { |
|
$scanlines{'skipped'}=[split("\n",$lines)]; |
|
} |
|
return \%scanlines; |
|
} |
|
|
|
sub lonnet_putfile { |
|
my ($contents,$filename)=@_; |
|
my $docuname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
|
my $docudom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
|
my $docuhome=$ENV{'course.'.$ENV{'request.course.id'}.'.home'}; |
|
$ENV{'form.sillywaytopassafilearound'}=$contents; |
|
&Apache::lonnet::finishuserfileupload($docuname,$docudom,$docuhome,'sillywaytopassafilearound',$filename); |
|
|
|
} |
|
|
|
sub scantron_putfile { |
|
my ($scanlines) = @_; |
|
#FIXME really would prefer a scantron directory but tokenwrapper |
|
# doesn't allow access to subdirs of userfiles |
|
my $prefix='/uploaded/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'. |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'. |
|
'scantron_'; |
|
my $prefix='scantron_'; |
|
# no need to update orig, shouldn't change |
|
# &lonnet_putfile(join("\n",@{$scanlines->{'orig'}}),$prefix.'orig_'. |
|
# $ENV{'form.scantron_selectfile'}); |
|
&lonnet_putfile(join("\n",@{$scanlines->{'corrected'}}), |
|
$prefix.'corrected_'. |
|
$ENV{'form.scantron_selectfile'}); |
|
&lonnet_putfile(join("\n",@{$scanlines->{'skipped'}}), |
|
$prefix.'skipped_'. |
|
$ENV{'form.scantron_selectfile'}); |
|
} |
|
|
|
sub scantron_get_line { |
|
my ($scanlines,$i)=@_; |
|
if ($scanlines->{'skipped'}[$i]) {return undef;} |
|
if ($scanlines->{'corrected'}[$i]) {return $scanlines->{'corrected'}[$i];} |
|
return $scanlines->{'orig'}[$i]; |
|
} |
|
|
|
sub scantron_put_line { |
|
my ($scanlines,$i,$newline,$skip)=@_; |
|
if ($skip) { $scanlines->{'skipped'}[$i]=$newline;return; } |
|
$scanlines->{'corrected'}[$i]=$newline; |
|
} |
|
|
|
sub scantron_validate_ID { |
|
my ($r,$currentphase) = @_; |
|
|
|
#get student info |
|
my $classlist=&Apache::loncoursedata::get_classlist(); |
|
my %idmap=&username_to_idmap($classlist); |
|
|
|
#get scantron line setup |
|
my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'}); |
|
my $scanlines=&scantron_getfile(); |
|
|
|
my %found=('ids'=>{},'usernames'=>{}); |
|
for (my $i=0;$i<=$scanlines->{'count'};$i++) { |
|
my $line=&scantron_get_line($scanlines,$i); |
|
if (!$line) { next; } |
|
my $scan_record=&scantron_parse_scanline($line,\%scantron_config); |
|
my $id=$$scan_record{'scantron.ID'}; |
|
$r->print("<p>Checking ID ".$$scan_record{'scantron.ID'}."</p>\n"); |
|
my $found; |
|
foreach my $checkid (keys(%idmap)) { |
|
if (lc($checkid) eq lc($id)) { |
|
if ($checkid ne $id) { |
|
$r->print("<p>Using $checkid for bubbled $id</p>\n"); |
|
} |
|
$found=$checkid;last; |
|
} |
|
} |
|
if ($found) { |
|
if ($found{'ids'}{$found}) { |
|
#FIXME store away line we prviously saw the ID on |
|
&scantron_get_ID_correction($r,$i,$scan_record, |
|
'duplicateID',$found); |
|
return(1); |
|
} else { |
|
$found{'ids'}{$found}++; |
|
} |
|
} else { |
|
&scantron_get_ID_correction($r,$i,$scan_record,'incorrectID'); |
|
return(1); |
|
} |
|
} |
|
|
|
return (0,$currentphase+1); |
|
} |
|
|
|
sub scantron_get_ID_correction { |
|
my ($r,$i,$scan_record,$error,$arg)=@_; |
|
#FIXME allow th poosibility of skipping a line, or in the case of a duplicated ID the previous line, probaly need to show both the current line and the previous one. |
|
$r->print("<p>need to correct ID</p>\n"); |
|
$r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n"); |
|
$r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n"); |
|
if ($error eq 'unknownID') { |
|
$r->print("<p> Unknown ID </p>\n"); |
|
} elsif ($error eq 'duplicateID') { |
|
$r->print("<p> Duplicated ID </p>\n"); |
|
} |
|
$r->print("<p>Original ID is ".$$scan_record{'scantron.ID'}."</p>\n"); |
|
$r->print("<p>Name on paper is ".$$scan_record{'scantron.LastName'}.",". |
|
$$scan_record{'scantron.FirstName'}."</p>"); |
|
$r->print("Corrected User -- "); |
|
$r->print("\nusername:<input type='text' name='scantron_username' value='' />"); |
|
$r->print("\ndomain:". |
|
&Apache::loncommon::select_dom_form(undef,'scantron_domain')); |
|
#FIXME it would be nice if this sent back the user ID and |
|
#could do partial userID matches |
|
$r->print(&Apache::loncommon::selectstudent_link('scantronupload', |
|
'scantron_username','scantron_domain')); |
|
&scantron_end_validate_form($r); |
|
} |
|
|
|
sub scantron_end_validate_form { |
|
my ($r) = @_; |
|
$r->print('<input type="submit" name="submit" /></form></body></html>'); |
|
} |
} |
|
|
sub scantron_process_students { |
sub scantron_process_students { |
my ($r) = @_; |
my ($r) = @_; |
my (undef,undef,$sequence)=split(/___/,$ENV{'form.selectpage'}); |
my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($ENV{'form.selectpage'}); |
my ($symb,$url)=&get_symb_and_url($r); |
my ($symb,$url)=&get_symb_and_url($r); |
if (!$symb) {return '';} |
if (!$symb) {return '';} |
my $default_form_data=&defaultFormData($symb,$url); |
my $default_form_data=&defaultFormData($symb,$url); |
Line 3606 sub scantron_process_students {
|
Line 3354 sub scantron_process_students {
|
my @scanlines=<$scanlines>; |
my @scanlines=<$scanlines>; |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my $classlist=&Apache::loncoursedata::get_classlist(); |
my %idmap=&username_to_idmap($classlist); |
my %idmap=&username_to_idmap($classlist); |
my $navmap=Apache::lonnavmaps::navmap->new($ENV{'request.course.fn'}.'.db',$ENV{'request.course.fn'}.'_parms.db',1, 1); |
my $navmap=Apache::lonnavmaps::navmap->new(); |
my $map=$navmap->getResourceByUrl($sequence); |
my $map=$navmap->getResourceByUrl($sequence); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
# $r->print("geto ".scalar(@resources)."<br />"); |
# $r->print("geto ".scalar(@resources)."<br />"); |
Line 3881 sub handler {
|
Line 3629 sub handler {
|
|
|
undef(%perm); |
undef(%perm); |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
$request->content_type('text/xml'); |
&Apache::loncommon::content_type($request,'text/xml'); |
} else { |
} else { |
$request->content_type('text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
} |
} |
$request->send_http_header; |
$request->send_http_header; |
return '' if $request->header_only; |
return '' if $request->header_only; |
Line 3893 sub handler {
|
Line 3641 sub handler {
|
my $command=$ENV{'form.command'}; |
my $command=$ENV{'form.command'}; |
if (!$url) { |
if (!$url) { |
my ($temp1,$temp2); |
my ($temp1,$temp2); |
($temp1,$temp2,$ENV{'form.url'})=split(/___/,$symb); |
($temp1,$temp2,$ENV{'form.url'})=&Apache::lonnet::decode_symb($symb); |
$url = $ENV{'form.url'}; |
$url = $ENV{'form.url'}; |
} |
} |
&send_header($request); |
&send_header($request); |
Line 3906 sub handler {
|
Line 3654 sub handler {
|
my ($tsymb,$tuname,$tudom,$tcrsid)= |
my ($tsymb,$tuname,$tudom,$tcrsid)= |
&Apache::lonnet::checkin($token); |
&Apache::lonnet::checkin($token); |
if ($tsymb) { |
if ($tsymb) { |
my ($map,$id,$url)=split(/\_\_\_/,$tsymb); |
my ($map,$id,$url)=&Apache::lonnet::decode_symb($tsymb); |
if (&Apache::lonnet::allowed('mgr',$tcrsid)) { |
if (&Apache::lonnet::allowed('mgr',$tcrsid)) { |
$request->print(&Apache::lonnet::ssi_body('/res/'.$url, |
$request->print(&Apache::lonnet::ssi_body('/res/'.$url, |
('grade_username' => $tuname, |
('grade_username' => $tuname, |