[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--