--- loncom/homework/grades.pm	2003/11/12 21:37:07	1.159
+++ loncom/homework/grades.pm	2003/11/25 21:44:45	1.162
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.159 2003/11/12 21:37:07 albertel Exp $
+# $Id: grades.pm,v 1.162 2003/11/25 21:44:45 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2840,7 +2840,9 @@ sub csvuploadassign {
     foreach my $grade (@gradedata) {
 	my %entries=&Apache::loncommon::record_sep($grade);
 	my $username=$entries{$fields{'username'}};
+	$username=~s/\s//g;
 	my $domain=$entries{$fields{'domain'}};
+	$domain=~s/\s//g;
 	if (!exists($$classlist{"$username:$domain"})) {
 	    push(@skipped,"$username:$domain");
 	    next;
@@ -3377,7 +3379,7 @@ sub scantron_uploads {
     my $cdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     my $cname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
     my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname,
-				    &Apache::locommon::propath($cdom,$cname));
+				    &Apache::loncommon::propath($cdom,$cname));
     foreach my $filename (@files) {
 	($filename)=split(/&/,$filename);
 	if ($filename!~/^scantron_orig_/) { next ; }
@@ -3414,12 +3416,12 @@ sub scantron_selectphase {
     #FIXME allow instructor to be able to download the scantron file
     # and to upload it,
     $result.= <<SCANTRONFORM;
-<form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process">
-  <input type="hidden" name="command" value="scantron_validate" />
-  $default_form_data
-  <table width="100%" border="0">
+    <table width="100%" border="0">
     <tr>
       <td bgcolor="#777777">
+       <form method="post" enctype="multipart/form-data" action="/adm/grades" name="scantro_process">
+       <input type="hidden" name="command" value="scantron_validate" />
+        $default_form_data
         <table width="100%" border="0">
           <tr bgcolor="#e6ffff">
             <td>
@@ -3448,16 +3450,52 @@ sub scantron_selectphase {
                 <input type="text" name="scantron_maxbubble" />
 	    </td>
           </tr>
+          <tr bgcolor="#ffffe6">
+            <td>
+              <input type="submit" value="Validate Scantron Records" />
+            </td>
+          </tr>
+        </table>
+       </form>
+      </td>
+    </tr>
+SCANTRONFORM
+   
+    $r->print($result);
+
+    if (&Apache::lonnet::allowed('usc',$ENV{'request.role.domain'}) ||
+        &Apache::lonnet::allowed('usc',$ENV{'request.course.id'})) {
+
+        $r->print(<<SCANTRONFORM);
+    <tr>
+      <td bgcolor="#777777">
+        <table width="100%" border="0">
+          <tr bgcolor="#e6ffff">
+            <td>
+              Specify a Scantron data file to upload.
+            </td>
+          </tr>
+          <tr bgcolor="#ffffe6">
+            <td>
+SCANTRONFORM
+        &scantron_upload_scantron_data($r);
+
+        $r->print(<<SCANTRONFORM);
+            </td>
+          </tr>
         </table>
       </td>
     </tr>
+SCANTRONFORM
+    }
+
+    $r->print(<<SCANTRONFORM);
   </table>
-  <input type="submit" value="Validate Scantron Records" />
 </form>
 $grading_menu_button
 SCANTRONFORM
 
-    return $result;
+    return
 }
 
 sub get_scantron_config {
@@ -3632,18 +3670,6 @@ sub scantron_filter {
     return 0;
 }
 
-#FIXME I think I am doing this in the wrong order, I think it would be
-#better to make a several passes analyzing all of the lines in the
-#file for common errors wrong/invalid PID/username duplicated
-#PID/username, missing bubbles, double bubbles, missing/invalid CODE
-#and then get the instructor to fix all of these errors, then grade
-#the corrected one, I'll still need to catch error conditions, but
-#maybe most will taken care even before we start
-
-sub scantron_validate_file {
-    my ($r) = @_;
-}
-
 sub scantron_process_corrections {
     my ($r) = @_;
     my %scantron_config=&get_scantron_config($ENV{'form.scantron_format'});
@@ -3753,10 +3779,6 @@ sub scantron_getfile {
     my $lines;
     $lines=&Apache::lonnet::getfile('/uploaded/'.$cdom.'/'.$cname.'/'.
 		       'scantron_orig_'.$ENV{'form.scantron_selectfile'});
-    if ($lines eq '-1') {
-	#FIXME need to actually replicate file to course space
-	#FIXME when replicating strip CRLF to LF or CR to LF
-    }
     my %scanlines;
     $scanlines{'orig'}=[(split("\n",$lines,-1))];
     my $temp=$scanlines{'orig'};
@@ -3896,7 +3918,7 @@ sub scantron_get_correction {
 #to show both the current line and the previous one and allow skipping
 #the previous one or the current one
 
-    $r->print("<p>An error was detected ($error) ");
+    $r->print("<p><b>An error was detected ($error)</b>");
     if ( defined($$scan_record{'scantron.PaperID'}) ) {
 	$r->print(" for PaperID <tt>".
 		  $$scan_record{'scantron.PaperID'}."</tt> \n");
@@ -4073,7 +4095,6 @@ SCANTRONFORM
  	($uname,$udom)=('','');
  	$i++;
  	my $line=&scantron_get_line($scanlines,$i);
-#	$r->print('<pre>line is'.$line.'</pre>');
  	if ($line=~/^[\s\cz]*$/) { next; }
  	my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
  						 $scan_data);
@@ -4088,15 +4109,11 @@ SCANTRONFORM
  				'Student '.$uname.' has multiple sheets',2);
  	    next;
  	}
-#	$r->print('<pre>doing studnet'.$uname.'</pre>');
   	($uname,$udom)=split(/:/,$uname);
   	&Apache::lonnet::delenv('form.counter');
   	&Apache::lonnet::appenv(%$scan_record);
-#    &Apache::lonhomework::showhash(%ENV);
-#    $Apache::lonxml::debug=1;
-#	&Apache::lonxml::debug("line is $line");
-  	
-	    my $i=0;
+	
+	my $i=0;
 	foreach my $resource (@resources) {
 	    $i++;
 	    my $result=&Apache::lonnet::ssi($resource->src(),
@@ -4106,23 +4123,6 @@ SCANTRONFORM
 				  'grade_domain'  =>$udom,
 				  'grade_courseid'=>$ENV{'request.course.id'},
 				  'grade_symb'    =>$resource->symb()));
-#	    my %score=&Apache::lonnet::restore($resource->symb(),
-#					       $ENV{'request.course.id'},
-#					       $udom,$uname);
-#	    foreach my $part ($resource->{PARTS}) {
-#		if ($score{'resource.'.$part.'.solved'} =~ /^correct/) {
-#		    $studentcorrect++;
-#		    $totalcorrect++;
-#		} else {
-#		    $studentincorrect++;
-#		    $totalincorrect++;
-#		}
-#	    }
-#	    $r->print('<pre>'.
-#		      $resource->symb().'-'.
-#		      $resource->src().'-'.'</pre>result is'.$result);
-#	    &Apache::lonhomework::showhash(%score);
-	#    if ($i eq 3) {last;}
 	}
 	$completedstudents{$uname}={'line'=>$line};
     } continue {
@@ -4130,32 +4130,11 @@ SCANTRONFORM
 	&Apache::lonnet::delenv('scantron\.');
 	&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
 						 'last student');
-	#last;
-	#FIXME
-	#get iterator for $sequence
-	#foreach question 'submit' the students answer to the server
-	#   through grade target {
-	#   generate data to pass back that includes grade recevied
-	#}
     }
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     my $lasttime = &Time::HiRes::time()-$start;
     $r->print("<p>took $lasttime</p>");
 
-    #$Apache::lonxml::debug=0;
-    foreach my $delay (@delayqueue) {
-	#FIXME
-	#print out each delayed student with interface to select how
-	#  to repair student provided info
-	#Expected errors include
-	#  1 bad/no stuid/username
-	#  2 invalid bubblings
-	
-    }
-    #FIXME
-    # if delay queue exists 2 submits one to process delayed students one
-    #     to ignore delayed students, possibly saving the delay queue for later
-    
     $navmap->untieHashes();
     $r->print("<p>Done</p>");
     $r->print(&show_grading_menu_form($symb,$url));
@@ -4169,6 +4148,7 @@ sub scantron_upload_scantron_data {
 							  'domainid');
     my $domsel=&Apache::loncommon::select_dom_form($ENV{'request.role.domain'},
 						   'domainid');
+    my $default_form_data=&defaultFormData(&get_symb_and_url($r));
     $r->print(<<UPLOAD);
 <script type="text/javascript" language="javascript">
     function checkUpload(formname) {
@@ -4181,6 +4161,7 @@ sub scantron_upload_scantron_data {
 </script>
 
 <form enctype='multipart/form-data' action='/adm/grades' name='rules' method='post'>
+$default_form_data
 Course: <input name='courseid' type='text' />
 Domain: $domsel $select_link
 <br />
@@ -4195,7 +4176,14 @@ UPLOAD
 
 sub scantron_upload_scantron_data_save {
     my($r)=@_;
-    $r->print("Doing upload to ".$ENV{'form.courseid'});
+    if (!&Apache::lonnet::allowed('usc',$ENV{'form.domainid'}) &&
+	!&Apache::lonnet::allowed('usc',
+			    $ENV{'form.domainid'}.'_'.$ENV{'form.courseid'})) {
+	$r->print("You are not allowed to upload Scantron data to the requested course.<br />");
+	$r->print(&show_grading_menu_form(&get_symb_and_url($r)));
+	return '';
+    }
+    $r->print("Doing upload to ".$ENV{'form.courseid'}." <br />");
     my $home=&Apache::lonnet::homeserver($ENV{'form.courseid'},
 					 $ENV{'form.domainid'});
     my $fname=$ENV{'form.upfile.filename'};
@@ -4213,10 +4201,10 @@ sub scantron_upload_scantron_data_save {
     # See if there is anything left
     unless ($fname) { return 'error: no uploaded file'; }
     $fname='scantron_orig_'.$fname;
-    &Apache::lonnet::logthis("fname is $fname");
     $r->print(&Apache::lonnet::finishuserfileupload($ENV{'form.courseid'},
 						    $ENV{'form.domainid'},
 						    $home,'upfile',$fname));
+    $r->print(&show_grading_menu_form(&get_symb_and_url($r)));
     return '';
 }
 
@@ -4405,7 +4393,11 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
     my $url=$ENV{'form.url'};
     my $symb=$ENV{'form.symb'};
-    my $command=$ENV{'form.command'};
+    my @commands=&Apache::loncommon::get_env_multiple('form.command');
+    my $command=$commands[0];
+    if ($#commands > 0) {
+	&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands));
+    }
     if (!$url) {
 	my ($temp1,$temp2);
 	($temp1,$temp2,$ENV{'form.url'})=&Apache::lonnet::decode_symb($symb);
@@ -4499,12 +4491,16 @@ sub handler {
 	} elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
 	    $request->print(&scantron_process_students($request));
  	} elsif ($command eq 'scantronupload' && 
- 		 &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {
- 	    $request->print(&scantron_upload_scantron_data($request));
- 
+ 		 (&Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})||
+		  &Apache::lonnet::allowed('usc',$ENV{'request.course.id'}))) {
+ 	    $request->print(&scantron_upload_scantron_data($request)); 
  	} elsif ($command eq 'scantronupload_save' &&
- 		 &Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})) {
+ 		 (&Apache::lonnet::allowed('usc',$ENV{'request.role.domain'})||
+		  &Apache::lonnet::allowed('usc',$ENV{'request.course.id'}))) {
  	    $request->print(&scantron_upload_scantron_data_save($request));
+ 	} elsif ($command eq 'scantrondownload' &&
+		 &Apache::lonnet::allowed('usc',$ENV{'request.course.id'})) {
+ 	    $request->print(&scantron_download_scantron_data($request));
 	} elsif ($command) {
 	    $request->print("Access Denied ($command)");
 	}