--- loncom/interface/lonwhatsnew.pm	2005/06/04 03:36:36	1.17
+++ loncom/interface/lonwhatsnew.pm	2005/09/21 18:20:22	1.31
@@ -1,5 +1,5 @@
 #
-# $Id: lonwhatsnew.pm,v 1.17 2005/06/04 03:36:36 albertel Exp $
+# $Id: lonwhatsnew.pm,v 1.31 2005/09/21 18:20:22 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -35,8 +35,10 @@ use Apache::lonhtmlcommon();
 use Apache::lonlocal;
 use Apache::loncoursedata();
 use Apache::lonnavmaps();
+use Apache::lonuserstate;
 use Apache::Constants qw(:common :http);
 use Time::Local;
+use GDBM_File;
 
 #----------------------------
 # handler
@@ -177,18 +179,24 @@ sub display_actions_box() {
     }
 
     my %threshold = (
-                      av_attempts => 0,
-                      degdiff => 0.01,
-                      numstudents => 0,
+                      av_attempts => 2,
+                      degdiff => 0.5,
+                      numstudents => 2,
                      );
 
     my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);
     my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);
 
     unless ($env{'request.course.id'}) {
-        $r->print('<br /><b><center>You are accessing an invalid course</center></b><br /><br />');
+        $r->print('<br /><b><center>You are accessing an invalid course.</center></b><br /><br />');
         return;
     }
+    if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
+	    &GDBM_READER(),0640)) {
+	my $furl=$bighash{'first_url'};
+	$r->print('<font size="+1"><a href="'.$furl.'">Go to first resource</a></font><a href="/adm/preferences?action=changecourseinit"></font><br />Change your preferences</a> to suppress display of this screen when accessing courses as Course Coordinator in the future.<br /><hr />');
+	untie(%bighash);
+    }
 
     my $result;
 
@@ -200,6 +208,7 @@ sub display_actions_box() {
     if ($result) {
         $r->print($result.'<hr width="100%" />');
     }
+    $r->rflush();
 
     &get_curr_thresholds(\%threshold,$cdom,$crs);
     &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2,\%threshold,$cdom,$crs,%res_title);
@@ -259,7 +268,7 @@ END
         @bombs = sort { &cmp_title($a,$b,\%res_title) } @bombs;
         foreach my $bomb (@bombs) {
             if ($bombnum %2 == 1) {
-                 $rowColor = $rowColor1;
+		$rowColor = $rowColor1;
             } else {
                 $rowColor = $rowColor2;
             }
@@ -381,7 +390,7 @@ END
             } else {
                 $rowColor = $rowColor2;
             }
-            $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;<small></td><td valign="top"><small><a href="/adm/mail?">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');
+            $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;</small></td><td valign="top"><small><a href="/adm/communicate">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');
             $rowNum ++;
             $mailcount ++;
         }
@@ -413,7 +422,7 @@ END
             } else {
                 $rowColor = $rowColor2;
             }
-            $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;<small></td><td valign="top"><small><a href="/adm/mail?">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');
+            $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;<small></td><td valign="top"><small><a href="/adm/email?folder=critical">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');
             $rowNum ++;
             $mailcount ++;
         }
@@ -499,7 +508,8 @@ sub display_config_box() {
 sub getitems {
     my ($unread,$ungraded,$bombed,$triggered,$newdiscussions,$tograde,$bombs,$warnings,$rowColor1,$rowColor2,$threshold,$cdom,$crs,$res_title) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();
-    my @allres=$navmap->retrieveResources();
+    # force retrieve Resource to seed the part id cache we'll need it later
+    my @allres=$navmap->retrieveResources(undef,sub {if ($_[0]->is_problem) { $_[0]->parts();} return 1;});
     my %discussiontime = &Apache::lonnet::dump('discussiontimes',$cdom,$crs);
     my %lastread = &Apache::lonnet::dump('nohist_'.$env{'request.course.id'}.
                 '_discuss',$env{'user.domain'},$env{'user.name'},'lastread');
@@ -527,7 +537,7 @@ sub getitems {
         $$res_title{$symb} = $title;
         my $ressymb = $resource->wrap_symb();
 # Check for unread discussion postings
-        if (defined($discussiontime{$ressymb})) {
+	if ($resource->hasDiscussion()) {
             push(@discussions,$ressymb);
             my $prevread = 0;
             my $unreadcount = 0;
@@ -556,34 +566,42 @@ sub getitems {
         if ($resource->is_problem()) {
             my $ctr = 0;
             my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-            my ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($url,$symb);
-            foreach my $student (keys(%$classlist)) {
-                my ($uname,$udom) = split(/:/,$student);
-                my %status=&Apache::grades::student_gradeStatus($url,$symb,$udom,$uname,$partlist);
-                my $submitted = 0;
-                my $ungraded = 0;
-                foreach (keys(%status)) {
-                    $submitted = 1 if ($status{$_} ne 'nothing');
-                    $ungraded = 1 if ($status{$_} =~ /^ungraded/);
-                    my ($foo,$partid,$foo1) = split(/\./,$_);
-                    if ($status{'resource.'.$partid.'.submitted_by'} ne '') {
-                        $submitted = 0;
-                    }
-                }
-                next if (!$submitted || !$ungraded);
-                $ctr ++;
-            }
-            if ($ctr) {
-                $$ungraded{$symb}{count} = $ctr;
-                $$ungraded{$symb}{title} = $title;
-                push(@{$tograde}, $symb);
-            }
+	    my $partlist=$resource->parts();
+	    my $handgradeable;
+	    foreach my $part (@$partlist) {
+		if ($resource->handgrade($part) eq 'yes') {
+		    $handgradeable=1; last;
+		}
+	    }
+	    if ($handgradeable) {
+		foreach my $student (keys(%$classlist)) {
+		    my ($uname,$udom) = split(/:/,$student);
+		    my %status=&Apache::grades::student_gradeStatus($url,$symb,$udom,$uname,$partlist);
+		    my $submitted = 0;
+		    my $ungraded = 0;
+		    foreach (keys(%status)) {
+			$submitted = 1 if ($status{$_} ne 'nothing');
+			$ungraded = 1 if ($status{$_} =~ /^ungraded/);
+			my ($foo,$partid,$foo1) = split(/\./,$_);
+			if ($status{'resource.'.$partid.'.submitted_by'} ne '') {
+			    $submitted = 0;
+			}
+		    }
+		    next if (!$submitted || !$ungraded);
+		    $ctr ++;
+		}
+		if ($ctr) {
+		    $$ungraded{$symb}{count} = $ctr;
+		    $$ungraded{$symb}{title} = $title;
+		    push(@{$tograde}, $symb);
+		}
+	    }
         }
 
 # Check for bombs
         if ($resource->getErrors()) {
             my $errors = $resource->getErrors();
-            $errors =~ s/^,//;
+	    $errors =~ s/^,//;
             my @bombs = split(/,/, $errors);
             my $errorcount = scalar(@bombs);
             my $errorlink = '<a href="/adm/email?display='.
@@ -593,13 +611,16 @@ sub getitems {
             $$bombed{$symb}{errorlink} = $errorlink;
             push(@{$bombs}, $symb);
         }
-# Compile maxtries and degree of difficulty for problem parts
+# Compile maxtries and degree of difficulty for problem parts, unless handgradeable
         my @parts = @{$resource->parts()};
         my %stats;
         my %lastreset = ();
         my $warning = 0;
         my $rowColor;
         foreach my $part (@parts) {
+            if ($resource->handgrade($part) eq 'yes') {
+                next;
+            }
             %{$stats{$part}} = ();
             my ($attempts,$users,$corrects,$degdiff,$av_attempts);
             if (exists($resourcetracker{$symb."\0".$part."\0attempts"})) {