--- loncom/homework/bridgetask.pm	2010/08/23 03:24:01	1.252
+++ loncom/homework/bridgetask.pm	2010/11/01 16:32:32	1.256
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.252 2010/08/23 03:24:01 raeburn Exp $
+# $Id: bridgetask.pm,v 1.256 2010/11/01 16:32:32 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,6 +37,7 @@ use Apache::lonmenu;
 use Apache::lonlocal;
 use Apache::lonxml;
 use Apache::slotrequest();
+use Apache::structuretags();
 use Time::HiRes qw( gettimeofday tv_interval );
 use LONCAPA;
  
@@ -380,6 +381,7 @@ sub show_task {
 		       ( $status eq 'BANNED') ||
 		       ( $status eq 'UNAVAILABLE') ||
 		       ( $status eq 'NOT_IN_A_SLOT') ||
+                       ( $status eq 'NOT_YET_VIEWED') ||
 		       ( $status eq 'NEEDS_CHECKIN') ||
 		       ( $status eq 'WAITING_FOR_GRADE') ||
 		       ( $status eq 'INVALID_ACCESS') ||
@@ -545,23 +547,35 @@ sub done_screen {
     my $title=&Apache::lonnet::gettitle($env{'request.uri'});
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
     my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();
-    my $files = '<ul>';
-    my $msg;
-    foreach my $file (@files) {
-	my $url="/uploaded/$domain/$user/portfolio$file";
-	if (! &Apache::lonnet::stat_file($url)) {
-	    $file = '<span class="LC_error">'
-                   .&mt('[_1]Nonexistent file:[_2]'
-                       ,'<span class="LC_error"> '
-                       ,'</span> <span class="LC_filename">'.$file.'</span>');
-	    $msg .= "<p>".&mt('Submitted non-existent file [_1]',$file)."</p>\n";
-	} else {
-	    $file = '<span class="LC_filename">'.$file.'</span>';
-	    $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n";
-	}
-	$files .= '<li>'.$file.'</li>';
+    my ($msg,$files,$shown);
+    if (@files > 0) {
+        $files = '<ul>';
+        foreach my $file (@files) {
+	    my $url="/uploaded/$domain/$user/portfolio$file";
+	    if (! &Apache::lonnet::stat_file($url)) {
+	        $file = '<span class="LC_error">'
+                       .&mt('[_1]Nonexistent file:[_2]'
+                           ,'<span class="LC_error"> '
+                           ,'</span> <span class="LC_filename">'.$file.'</span>');
+	        $msg .= "<p>".&mt('Submitted non-existent file [_1]',$file)."</p>\n";
+	    } else {
+	        $file = '<span class="LC_filename">'.$file.'</span>';
+	        $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n";
+	    }
+	    $files .= '<li>'.$file.'</li>';
+        }
+        $files.='</ul>';
+        $shown = '<p>'.&mt('Files submitted: [_1]',$files).'</p>'
+                .'<p>'.&mt('You are now done with this Bridge Task').'</p>'
+                .'<hr />'
+                .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>'
+                .'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>';
+    } else {
+        $msg = &mt("Submission status: no files currently submitted, when 'Done' was indicated.");
+        $shown = '<p class="LC_error">'.
+                 &mt('You did not submit any files.  Please try again.').'</span>'.
+                 '</p><p><a href="javascript:history.go(-1);">'.&mt('Back to Bridge Task').'</a></p><hr />';
     }
-    $files.='</ul>';
     my $subject = &mt('Submission message for [_1]',$title);
     my ($message_status,$comment_status);
     my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};
@@ -581,15 +595,11 @@ sub done_screen {
 	$comment_status = '<p>'.&mt('Message sent to instructor: [_1]',
 				    $comment_status).' </p>';
     }
+ 
     return "<h2>$title</h2>"
-          .'<p>'.&mt('Files submitted: [_1]',$files).'</p>'
-          .'<p>'.&mt('You are now done with this Bridge Task').'</p>'
-          .'<hr />'
-          .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>'
-.'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>'
-.$message_status
-.$comment_status;
-
+          .$shown
+          .$message_status
+          .$comment_status;
 }
 
 sub start_Task {
@@ -619,6 +629,14 @@ sub start_Task {
 	    &Apache::structuretags::page_start($target,$token,$tagstack,
 					       $parstack,$parser,$safeeval,
 					       $name,&style($target));
+
+    }
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+        $target eq 'tex') {
+        if ($env{'form.markaccess'}) {
+            my @interval=&Apache::lonnet::EXT("resource.0.interval");
+            &Apache::lonnet::set_first_access($interval[1]);
+        }
     }
 
     if ($target eq 'web' && $env{'request.state'} ne 'construct') {
@@ -661,8 +679,8 @@ sub start_Task {
 	my ($version,$previous)=&get_version();
 	($status,$accessmsg,my $slot_name,$slot) = 
 	    &Apache::lonhomework::check_slot_access('0','Task');
-	if ($status eq 'CAN_ANSWER' && $version eq '') {
-	    # CAN_ANSWER mode, and no current version, unproctored access
+	if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) {
+	    # CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access
 	    # thus self-checkedin
 	    my $check = &check_in('Task',undef,undef,$slot_name);
             if ($check =~ /^error: /) {
@@ -706,7 +724,10 @@ sub start_Task {
 		    $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>';
 		} elsif ($env{'form.donescreen'}) {
 		    $result .= &done_screen($version);
-		} elsif ($status ne 'NOT_YET_VIEWED') {
+		} elsif ($status eq 'NOT_YET_VIEWED') {
+                    my $symb=&Apache::lonnet::symbread();
+                    $msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb);
+		} else {
 		    $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
 		}
 		if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
@@ -784,6 +805,11 @@ sub start_Task {
 		    $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;
 		} elsif ($status_code eq 'cancel') {
 		    $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;
+                } elsif ($status_code eq 'terminated') {
+                    $result.= '<b>'.&mt('Terminated grading').'</b><br />'.
+                              '<span class="LC_error">'.
+                              &mt('Grading for [_1] has not been saved because of a grading key mismatch.',
+                              '<tt>'.$env{'form.terminated'}.'</tt>').'</span><br />'.$back;
 		} elsif ($status_code eq 'never_versioned') {
 		    $result.='<b>'.
 			&mt("Requested user has never accessed the task.").
@@ -1004,6 +1030,8 @@ sub get_key_todo {
 		    return (undef,'stop');
 		} elsif ($env{'form.cancel'}) {
 		    return (undef,'cancel');
+                } elsif ($env{'form.terminated'}) {
+                    return (undef, 'terminated');
 		} elsif ($env{'form.next'}) {
 		    return (undef,'select_user');
 		}
@@ -1049,13 +1077,17 @@ sub get_key_todo {
 
     if ($env{'form.queuemode'} ne 'selected') {
 	# don't get something new from the queue if they hit the stop button
-    	if (!(($env{'form.cancel'} || $env{'form.stop'}) 
+    	if (!(($env{'form.cancel'} || $env{'form.stop'} || $env{'form.terminated'}) 
 	      && $target eq 'webgrade') 
 	    && !$env{'form.gradingaction'}) {
 	    &Apache::lonxml::debug("Getting anew $queue");
 	    return (&get_from_queue($queue));
 	} else {
-	    return (undef,'stop');
+            if ($env{'form.terminated'}) {
+                return (undef,'terminated');
+            } else {
+                return (undef,'stop');
+            }
 	}
     }
     return (undef,undef)
@@ -1320,10 +1352,10 @@ DONEBUTTON
 		    $Apache::lonhomework::results{"resource.$version.0.solved"};
 	    }
 	    &minimize_storage();
-            my $canstore;
+            my ($canstore,$domain,$name,$symb,$courseid);
+            ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser();
+
             if ($env{'form.gradingkey'}) {
-                my ($symb,$courseid,$domain,$name) =
-                    &Apache::lonnet::whichuser();
                 my $todo=&unescape($env{'form.gradingkey'});
                 my ($keysymb,$uname,$udom)=&decode_queue_key($todo);
                 if ($symb eq $keysymb) {
@@ -1334,39 +1366,48 @@ DONEBUTTON
             }
             if ($canstore) {
 	        &Apache::structuretags::finalize_storage();
-            } else {
-                $result .= '<br /><div class="LC_error">'.
-                           &mt('Information extracted from the current gradingkey was for a different BT or user from those for which grading data are to be stored.').' '.&mt('No grading changes stored.').'</div><br />';  
-            }
-
-	    # data stored, now handle queue
-	    if ($review) {
-		if ($env{'form.queue'} eq 'reviewqueue') {
-		    &check_queue_unlock($env{'form.queue'});
-		    &Apache::lonxml::debug(" still needs review not changing status.");
-		} else {
-		    if ($env{'form.queue'} ne 'none') {
-			&move_between_queues($env{'form.queue'},'reviewqueue');
+                my @interval = &Apache::lonnet::EXT("resource.0.interval");
+                if ($interval[0] =~ /^\d+$/ && $interval[1] eq 'resource') {
+                    my $key=$courseid."\0".$symb;
+                    my %times=&Apache::lonnet::get('firstaccesstimes',
+                                                   [$key],$domain,$name);
+                    if ($times{$key}) {
+                        my $delresult.=&Apache::lonnet::del('firstaccesstimes',
+                                                            [$key],$domain,$name);
+                    }
+                }
+	        # data stored, now handle queue
+	        if ($review) {
+		    if ($env{'form.queue'} eq 'reviewqueue') {
+		        &check_queue_unlock($env{'form.queue'});
+		        &Apache::lonxml::debug(" still needs review not changing status.");
 		    } else {
-			&add_to_queue('reviewqueue',\%queue_data);
+		        if ($env{'form.queue'} ne 'none') {
+			    &move_between_queues($env{'form.queue'},'reviewqueue');
+		        } else {
+			    &add_to_queue('reviewqueue',\%queue_data);
+		        }
 		    }
-		}
-	    } elsif ($ungraded) {
-		if ($env{'form.queue'} eq 'reviewqueue') {
-		    &Apache::lonxml::debug("moving back.");
-		    &move_between_queues($env{'form.queue'},
-					 'gradingqueue');
-		} elsif ($env{'form.queue'} eq 'none' ) {
-		    &add_to_queue('gradingqueue',\%queue_data);	
-		} else {
-		    &check_queue_unlock($env{'form.queue'});
-		}
-	    } elsif ($mandatory_failed) {
-		&remove_from_queue($env{'form.queue'}); 
-	    } else {
-		&remove_from_queue($env{'form.queue'});
-	    }
-	}
+	        } elsif ($ungraded) {
+		    if ($env{'form.queue'} eq 'reviewqueue') {
+		        &Apache::lonxml::debug("moving back.");
+		        &move_between_queues($env{'form.queue'},
+					     'gradingqueue');
+		    } elsif ($env{'form.queue'} eq 'none' ) {
+		        &add_to_queue('gradingqueue',\%queue_data);	
+		    } else {
+		        &check_queue_unlock($env{'form.queue'});
+		    }
+	        } elsif ($mandatory_failed) {
+		    &remove_from_queue($env{'form.queue'}); 
+	        } else {
+		    &remove_from_queue($env{'form.queue'});
+	        }
+            } else {
+                &check_queue_unlock($env{'form.queue'});
+                $env{'form.terminated'} = $name.':'.$domain;
+            }
+        }
 	if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {
 	    # instance generation occurred and hasn't yet been stored
 	    &Apache::structuretags::finalize_storage();