--- loncom/homework/grades.pm	2005/04/07 07:03:23	1.258
+++ loncom/homework/grades.pm	2005/05/26 21:15:04	1.267
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.258 2005/04/07 07:03:23 albertel Exp $
+# $Id: grades.pm,v 1.267 2005/05/26 21:15:04 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -626,24 +626,24 @@ LISTJAVASCRIPT
     my $checklastsub = $checkhdgrade eq '' ? 'checked' : '';
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'.
 	"\n".$table.
-	'&nbsp;<b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n".
-	'<input type="radio" name="vProb" value="yes" /> one student '."\n".
-	'<input type="radio" name="vProb" value="all" /> all students <br />'."\n".
-	'&nbsp;<b>View Answer: </b><input type="radio" name="vAns" value="no"  /> no '."\n".
-	'<input type="radio" name="vAns" value="yes" /> one student '."\n".
-	'<input type="radio" name="vAns" value="all" checked="on" /> all students <br />'."\n".
+	'&nbsp;<b>View Problem Text: </b><label><input type="radio" name="vProb" value="no" checked="on" /> no </label>'."\n".
+	'<label><input type="radio" name="vProb" value="yes" /> one student </label>'."\n".
+	'<label><input type="radio" name="vProb" value="all" /> all students </label><br />'."\n".
+	'&nbsp;<b>View Answer: </b><label><input type="radio" name="vAns" value="no"  /> no </label>'."\n".
+	'<label><input type="radio" name="vAns" value="yes" /> one student </label>'."\n".
+	'<label><input type="radio" name="vAns" value="all" checked="on" /> all students </label><br />'."\n".
 	'&nbsp;<b>Submissions: </b>'."\n";
     if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) {
-	$gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n";
+	$gradeTable.='<label><input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only </label>'."\n";
     }
 
     my $saveStatus = $env{'form.Status'} eq '' ? 'Active' : $env{'form.Status'};
     $env{'form.Status'} = $saveStatus;
 
-    $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only'."\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="all" /> all details'."\n".
+    $gradeTable.='<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only </label>'."\n".
+	'<label><input type="radio" name="lastSub" value="last" /> last submission & parts info </label>'."\n".
+	'<label><input type="radio" name="lastSub" value="datesub" /> by dates and submissions </label>'."\n".
+	'<label><input type="radio" name="lastSub" value="all" /> all details</label>'."\n".
 	'<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
 	'<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".
 	'<input type="hidden" name="handgrade"   value="'.$env{'form.handgrade'}.'" /><br />'."\n".
@@ -671,7 +671,7 @@ LISTJAVASCRIPT
 	'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".
 	'value="Next->" /> <br />'."\n";
     $gradeTable.=&check_buttons();
-    $gradeTable.='<input type="checkbox" name="checkPlag" checked="on">Check For Plagiarism</input>';
+    $gradeTable.='<label><input type="checkbox" name="checkPlag" checked="on" />Check For Plagiarism</label>';
     my ($classlist, undef, $fullname) = &getclasslist($getsec,'1');
     $gradeTable.='<table border="0"><tr><td bgcolor="#777777">'.
 	'<table border="0"><tr bgcolor="#e6ffff">';
@@ -2109,6 +2109,7 @@ sub processHandGrade {
 #---- Save the score and award for each student, if changed
 sub saveHandGrade {
     my ($request,$url,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_;
+    my @v_flag;
     my $usec = &Apache::lonnet::getsection($domain,$stuname,
 					   $env{'request.course.id'});
     if (!&canmodify($usec)) { return('not_allowed'); }
@@ -2116,45 +2117,45 @@ sub saveHandGrade {
     my @parts_graded;
     my %newrecord  = ();
     my ($pts,$wgt) = ('','');
-    foreach (split(/:/,$env{'form.partlist'.$newflg})) {
+    foreach my $new_part (split(/:/,$env{'form.partlist'.$newflg})) {
 	#collaborator may vary for different parts
-	if ($submitter && $_ ne $part) { next; }
-	my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$_};
+	if ($submitter && $new_part ne $part) { next; }
+	my $dropMenu = $env{'form.GD_SEL'.$newflg.'_'.$new_part};
 	if ($dropMenu eq 'excused') {
-	    if ($record{'resource.'.$_.'.solved'} ne 'excused') {
-		$newrecord{'resource.'.$_.'.solved'} = 'excused';
-		if (exists($record{'resource.'.$_.'.awarded'})) {
-		    $newrecord{'resource.'.$_.'.awarded'} = '';
+	    if ($record{'resource.'.$new_part.'.solved'} ne 'excused') {
+		$newrecord{'resource.'.$new_part.'.solved'} = 'excused';
+		if (exists($record{'resource.'.$new_part.'.awarded'})) {
+		    $newrecord{'resource.'.$new_part.'.awarded'} = '';
 		}
-	    $newrecord{'resource.'.$_.'.regrader'}="$env{'user.name'}:$env{'user.domain'}";
+	    $newrecord{'resource.'.$new_part.'.regrader'}="$env{'user.name'}:$env{'user.domain'}";
 	    }
 	} elsif ($dropMenu eq 'reset status'
-		 && exists($record{'resource.'.$_.'.solved'})) { #don't bother if no old records -> no attempts
+		 && exists($record{'resource.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts
 	    foreach my $key (keys (%record)) {
-		if ($key=~/^resource\.\Q$_\E\./) { $newrecord{$key} = ''; }
+		if ($key=~/^resource\.\Q$new_part\E\./) { $newrecord{$key} = ''; }
 	    }
-	    $newrecord{'resource.'.$_.'.regrader'}=
+	    $newrecord{'resource.'.$new_part.'.regrader'}=
 		"$env{'user.name'}:$env{'user.domain'}";
 	} elsif ($dropMenu eq '') {
-	    $pts = ($env{'form.GD_BOX'.$newflg.'_'.$_} ne '' ? 
-		    $env{'form.GD_BOX'.$newflg.'_'.$_} : 
-		    $env{'form.RADVAL'.$newflg.'_'.$_});
-	    if ($pts eq '' && $env{'form.GD_SEL'.$newflg.'_'.$_} eq '') {
+	    $pts = ($env{'form.GD_BOX'.$newflg.'_'.$new_part} ne '' ? 
+		    $env{'form.GD_BOX'.$newflg.'_'.$new_part} : 
+		    $env{'form.RADVAL'.$newflg.'_'.$new_part});
+	    if ($pts eq '' && $env{'form.GD_SEL'.$newflg.'_'.$new_part} eq '') {
 		next;
 	    }
-	    $wgt = $env{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : 
-		$env{'form.WGT'.$newflg.'_'.$_};
+	    $wgt = $env{'form.WGT'.$newflg.'_'.$new_part} eq '' ? 1 : 
+		$env{'form.WGT'.$newflg.'_'.$new_part};
 	    my $partial= $pts/$wgt;
-	    if ($partial eq $record{'resource.'.$_.'.awarded'}) {
+	    if ($partial eq $record{'resource.'.$new_part.'.awarded'}) {
 		#do not update score for part if not changed.
 		next;
 	    } else {
-	        push @parts_graded, $_;
+	        push @parts_graded, $new_part;
 	    }
-	    if ($record{'resource.'.$_.'.awarded'} ne $partial) {
-		$newrecord{'resource.'.$_.'.awarded'}  = $partial;
+	    if ($record{'resource.'.$new_part.'.awarded'} ne $partial) {
+		$newrecord{'resource.'.$new_part.'.awarded'}  = $partial;
 	    }
-	    my $reckey = 'resource.'.$_.'.solved';
+	    my $reckey = 'resource.'.$new_part.'.solved';
 	    if ($partial == 0) {
 		if ($record{$reckey} ne 'incorrect_by_override') {
 		    $newrecord{$reckey} = 'incorrect_by_override';
@@ -2165,15 +2166,21 @@ sub saveHandGrade {
 		}
 	    }	    
 	    if ($submitter && 
-		($record{'resource.'.$_.'.submitted_by'} ne $submitter)) {
-		$newrecord{'resource.'.$_.'.submitted_by'} = $submitter;
+		($record{'resource.'.$new_part.'.submitted_by'} ne $submitter)) {
+		$newrecord{'resource.'.$new_part.'.submitted_by'} = $submitter;
 	    }
-	    $newrecord{'resource.'.$_.'.regrader'}=
+	    $newrecord{'resource.'.$new_part.'.regrader'}=
 		"$env{'user.name'}:$env{'user.domain'}";
 	}
+	# unless problem has been graded, set flag to version the submitted files
+	unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/  || $record{'resource.'.$new_part.'.solved'} eq 'incorrect_by_override') {
+	    push (@v_flag,$new_part);
+	}
     }
     if (scalar(keys(%newrecord)) > 0) {
-        &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname);
+        if (scalar(@v_flag)) {
+            &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@v_flag);
+        }
 	&Apache::lonnet::cstore(\%newrecord,$symb,
 				$env{'request.course.id'},$domain,$stuname);
     }
@@ -2182,15 +2189,20 @@ sub saveHandGrade {
 
 # ----------- Handles creating versions for portfolio files as answers
 sub version_portfiles {
-    my ($record, $parts_graded, $courseid, $symb, $domain, $stuname) = @_;
+    my ($record, $parts_graded, $courseid, $symb, $domain, $stuname, $v_flag) = @_;
+    my $version_parts = join('|',@$v_flag);
     my $parts = join('|', @$parts_graded);
     my $portfolio_root = &Apache::loncommon::propath($domain,
 						 $stuname).
 						'/userfiles/portfolio';
     foreach my $key(keys %$record) {
-        if ($key =~ /^resource\.($parts)\./ && $key =~ /\.portfiles$/) {
+        my $new_portfiles;
+        if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) {
+            my @v_portfiles;
             my @portfiles = split(/,/,$$record{$key});
+            # &Apache::lonnet::logthis("should be unmarking and remarking");
             foreach my $file (@portfiles) {
+                &Apache::lonnet::unmark_as_readonly($domain,$stuname,[$symb,$env{'request.course.id'}],$file);
                 my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*$)/);
                 my $version = 0;
                 my @answer_file_parts = split(/\./, $answer_file);
@@ -2212,20 +2224,22 @@ sub version_portfiles {
                 }
                 $version++;
                 my $home_server = &Apache::lonnet::homeserver($stuname,$domain,undef);
-                $env{'form.copy'} = &Apache::lonnet::getfile("/uploaded/$domain/$stuname/$directory$answer_file");
-                # $env{'form.copy.filename'}='';
-                my $copy_result = &Apache::lonnet::finishuserfileupload($stuname,$domain,$home_server,'copy',
+                $env{'form.copy'} = &Apache::lonnet::getfile("/uploaded/$domain/$stuname/portfolio$directory$answer_file");
+                if($env{'form.copy'} eq '-1') {
+                    &Apache::lonnet::logthis('problem getting file '.$directory.$answer_file);
+                } else {
+                   my $copy_result = &Apache::lonnet::finishuserfileupload($stuname,$domain,$home_server,'copy',
                                     '/portfolio'.$directory.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
-                &Apache::lonnet::logthis('copy result is '.$copy_result);
-                &Apache::lonnet::logthis('answer file is '.$answer_file.
-                        ' becomes '.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
-                &Apache::lonnet::logthis('from dir list is '.$file_names[0].' has '.@file_name_parts.' parts');
+                    push(@v_portfiles, $answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
+                    &Apache::lonnet::mark_as_readonly($domain,$stuname,
+                                ['/portfolio'.$directory.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]],
+                                [$symb,$env{'request.course.id'},'graded']);
+                }
             }
-            &Apache::lonnet::logthis('found key portfiles '.$key);
-            &Apache::lonnet::logthis('found value portfiles '.$$record{$key});
+            $$record{$key} = join(',',@v_portfiles);
         }
     } 
-    
+    return 'ok';   
     
 }
 
@@ -2294,6 +2308,7 @@ sub viewgrades_js {
     function writeRadText(partid,weight) {
 	var selval   = document.classgrade["SELVAL_"+partid];
 	var radioButton = document.classgrade["RADVAL_"+partid];
+        var override = document.classgrade["FORCE_"+partid].checked;
 	var textbox = document.classgrade["TEXTVAL_"+partid];
 	if (selval[1].selected || selval[2].selected) {
 	    for (var i=0; i<radioButton.length; i++) {
@@ -2307,7 +2322,7 @@ sub viewgrades_js {
 		var scorename = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 		var saveval   = document.classgrade["GD_"+user+"_"+partid+"_solved_s"].value;
 		var selname   = document.classgrade["GD_"+user+"_"+partid+"_solved"];
-		if (saveval != "correct") {
+		if ((saveval != "correct") || override) {
 		    scorename.value = "";
 		    if (selval[1].selected) {
 			selname[1].selected = true;
@@ -2324,7 +2339,7 @@ sub viewgrades_js {
 		var scorename = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 		var saveval   = document.classgrade["GD_"+user+"_"+partid+"_solved_s"].value;
 		var selname   = document.classgrade["GD_"+user+"_"+partid+"_solved"];
-		if (saveval != "correct") {
+		if ((saveval != "correct") || override) {
 		    scorename.value = document.classgrade["GD_"+user+"_"+partid+"_awarded_s"].value;
 		    selname[0].selected = true;
 		}
@@ -2478,7 +2493,8 @@ sub viewgrades {
 		$weight{$partid}.')"> '.
 	    '<option selected="on"> </option>'.
 	    '<option>excused</option>'.
-	    '<option>reset status</option></select></td></tr>'."\n";
+	    '<option>reset status</option></select></td>'.
+            '<td><label><input type="checkbox" name="FORCE_'.$partid.'" /> Override "Correct"</label></td></tr>'."\n";
 	$ctsparts++;
     }
     $result.='</table>'.'</td></tr></table>'.'</td></tr></table>'."\n".
@@ -3771,7 +3787,7 @@ sub scantron_selectphase {
           </tr>
           <tr bgcolor="#ffffe6">
             <td colspan="2">
-              <input type="submit" value="Validate Scantron Records" />
+              <input type="submit" value="Grading: Validate Scantron Records" />
             </td>
           </tr>
         </table>
@@ -4226,10 +4242,10 @@ sub scantron_do_warning {
 	    $r->print('<p><font color="red">You have not selected a the format of the student\'s response data.</font></p>');
 	} 
     } else {
-	my $warning=&scantron_warning_screen('Validate Records');
+	my $warning=&scantron_warning_screen('Grading: Validate Records');
 	$r->print(<<STUFF);
 $warning
-<input type="submit" name="submit" value="Validate Records" />
+<input type="submit" name="submit" value="Grading: Validate Records" />
 <input type="hidden" name="command" value="scantron_validate" />
 STUFF
     }