--- loncom/homework/grades.pm	2006/05/29 23:45:14	1.356
+++ loncom/homework/grades.pm	2006/06/30 00:30:00	1.367
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.356 2006/05/29 23:45:14 banghart Exp $
+# $Id: grades.pm,v 1.367 2006/06/30 00:30:00 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,10 +36,13 @@ use Apache::lonhtmlcommon;
 use Apache::lonnavmaps;
 use Apache::lonhomework;
 use Apache::loncoursedata;
-use Apache::lonmsg qw(:user_normal_msg);
+use Apache::lonmsg();
 use Apache::Constants qw(:common);
 use Apache::lonlocal;
 use String::Similarity;
+use lib '/home/httpd/lib/perl';
+use LONCAPA;
+
 use POSIX qw(floor);
 
 my %oldessays=();
@@ -1553,7 +1556,7 @@ sub handback_box {
 	    $file_disp = "$name.$ext";
 	    $file = $file_path.$file_disp;
 	    $result.=&mt('Return commented version of [_1] to student.',
-			 '<span class="filename">'.$file_disp.'</span>');
+			 '<span class="LC_filename">'.$file_disp.'</span>');
 	    $result.='<input type="file"   name="'.$prefix.'returndoc'.$file_counter.'" />'."\n";
 	    $result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />';
 	    $file_counter++;
@@ -1747,7 +1750,7 @@ KEYWORDS
 #
             my (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb);
 	    my ($adom,$aname,$apath)=($essayurl=~/^(\w+)\/(\w+)\/(.*)$/);
-	    $apath=&Apache::lonnet::escape($apath);
+	    $apath=&escape($apath);
 	    $apath=~s/\W/\_/gs;
 	    %oldessays=&Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname);
         }
@@ -2104,6 +2107,7 @@ sub processHandGrade {
 	    if ($includemsg =~ /savemsg|newmsg\Q$ctr\E/) {
 		$subject = $env{'form.msgsub'} if ($includemsg =~ /msgsub/);
 		unless ($subject=~/\w/) { $subject=&mt('Grading Feedback'); }
+		$subject.=' ['.&Apache::lonnet::declutter($url).']';
 		my (@msgnum) = split(/,/,$includemsg);
 		foreach (@msgnum) {
 		    $message.=$env{'form.'.$_} if ($_ =~ /savemsg|newmsg/ && $_ ne '');
@@ -2116,8 +2120,8 @@ sub processHandGrade {
 		    "?symb=$symb\">$env{'form.probTitle'}</a>";
 		}
 		$msgstatus = &Apache::lonmsg::user_normal_msg($uname,$udom,
-							      $subject.' ['.
-							      &Apache::lonnet::declutter($url).']',$message);
+							      $subject,
+							      $message);
 		$request->print('<br />'.&mt('Sending message to [_1]@[_2]',$uname,$udom).': '.
 				$msgstatus);
 	    }
@@ -2130,11 +2134,11 @@ sub processHandGrade {
 			    &saveHandGrade($request,$symb,$collaborator,$udom,$ctr,
 					   $env{'form.unamedom'.$ctr},$part);
 			if ($errorflag eq 'not_allowed') {
-			    $request->print("<font color=\"red\">Not allowed to modify grades for $collaborator:$udom</font>");
+			    $request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>");
 			    next;
 			} else {
 			    if ($message ne '') {
-				$msgstatus = &Apache::lonmsg::user_normal_msg($collaborator,$udom,$env{'form.msgsub'},$message);
+				$msgstatus = &Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message);
 			    }
 			}
 		    }
@@ -2326,7 +2330,7 @@ sub saveHandGrade {
 		if (exists($record{'resource.'.$new_part.'.awarded'})) {
 		    $newrecord{'resource.'.$new_part.'.awarded'} = '';
 		}
-	    $newrecord{'resource.'.$new_part.'.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.'.$new_part.'.solved'})) { #don't bother if no old records -> no attempts
@@ -2386,7 +2390,6 @@ sub saveHandGrade {
 	    }
 	    $newrecord{'resource.'.$new_part.'.regrader'}=
 		"$env{'user.name'}:$env{'user.domain'}";
-            &handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord);
 	}
 	# unless problem has been graded, set flag to version the submitted files
 	unless ($record{'resource.'.$new_part.'.solved'} =~ /^correct_/  || 
@@ -2401,8 +2404,13 @@ sub saveHandGrade {
 
     if (%newrecord) {
         if (@version_parts) {
-            my @changed_keys = &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts);
+            my @changed_keys = &version_portfiles(\%record, \@parts_graded, 
+                                $env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts);
 	    @newrecord{@changed_keys} = @record{@changed_keys};
+	    foreach my $new_part (@version_parts) {
+		&handback_files($request,$symb,$stuname,$domain,$newflg,
+				$new_part,\%newrecord);
+	    }
         }
 	&Apache::lonnet::cstore(\%newrecord,$symb,
 				$env{'request.course.id'},$domain,$stuname);
@@ -2427,15 +2435,14 @@ sub saveHandGrade {
 
 sub handback_files {
     my ($request,$symb,$stuname,$domain,$newflg,$new_part,$newrecord) = @_;
-    my $portfolio_root = &Apache::loncommon::propath($domain,
-						 $stuname).
-						'/userfiles/portfolio';
-	my ($partlist,$handgrade,$responseType) = &response_type($symb);
+    my $portfolio_root = &propath($domain,$stuname).'/userfiles/portfolio';
+    my ($partlist,$handgrade,$responseType) = &response_type($symb);
         foreach my $part_resp (sort(keys(%$handgrade))) {
             my ($part_id, $resp_id) = split(/_/,$part_resp);
             if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) {
                 # if multiple files are uploaded names will be 'returndoc2','returndoc3'
                 my $file_counter = 1;
+		my $file_msg;
                 while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) {
                     my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'};
                     my ($directory,$answer_file) = 
@@ -2445,9 +2452,6 @@ sub handback_files {
 		    my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/);
 		    my @dir_list = &Apache::lonnet::dirlist($portfolio_path,$domain,$stuname,$portfolio_root);
 		    my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
-		    my $new_answer = &version_selected_portfile($domain, $stuname, $portfolio_path, $answer_file, $version);
-                    $$newrecord{"resource.$new_part.$resp_id.handback"} = $new_answer;
-                    $version++;
                     # fix file name
                     my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/);
                     my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain,
@@ -2457,19 +2461,31 @@ sub handback_files {
                         $request->print('<font color="red"> An errror occured ('.$result.
                         ') while trying to upload '.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'</font><br />');
                     } else {
-                        my $subject = "File Handed Back by Instructor ";
-                        my $message = "A file has been returned that was originally submitted in reponse to: ";
-                        $message .= &Apache::lonnet::gettitle($symb);
-                        $message .= " The returned file is named ".$save_file_name;
-                        $message .= " and can be found in your portfolio space.";
-                        &Apache::lonnet::logthis($message);
-                        my $msgstatus = &Apache::lonmsg::user_normal_msg($stuname,$domain,
-				        $subject.' [File Returned]',$message);                    
+                        # mark the file as read only
+                        my @files = ($save_file_name);
+                        my @what = ($symb,'handback');
+                        &Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what);
+			if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) {
+			    $$newrecord{"resource.$new_part.$resp_id.handback"}.=',';
+			}
+                        $$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name;
+			$file_msg.= "\n".'<br /><span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span><br />";
+
                     }
                     $request->print("<br />".$fname." will be the uploaded file name");
                     $request->print(" ".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter});
                     $file_counter++;
                 }
+		my $subject = "File Handed Back by Instructor ";
+		my $message = "A file has been returned that was originally submitted in reponse to: <br />";
+		$message .= "<strong>".&Apache::lonnet::gettitle($symb)."</strong><br />";
+		$message .= ' The returned file(s) are named: '. $file_msg;
+		$message .= " and can be found in your portfolio space.";
+		my $url = (&Apache::lonnet::decode_symb($symb))[2];
+		$url = &Apache::lonnet::declutter($url);
+		my $msgstatus = &Apache::lonmsg::user_normal_msg($stuname,$domain,
+								 $subject.' (File Returned) ['.$url.']',$message);                    
+
             }
         }
     return;
@@ -2555,14 +2571,13 @@ sub version_portfiles {
     my $version_parts = join('|',@$v_flag);
     my @returned_keys;
     my $parts = join('|', @$parts_graded);
-    my $portfolio_root = &Apache::loncommon::propath($domain,
-						 $stu_name).
-						'/userfiles/portfolio';
+    my $portfolio_root = &propath($domain,$stu_name).
+	'/userfiles/portfolio';
     foreach my $key (keys(%$record)) {
         my $new_portfiles;
         if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) {
             my @versioned_portfiles;
-            my @portfiles = split(/,/,$$record{$key});
+            my @portfiles = split(/\s*,\s*/,$$record{$key});
             foreach my $file (@portfiles) {
                 &Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file);
                 my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);
@@ -2574,7 +2589,7 @@ sub version_portfiles {
                 if ($new_answer ne 'problem getting file') {
                     push(@versioned_portfiles, $directory.$new_answer);
                     &Apache::lonnet::mark_as_readonly($domain,$stu_name,
-                        ['/portfolio'.$directory.$new_answer],
+                        [$directory.$new_answer],
                         [$symb,$env{'request.course.id'},'graded']);
                 }
             }
@@ -4228,7 +4243,7 @@ sub scantron_filenames {
     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::loncommon::propath($cdom,$cname));
+				    &propath($cdom,$cname));
     my @possiblenames;
     foreach my $filename (sort(@files)) {
 	($filename)=split(/&/,$filename);
@@ -5102,7 +5117,7 @@ sub scantron_validate_sequence {
 	my @resources=
 	    $navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0);
 	if (@resources) {
-	    $r->print("<p>".&mt('Some resource in the sequece currently are not set to exam mode. Grading these resources currently may not work correctly.')."</p>");
+	    $r->print("<p>".&mt('Some resources in the sequence currently are not set to exam mode. Grading these resources currently may not work correctly.')."</p>");
 	    return (1,$currentphase);
 	}
     }
@@ -5256,11 +5271,11 @@ function change_radio(field) {
 </script>
 ENDSCRIPT
 	my $href="/adm/pickcode?".
-	   "form=".&Apache::lonnet::escape("scantronupload").
-	   "&scantron_format=".&Apache::lonnet::escape($env{'form.scantron_format'}).
-	   "&scantron_CODElist=".&Apache::lonnet::escape($env{'form.scantron_CODElist'}).
-	   "&curCODE=".&Apache::lonnet::escape($$scan_record{'scantron.CODE'}).
-	   "&scantron_selectfile=".&Apache::lonnet::escape($env{'form.scantron_selectfile'});
+	   "form=".&escape("scantronupload").
+	   "&scantron_format=".&escape($env{'form.scantron_format'}).
+	   "&scantron_CODElist=".&escape($env{'form.scantron_CODElist'}).
+	   "&curCODE=".&escape($$scan_record{'scantron.CODE'}).
+	   "&scantron_selectfile=".&escape($env{'form.scantron_selectfile'});
 	if ($env{'form.scantron_CODElist'} =~ /\S/) { 
 	    $r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_found' /> <a target='_blank' href='$href'>Select</a> a CODE from the list of all CODEs and use it.</label> Selected CODE is <input readonly='true' type='text' size='8' name='scantron_CODE_selectedvalue' onfocus=\"javascript:change_radio('use_found')\" onchange=\"javascript:change_radio('use_found')\" />");
 	    $r->print("\n<br />");