[LON-CAPA-cvs] cvs: loncom(version_1_0_2_scantron) /homework grades.pm
albertel
lon-capa-cvs@mail.lon-capa.org
Thu, 25 Sep 2003 08:30:57 -0000
This is a MIME encoded message
--albertel1064478657
Content-Type: text/plain
albertel Thu Sep 25 04:30:57 2003 EDT
Modified files: (Branch: version_1_0_2_scantron)
/loncom/homework grades.pm
Log:
- yeah corrected my first error, and I thik I am not to un happy with the infrasturcture
--albertel1064478657
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20030925043057.txt"
Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.130.2.1.2.2 loncom/homework/grades.pm:1.130.2.1.2.3
--- loncom/homework/grades.pm:1.130.2.1.2.2 Wed Sep 24 22:46:19 2003
+++ loncom/homework/grades.pm Thu Sep 25 04:30:57 2003
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.130.2.1.2.2 2003/09/25 02:46:19 albertel Exp $
+# $Id: grades.pm,v 1.130.2.1.2.3 2003/09/25 08:30:57 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -3268,6 +3268,22 @@
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 {
my ($line,$scantron_config)=@_;
my %record;
@@ -3354,6 +3370,28 @@
#the corrected one, I'll still need to catch error conditions, but
#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 {
my ($r) = @_;
my ($symb,$url)=&get_symb_and_url($r);
@@ -3397,6 +3435,88 @@
}
}
$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 {
@@ -3408,18 +3528,12 @@
#get scantron line setup
my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
- #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 $scanlines=&Apache::lonnet::getfile('/uploaded/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/'.
- 'scantron_'.$ENV{'form.scantron_selectfile'});
-
- my @scanlines=split("\n",$scanlines);
+ my $scanlines=&scantron_getfile();
my %found=('ids'=>{},'usernames'=>{});
- foreach my $line (@scanlines) {
+ 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");
@@ -3434,13 +3548,15 @@
}
if ($found) {
if ($found{'ids'}{$found}) {
- &scantron_get_ID_correction($r,$line,$scan_record,'duplicate',$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,$line,$scan_record,'incorrect');
+ &scantron_get_ID_correction($r,$i,$scan_record,'incorrectID');
return(1);
}
}
@@ -3449,13 +3565,14 @@
}
sub scantron_get_ID_correction {
- my ($r,$line,$scan_record,$error,$arg)=@_;
+ 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="'.&HTML::Entities::encode($line).'" />'."\n");
- if ($error eq 'unknown') {
+ $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 'duplicate') {
+ } elsif ($error eq 'duplicateID') {
$r->print("<p> Duplicated ID </p>\n");
}
$r->print("<p>Original ID is ".$$scan_record{'scantron.ID'}."</p>\n");
--albertel1064478657--