[LON-CAPA-cvs] cvs: loncom /auth lonroles.pm /interface lonpreferences.pm lonwhatsnew.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Mon, 19 Dec 2005 21:39:37 -0000


This is a MIME encoded message

--raeburn1135028377
Content-Type: text/plain

raeburn		Mon Dec 19 16:39:37 2005 EDT

  Modified files:              
    /loncom/auth	lonroles.pm 
    /loncom/interface	lonpreferences.pm lonwhatsnew.pm 
  Log:
  Display of whatsnew page on entering a course can be set for specific courses (override user prefs).  Can suppress count of unread posts per resource. Link to first resource at top of page not shown if NEW button used to get to whatsnew. What's new no longer restricted to CC role - accessible to adavnced roles in a course.
  
  
--raeburn1135028377
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20051219163937.txt"

Index: loncom/auth/lonroles.pm
diff -u loncom/auth/lonroles.pm:1.138 loncom/auth/lonroles.pm:1.139
--- loncom/auth/lonroles.pm:1.138	Thu Dec 15 18:31:22 2005
+++ loncom/auth/lonroles.pm	Mon Dec 19 16:39:33 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # User Roles Screen
 #
-# $Id: lonroles.pm,v 1.138 2005/12/15 23:31:22 raeburn Exp $
+# $Id: lonroles.pm,v 1.139 2005/12/19 21:39:33 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -51,7 +51,7 @@
     my $navwindow;
     if ($launch_nav eq 'on') {
 	$navwindow.=&Apache::lonnavmaps::launch_win('now',undef,undef,
-						    ($url eq '/adm/whatsnew'));
+						  ($url =~ m-/^adm/whatsnew-));
     } else {
 	$navwindow.=&Apache::lonnavmaps::close();
     }
@@ -271,13 +271,17 @@
 							  '.course.helper.not.run'}) {
 				$furl = "/adm/helper/course.initialization.helper";
 				# Send the user to the course they selected
-			    } elsif (($env{'request.course.fn'}) 
-				     && ($role eq 'cc' && ($env{'environment.course_init_display'} ne 'firstres')))  {
-				$msg = &mt('Entering course ....');
-				&redirect_user($r,&mt('New in course'),
-					       '/adm/whatsnew',$msg,
-					       $env{'environment.remotenavmap'});
-				return OK;
+			    } elsif ($env{'request.course.fn'}) {
+                                if ($env{'user.adv'}) {
+                                    my $startpage = &courseloadpage($courseid);
+                                    unless ($startpage eq 'firstres') {         
+				        $msg = &mt('Entering course ....');
+				        &redirect_user($r,&mt('New in course'),
+					     '/adm/whatsnew?refpage=start',$msg,
+					     $env{'environment.remotenavmap'});
+				        return OK;
+                                    }
+                                }
 			    }
 			    &redirect_user($r,&mt('Entering Course'),
                                            $furl,$msg,
@@ -1025,6 +1029,24 @@
     &Apache::lonnet::appenv('request.role.adv'    => $tadv);
 }
 
+sub courseloadpage {
+    my ($courseid) = @_;
+    my $startpage;
+    my %entry_settings =
+              &Apache::lonnet::dump('nohist_whatsnew',$env{'user.domain'},
+                                    $env{'user.name'},$courseid.':courseinit');
+    my ($tmp) = %entry_settings;
+    unless ($tmp =~ /^Error/) {
+        $startpage = $entry_settings{$courseid.':courseinit'};
+    }
+    if ($startpage eq '') {
+        if (exists($env{'environment.course_init_display'})) {
+            $startpage = $env{'environment.course_init_display'};
+        }
+    }
+    return $startpage;
+}
+
 1;
 __END__
 
Index: loncom/interface/lonpreferences.pm
diff -u loncom/interface/lonpreferences.pm:1.69 loncom/interface/lonpreferences.pm:1.70
--- loncom/interface/lonpreferences.pm:1.69	Fri Dec  9 18:48:06 2005
+++ loncom/interface/lonpreferences.pm	Mon Dec 19 16:39:37 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.69 2005/12/09 23:48:06 albertel Exp $
+# $Id: lonpreferences.pm,v 1.70 2005/12/19 21:39:37 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -989,17 +989,17 @@
         $firstselect='';
         $whatsnewselect='checked="checked"';
     }
-    my $whatsnew_off=&mt('Display the first resource in the course.');
-    my $whatsnew_on=&mt('Display a summary of items in the course which require action from the course coordinator.');
+    my $whatsnew_off=&mt('Display the [_1] in the course.','<b>first resource</b>');
+    my $whatsnew_on=&mt('Display the "[_1]" page - a summary of items in the course which require attention.',"<b>What's New</b>");
 
-    $r->print('<br /><b>'.&mt('Set the page to be displayed when you select the role of Course Coordinator').':</b>');
+    $r->print('<br /><b>'.&mt('Set the default page to be displayed when you select a course role other than student or TA').':</b><br />'.&mt('The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the "[_1]" page in the course',"<i>What's New</i>").'<br /><br />');
     $r->print(<<ENDLSCREEN);
 <form name="server" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_coursepage" />
 <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />
-<label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label>
+<label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />
 ENDLSCREEN
-    $r->print('<br /><input type="submit" value="'.&mt('Change').'" />
+    $r->print('<br /><br /><input type="submit" value="'.&mt('Change').'" />
 </form>');
 }
 
@@ -1007,22 +1007,25 @@
     my $r = shift;
     my $message='';
     my %lt = &Apache::lonlocal::texthash(
-        'when' => 'Whenever you select the Course Coordinator role from the roles screen',
+        'defs' => 'Default now set',
+        'when' => 'when selecting a course role other than student or TA from the roles screen',
         'ywbt' => 'you will be taken to the start of the course.',
         'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',
         'gtts' => 'Go to the start of the course',
-        'dasp' => 'Display a summary page listing course action items', 
+        'dasp' => "Display the What's New page listing course action items", 
     );
     my $newdisp  = $env{'form.newdisp'};
+    $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';
     if ($newdisp eq 'firstres') {
-        $message .= $lt{'when'}.', '.$lt{'ywbt'}.'<br/>';
+        $message .= $lt{'ywbt'}.'<br/>';
         &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
         &Apache::lonnet::appenv('environment.course_init_display' => $newdisp);
     } else {
-        $message .= $lt{'when'}.', '.$lt{'apwb'}.'<br/>';
+        $message .= $lt{'apwb'}.'<br/>';
         &Apache::lonnet::del('environment',['course_init_display']);
         &Apache::lonnet::delenv('environment\.course_init_display');
     }
+    my $refpage = $env{'form.refpage'};
     if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
         if ($newdisp eq 'firstres') {
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -1031,7 +1034,8 @@
                 &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
             $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>';
         } else {
-            $message .= '<br /><font size="+1"><a href="/adm/whatsnew">'.$lt{'dasp'}.'</a></font>';
+            $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='.
+                        $refpage.'">'.$lt{'dasp'}.'</a></font>';
         }
     }
     $r->print(<<ENDVCSCREEN);
@@ -1059,7 +1063,7 @@
     return OK if $r->header_only;
     #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
-                                            ['action','wysiwyg','returnurl']);
+                                   ['action','wysiwyg','returnurl','refpage']);
     #
     &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb
Index: loncom/interface/lonwhatsnew.pm
diff -u loncom/interface/lonwhatsnew.pm:1.38 loncom/interface/lonwhatsnew.pm:1.39
--- loncom/interface/lonwhatsnew.pm:1.38	Thu Dec 15 08:38:58 2005
+++ loncom/interface/lonwhatsnew.pm	Mon Dec 19 16:39:37 2005
@@ -1,5 +1,5 @@
 #
-# $Id: lonwhatsnew.pm,v 1.38 2005/12/15 13:38:58 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.39 2005/12/19 21:39:37 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -52,15 +52,20 @@
         $r->send_http_header;
         return OK;
     }
-    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['command']);
+    &Apache::loncommon::get_unprocessed_cgi(
+                                   $ENV{'QUERY_STRING'},['command','refpage']);
 
     my $command = $env{'form.command'};
+    my $refpage = $env{'form.refpage'};
 
     &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
-    if (! (($env{'request.course.fn'}) && (&Apache::lonnet::allowed('bre',$env{'request.course.id'})))) {
-        # Not in a course, or not allowed to view action items
-        $env{'user.error.msg'}="/adm/whatsnew:bre:0:0:Cannot display what's new screen";
+    my $crsid = $env{'request.course.id'};
+    $crsid =~ s/_/\//; 
+    if ((!($env{'request.course.id'})) || 
+                             ($env{'request.role'} !~ /\Q$crsid\E$/)) {
+        # Not in a course, or no role in course
+        $env{'user.error.msg'}="/adm/whatsnew::0:0:Cannot display what's new screen";
         return HTTP_NOT_ACCEPTABLE;
     }
 
@@ -82,21 +87,33 @@
               text=>"Display Action Items"});
     if (($command eq 'chgthreshold') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
         &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/whatsnew?command=chgthreshold',
+            ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
               text=>"Change thresholds"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Thresholds'));
     } elsif (($command eq 'chginterval') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
         &Apache::lonhtmlcommon::add_breadcrumb
-            ({href=>'/adm/whatsnew?command=chginterval',
+            ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
               text=>"Change interval"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Intervals'));
+    } elsif (($command eq 'chgdisc') && (&Apache::lonnet::allowed('pch',$env{'request.course.id'}))) {
+        &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
+              text=>"Change discussion display"});
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+            (undef,'Course Action Items','Course_Action_Items_Intervals'));
+    } elsif ($command eq 'courseinit') {
+        &Apache::lonhtmlcommon::add_breadcrumb
+            ({href=>'/adm/whatsnew?command=courseinit&refpage='.$refpage,
+              text=>"Course initialization preference"});
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+            (undef,'Course Action Items','Course_Action_Items_Initialization'));
     } else {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Display'));
     }
-    &display_main_box($r,$command,\%checkallowed);
+    &display_main_box($r,$command,$refpage,\%checkallowed);
     return OK;
 }
 
@@ -107,37 +124,48 @@
 #------------------------------
                                                                                 
 sub display_main_box {
-    my ($r,$command,$checkallowed) = @_;
+    my ($r,$command,$refpage,$checkallowed) = @_;
     my $domain=&Apache::loncommon::determinedomain();
     my $tabbg=&Apache::loncommon::designparm('coordinator.tabbg',$domain);
     $r->print('<table width="100%" border="0" cellpadding="5" cellspacing="0"><tr><td width="100%">');
 
-    my %threshold_titles = (
+    my %threshold_titles = &Apache::lonlocal::texthash (
                          av_attempts => 'Average number of attempts',
                          degdiff => 'Degree of difficulty',
                          numstudents => 'Total number of students with submissions',
     );
 
-    my %interval_titles = (
+    my %interval_titles = &Apache::lonlocal::texthash (
                             -1 => 'since start of course',
                        2592000 => 'since last month',
                         604800 => 'since last week',
                          86400 => 'since yesterday',
     );
 
+    my %initpage = &Apache::lonlocal::texthash (
+                     firstres => 'first resource in the course',
+                     whatsnew => "what's new? page",
+                     userpref => 'your general user preferences',
+                     coursespecific => 'specific setting for this course',
+                   );
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
 
     if (($command eq 'chgthreshold') && 
                (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
-        &display_threshold_config($r,$command,$tabbg,\%threshold_titles,
+        &display_threshold_config($r,$refpage,$tabbg,\%threshold_titles,
                                                                    $cdom,$crs);
     } elsif (($command eq 'chginterval') && 
                (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) {
-        &display_interval_config($r,\%interval_titles);
+        &display_interval_config($r,$refpage,\%interval_titles);
+    } elsif (($command eq 'chgdisc') && 
+               (&Apache::lonnet::allowed('pch',$env{'request.course.id'}))) {
+        &display_discussion_config($r,$refpage);
+    } elsif ($command eq 'courseinit') {
+        &courseinit_config($r,$refpage,\%initpage);
     } else {
-        &display_actions_box($r,$command,\%threshold_titles,\%interval_titles,
-                                                     $cdom,$crs,$checkallowed);
+        &display_actions_box($r,$command,$refpage,\%threshold_titles,
+                        \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
     }
     $r->print(<<END_OF_BLOCK);
   </td>
@@ -155,7 +183,7 @@
 # up the HTML
 #-------------------------------
 
-sub display_header{
+sub display_header {
     my ($command,$checkallowed) = @_;
     my $html=&Apache::lonxml::xmlbegin();
     my $bodytag=&Apache::loncommon::bodytag('Course Action Items');
@@ -171,7 +199,10 @@
 function changeAll(change) {
 END
         foreach my $item (keys(%{$checkallowed})) {
-            $scripttag.='document.visible.display_'.$item.'.value=change'."\n";
+            if ($$checkallowed{$item}) {
+                $scripttag.='document.visible.display_'.$item.'.value=change'.
+                            "\n";
+            }
         }
         $scripttag.='document.visible.submit();
 }
@@ -195,9 +226,9 @@
 #
 #-------------------------------
                                                                                 
-sub display_actions_box() {
-    my ($r,$command,$threshold_titles,$interval_titles,$cdom,$crs,
-                                                           $checkallowed) = @_;
+sub display_actions_box {
+    my ($r,$command,$refpage,$threshold_titles,$interval_titles,$initpage,
+                                                $cdom,$crs,$checkallowed) = @_;
     my $rowColor1 = "#ffffff";
     my $rowColor2 = "#eeeeee";
 
@@ -208,9 +239,7 @@
     my %lt = &Apache::lonlocal::texthash(
                  'yacc' => 'You are accessing an invalid course.',
                  'gtfr' => 'Go to first resource',
-                 'chyp' => 'Change your preferences',
-                 'tsup' => 'to suppress display of this screen when accessing'.
-                           ' this course in the future.',
+                 'pgse' => 'Page set to be displayed after you have selected a role in this course?',
                  'hial' => 'Hide all',
                  'shal' => 'Show all',
     );
@@ -243,11 +272,26 @@
         $function='admin';
     }
 
+    my $result;
+    if ($command eq 'newcourseinit') {
+        $result = &store_courseinit_setting($uname,$udom,$cid,$initpage);
+    }
+
     my %threshold = (
                       av_attempts => 2,
                       degdiff => 0.5,
                       numstudents => 2,
                      );
+    my %pagedesc = &Apache::lonlocal::texthash (
+                     firstres => 'First resource',
+                     whatsnew => "What's New page",
+                     userpref => 'user preference',
+                     coursespecific => 'course only',
+                     default => 'default',
+                   );
+
+    my ($initcontrol,$initdisp) = &curr_courseinit();
+    my $currinit = $pagedesc{$initdisp}.' ('.$pagedesc{$initcontrol}.')';
 
     my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);
     my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);
@@ -257,23 +301,30 @@
         return;
     }
 
-    if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
+    if ($refpage eq 'start') {
+        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.'">'.$lt{'gtfr'}.
-                  '</a></font><a href="/adm/preferences?action=changecourseinit">'.
-                  '</font><br />'.$lt{'chyp'}.'</a> '.$lt{'tsup'}.'<br /><hr />');
-        untie(%bighash);
+            my $furl=$bighash{'first_url'};
+            untie(%bighash);
+            $r->print('<font size="+1"><a href="'.$furl.'">'.$lt{'gtfr'}.
+                  '</a></font><br />');
+        }
     }
-                                                                                        
-    my $result;
+    $r->print($lt{'pgse'}.' '.&mt('Currently: [_1]','<i>'.$currinit.'</i>').
+              '<nobr>&nbsp;&nbsp;'.&mt('[_1] for just [_2]','<b>Change</b>',
+              '<a href="/adm/whatsnew?command=courseinit&refpage='.$refpage.
+              '">this course</a>').' '.&mt('or for all [_1].',
+              '<a href="/adm/preferences?action=changecourseinit&refpage='.
+              $refpage.'">your courses</a>').'</nobr><br /><hr />');
                                                                                         
     if ($command eq 'reset') {
         $result = &process_reset($cdom,$crs);
     } elsif ($command eq 'update') {
-        $result = &process_update($cdom,$crs,$threshold_titles);
+        $result = &process_update($uname,$udom,$threshold_titles);
     } elsif ($command eq 'newinterval') {
         $result = &store_interval_setting($uname,$udom,$cid,$interval_titles);
+    } elsif ($command eq 'newdiscconf') {
+        $result = &store_discussion_setting($uname,$udom,$cid);
     }
 
     my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);
@@ -300,7 +351,10 @@
         $timediff = time;
     } 
     my $starttime = $now - $timediff;
-    my $countunread = 1;
+    my $countunread = $display_settings{$cid.':countunread'};
+    unless (defined($countunread)) {
+        $countunread = 'on';
+    }
 
     my %headings = &Apache::lonlocal::texthash(
                 coursediscussion =>  'Unread course discussion posts',
@@ -312,7 +366,7 @@
     );
 
     if ($$checkallowed{'abovethreshold'}) {
-        &get_curr_thresholds(\%threshold,$cdom,$crs);
+        &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
     }
 
     $headings{'abovethreshold'} = &mt('Problems with av. attempts').' &ge; '.$threshold{'av_attempts'}.' '.&mt('or deg. difficulty').' &ge; '.$threshold{'degdiff'}.'<br /> '.&mt('and total number of students with submissions').' &ge; '.$threshold{'numstudents'};
@@ -356,7 +410,7 @@
         }
     }
 
-    $r->print('</form><br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');
+    $r->print('<input type="hidden" name="refpage" value="'.$refpage.'"></form><br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');
 
     my $displayed = 0;
     my $totalboxes = keys(%{$checkallowed});
@@ -364,9 +418,9 @@
     foreach my $actionitem (@actionorder) {
         if ($$checkallowed{$actionitem}) {
             if ($displayed == $halfway) {
-                $r->print('</td><td width="5%">&nbsp;</td><td align="left" valign="top" width-"50%">');
+                $r->print('</td><td width="5%">&nbsp;</td><td align="left" valign="top" width="50%">');
             }
-            &display_launcher($r,$actionitem,$checkallowed,$tabbg,$rowColor1,$rowColor2,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,$interval,$countunread);
+            &display_launcher($r,$actionitem,$refpage,$checkallowed,$tabbg,$rowColor1,$rowColor2,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,$interval,$countunread);
             $displayed ++; 
         }
     }
@@ -388,19 +442,25 @@
 #-------------------------------
                                                                                 
 sub display_threshold_config {
-    my ($r,$command,$tabbg,$threshold_titles,$cdom,$crs) = @_;
+    my ($r,$refpage,$tabbg,$threshold_titles,$cdom,$crs) = @_;
+    my $uname = $env{'user.name'};
+    my $udom = $env{'user.dom'};
+    my $cid = $env{'request.course.id'};
     my %threshold = ();
     my $rowColor1 = "#ffffff";
     my $rowColor2 = "#eeeeee";
     my $rowColor;
 
     my @thresholditems = ("av_attempts","degdiff","numstudents");
-    my %threshold_titles = (
+    foreach my $item (@thresholditems) {
+        $threshold{$item} = '';
+    }
+    my %threshold_titles = &Apache::lonlocal::texthash(
                          av_attempts => 'Average number of attempts',
                          degdiff => 'Degree of difficulty',
                          numstudents => 'Total number of students with submissions',
                          );
-    &get_curr_thresholds(\%threshold,$cdom,$crs);
+    &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
 
     $r->print('<br /><form name="thresholdform" method="post" action="/adm/whatsnew">
         <table border="0" cellpadding="2" cellspacing="4">
@@ -420,7 +480,7 @@
      </tr>');
     my $rowNum =0;
     foreach my $type (@thresholditems) {
-        my $parameter = 'internal.threshold_'.$type;
+        my $parameter = $env{'request.course.id'}.':threshold_'.$type;
 # onchange is javascript to automatically check the 'Set' button.
         my $onchange = 'onFocus="javascript:window.document.forms'.
               "['thresholdform'].elements['".$parameter."_setparmval']".
@@ -445,6 +505,7 @@
     $r->print('</table></td></tr></table></td></tr></table>
            <br /><input type="submit" name="threshold" value="Make changes" />
                  <input type="hidden" name="command" value="update" />
+                 <input type="hidden" name="refpage" value="'.$refpage.'" />
                </form>');
 }
 
@@ -456,16 +517,18 @@
 #-------------------------------
                                                                                    
 sub display_interval_config {
-    my ($r,$interval_titles) = @_;
-    my $current = &get_curr_interval($env{'user.name'},
-                                $env{'user.domain'},$env{'request.course.id'});
+    my ($r,$refpage,$interval_titles) = @_;
+    my $current = &get_current($env{'user.name'},$env{'user.domain'},
+                                $env{'request.course.id'},'interval');
     $r->print('<br />'.&mt('Choose the time window to use for display of version changes for resources in the course.'));
     unless ($current eq '') {
-        $r->print(' '.&mt('Current value is ').$$interval_titles{$current}.'<br /><br />');
+        $r->print(' '.&mt('Current value is [_1]','<b>'.
+                  $$interval_titles{$current}.'</b>.'));
     }
     $r->print('<br /><br />
 <form method="post" name="intervalswitch" action="/adm/whatsnew">
 <input type="hidden" name="command" value="newinterval" />
+<input type="hidden" name="refpage" value="'.$refpage.'" />
 <select name="interval">
 ');
     foreach my $key (reverse sort ({$a cmp $b} (keys(%{$interval_titles})))) {
@@ -478,14 +541,113 @@
     return;
 }
 
+#----------------------------------------------
+# display_discussion_config
+#
+# Display the discussion display setting screen
+#
+#----------------------------------------------
+                                                                                  
+sub display_discussion_config {
+    my ($r,$refpage) = @_;
+    my $current = &get_current($env{'user.name'},$env{'user.domain'},
+                                $env{'request.course.id'},'countunread');
+    if ($current eq '') {
+        $current = 'on';
+    }
+    my %status = (
+                    on => 'checked="checked"',
+                    off => 'checked="checked"',
+                 );
+    $status{$current} = '';
+    $r->print('<br />'.&mt('Choose whether or not to display a count of the number of new posts for each resource or bulletin board which has unread posts.').'<br />'.&mt('This can increase the time taken to gather data for the [_1] page by a few seconds.',"<i>What's New?</i>").'&nbsp;&nbsp;'.&mt('Currently set to [_1] .'),"<b>$current</b>.");
+    $r->print('<br /><br />
+<form method="post" name="discussionswitch" action="/adm/whatsnew">'.
+&mt('Display of unread post counts?').'&nbsp;
+<input type="hidden" name="command" value="newdiscconf" />
+<input type="hidden" name="refpage" value="'.$refpage.'" />
+<input type ="radio" '.$status{'on'}.' name="countunread" value="on">on
+&nbsp;&nbsp;&nbsp;
+<input type ="radio" '.$status{'off'}.' name="countunread" value="off">off
+');
+    $r->print('<br/><br />
+               <input type="submit" name="display" value="'.
+               &mt('Make changes').'" /></form>');
+    return;
+}
+
+#---------------------------------------------------
+# courseinit_config
+#
+# Set page displayed when course loads after 
+# selecting a role in the course from the roles page. 
+#
+#---------------------------------------------------
+
+sub courseinit_config {
+    my ($r,$refpage,$initpage) = @_;
+    my ($control,$current) = &curr_courseinit();
+    my @chgstate = ('userpref','coursespecific');
+    my @chgentry = ('firstres','whatsnew');
+    my %lt = &Apache::lonlocal::texthash(
+                             'chwp' => 'Choose which page will be displayed when you enter this course after selecting a role.',
+                             'cuva' => 'Current value is determined by',
+                             'anis' => 'and is set to display',
+                             'padc' => 'Page display controlled by',
+                             'chce' => 'Choose course entry',
+                             'moce' => 'Modify course entry',
+    );
+    $r->print(<<"END"); 
+<br />$lt{'chwp'}
+<br />$lt{'cuva'}: <b>
+$$initpage{$control}</b> $lt{'anis'} <b>
+$$initpage{$current}</b>.<br /><br />
+<form method="post" name="courseinitswitch" action="/adm/whatsnew">
+<input type="hidden" name="command" value="newcourseinit" />
+<input type="hidden" name="refpage" value="$refpage" />
+$lt{'padc'}&nbsp;&nbsp;
+END
+    foreach my $choice (@chgstate) {
+        $r->print('<nobr><input type="radio" name="courseinit_control" value="'.
+                   $choice.'"/>'.$$initpage{$choice}.'&nbsp;&nbsp;</nobr>');
+    }
+    $r->print('<br /><br />'.&mt('If').' '.$$initpage{'coursespecific'}.
+              '<br />'.$lt{'chce'}." \n");
+    foreach my $choice (@chgentry) {
+        $r->print('<nobr><input type="radio" name="courseinit_page" value="'.
+                  $choice.'"/>'.$$initpage{$choice}.'&nbsp;&nbsp;</nobr>');
+    }
+    $r->print('<br /><br /><input type="submit" name="display" value="'.
+               $lt{'moce'}.'" /></form>');
+    return;
+}
+
+sub curr_courseinit {
+    my $current = &get_current($env{'user.name'},$env{'user.domain'},
+                                $env{'request.course.id'},'courseinit');
+    my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
+    my $control;
+    if ($current eq '') {
+        $control = 'userpref';
+        if (exists($userenv{'firstres'})) {
+            $current = 'firstres';
+        } else {
+            $current = 'whatsnew';
+        }
+    } else {
+        $control = 'coursespecific';
+    }
+    return ($control,$current);
+}
+
 sub display_launcher {
-    my ($r,$action,$checkallowed,$tabbg,$rowColor1,$rowColor2,$show,
+    my ($r,$action,$refpage,$checkallowed,$tabbg,$rowColor1,$rowColor2,$show,
         $headings,$res_title,$tograde,$ungraded,$bombs,$bombed,$changed,
         $warnings,$triggered,$newdiscussions,$unread,$msgcount,$newmsgs,
                           $critmsgcount,$critmsgs,$interval,$countunread) = @_;
 
     if ($$checkallowed{$action}) {
-        &start_box($r,$tabbg,$show,$headings,$action);
+        &start_box($r,$tabbg,$show,$headings,$action,$refpage);
         if ($$show{$action}) {
             if ($action eq 'handgrading') {    # UNGRADED ITEMS
                 &display_handgrade($r,$tograde,$rowColor1,$rowColor2,
@@ -498,8 +660,8 @@
                                                          $rowColor2,$interval);
 
             } elsif ($action eq 'abovethreshold') { # DEGDIFF/AV. TRIES TRIGGERS
-                &display_abovethreshold($r,$warnings,$triggered,$res_title,
-                                                        $rowColor1,$rowColor2);
+                &display_abovethreshold($r,$refpage,$warnings,$triggered,
+                                             $res_title,$rowColor1,$rowColor2);
             } elsif ($action eq 'coursediscussion') { # UNREAD COURSE DISCUSSION
                 &display_coursediscussion($r,$newdiscussions,$unread,
                                 $countunread,$res_title,$rowColor1,$rowColor2);
@@ -594,7 +756,7 @@
         foreach my $ressymb (@{$newdiscussions}) {
             $$unread{$ressymb}{'lastpost'} = $$discussiontime{$ressymb};
         }
-        if ($countunread) { #Get count of unread postings for each resource 
+        if ($countunread eq 'on') { #Get count of unread postings for each resource 
             my $discussiondata = $navmap->get_discussion_data();
             foreach my $ressymb (@{$newdiscussions}) {
                 &get_discussions($cdom,$crs,$discussiondata,$ressymb,
@@ -640,7 +802,7 @@
                     $deleted = $$discussiondata{$id.':'.$ressymb.':deleted'};
                     $deletedflag = 1;
                 }
-            } else { 
+            } else {
                 unless (($hidden =~/\.$id\./) || ($deleted =~/\.$id\./)) {
                     if ($prevread <$$discussiondata{$id.':'.$ressymb.':timestamp'}) {
                         $unreadcount ++;
@@ -775,38 +937,60 @@
 
 
 sub get_curr_thresholds {
-    my ($threshold,$cdom,$crs) = @_;
-    my %coursesettings = &Apache::lonnet::dump('environment',
-                                     $cdom,$crs,'internal.threshold');
-    if (exists($coursesettings{'internal.threshold_av_attempts'})) {
-        $$threshold{'av_attempts'} = $coursesettings{'internal.threshold_av_attempts'};
+    my ($threshold,$uname,$udom,$cid,$cdom,$crs) = @_;
+    my %thresholdsettings = &Apache::lonnet::dump('nohist_whatsnew',$udom,
+                                                     $uname,$cid.':threshold');
+    my $thresholdcount = 0;
+    my ($tmp) = %thresholdsettings;
+    unless ($tmp =~ /^Error/) {
+        foreach my $item (keys %{$threshold}) { 
+            if (exists($thresholdsettings{$cid.':threshold_'.$item})) {
+                $$threshold{$item} = 
+                             $thresholdsettings{$cid.':threshold_'.$item};
+                $thresholdcount ++;
+            }
+        }
     }
-    if (exists($coursesettings{'internal.threshold_degdiff'})) {
-        $$threshold{'degdiff'} = $coursesettings{'internal.threshold_degdiff'};
+    if ($thresholdcount == 3) {
+        return;
     }
-    if (exists($coursesettings{'internal.threshold_numstudents'})) {
-        $$threshold{'numstudents'} = $coursesettings{'internal.threshold_numstudents'};
+    my %coursesettings = &Apache::lonnet::dump('environment',
+                                              $cdom,$crs,'internal.threshold');
+    my ($temp) = %coursesettings;
+    unless ($temp =~ /^Error/) {  
+        foreach my $item (keys %{$threshold}) {
+            unless (exists($thresholdsettings{$cid.':threshold_'.$item})) {
+                if (exists($coursesettings{'internal.threshold_'.$item})) {
+                    $$threshold{$item} = 
+                             $coursesettings{'internal.threshold_'.$item};
+                }
+            }
+        }
     }
+    return;
 }
 
-sub get_curr_interval {
-    my ($uname,$udom,$cid);
-    my $interval;
-    my %settings = &Apache::lonnet::dump('nohist_whatsnew',$uname,$udom,$cid,':interval');
+sub get_current {
+    my ($uname,$udom,$cid,$caller) = @_;
+    my $currvalue;
+    my %settings = &Apache::lonnet::dump('nohist_whatsnew',$udom,$uname,$cid.
+                                                                ':'.$caller);
     my ($tmp) = %settings;
     if ($tmp =~ /^Error/) {
-        &logthis();
+        &logthis('Error retrieving '.$caller.' setting from nohist_whatsnew for '.
+                                                 $uname.";".$udom.' in '.$cid);
     } else {
-        $interval = $settings{$cid.':interval'};
+        $currvalue = $settings{$cid.':'.$caller};
     }
-    return $interval;
+    return $currvalue;
 }
 
 sub process_reset {
     my ($dom,$crs) = @_;
-    my $result = '<b>Counters reset for following problems (and parts):</b><br />';
+    my $result = '<b>'.&mt('Counters reset for following problems (and parts):').
+                           '</b><br />';
     my @agg_types = ('attempts','users','correct');
-    my %agg_titles = (
+    my %agg_titles = &Apache::lonlocal::texthash (
                      attempts => 'Number of submissions',
                      users => 'Students with submissions',
                      correct => 'Number of correct submissions',
@@ -842,17 +1026,17 @@
 }
 
 sub process_update {
-    my ($dom,$crs,$threshold_titles) = @_;
+    my ($uname,$udom,$threshold_titles) = @_;
     my $setoutput = '<b>Changes to threshold(s) for problem tracking:</b><br />';
     foreach (keys %env) {
         next if ($_!~/^form\.(.+)\_setparmval$/);
         my $name  = $1;
         my $value = $env{'form.'.$name.'_value'};
         if ($name && defined($value)) {
-            my $put_result = &Apache::lonnet::put('environment',
-                                                  {$name=>$value},$dom,$crs);
+            my $put_result = &Apache::lonnet::put('nohist_whatsnew',
+                                                  {$name=>$value},$udom,$uname);
            
-            my ($shortname) = ($name =~ /^internal\.threshold_(.+)$/); 
+            my ($shortname) = ($name =~ /^\Q$env{'request.course.id'}\E:threshold_(.+)$/);
             if ($put_result eq 'ok') {
                 $setoutput.=&mt('Set threshold for [_1] to [_2]',
 				'<b>'.$$threshold_titles{$shortname}.'</b>',
@@ -1033,7 +1217,7 @@
 }
 
 sub display_abovethreshold {
-    my ($r,$warnings,$triggered,$res_title,$rowColor1,$rowColor2) = @_;
+    my ($r,$refpage,$warnings,$triggered,$res_title,$rowColor1,$rowColor2) = @_;
     my %lt = &Apache::lonlocal::texthash(
                  reso => 'Resource',
                  part => 'Part',
@@ -1050,7 +1234,9 @@
     if (@{$warnings} > 0) {
         @{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};
         $r->print('<form name="reset_tracking" method="post" action="/adm/whatsnew">'.
-                '  <input type="hidden" name="command" value="reset" />'."\n");
+                ' <input type="hidden" name="command" value="reset" />'."\n".
+                ' <input type="hidden" name="refpage" value="'.$refpage.'" />'.
+                "\n");
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'reso'}.'</small></b></td><td align="right"><b><small>'.$lt{'part'}.'</small></b></td><td align="right"><b><small>'.$lt{'nust'}.'</small></b></td><td align="right"><b><small>'.$lt{'avat'}.'</small></b></td><td align="right"><b><small>'.$lt{'dedi'}.'</small></b></td><td align="right"><b><small>'.$lt{'lare'}.'</small></b></td><td align="right"><b><small>'.$lt{'reco'}.'</small></b></td></tr>');
         foreach my $res (@{$warnings}) {
             if ($warningnum %2 == 1) {
@@ -1124,7 +1310,7 @@
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'loca'}.
                   '</small></b></td><td><b><small>'.$lt{'type'}.
                   '</small></b>');
-        if ($countunread) {
+        if ($countunread eq 'on') {
             $r->print('<td><b><small>'.$lt{'tmlp'}.'</small></b></td>'.
                       '<td align="right"><b><small>'.$lt{'numn'}.
                       '</small></b></td>');
@@ -1151,7 +1337,7 @@
             my $lastpost = &Apache::lonnavmaps::timeToHumanString(
                                                $$unread{$ressymb}{'lastpost'});
             $r->print('<tr bgcolor="'.$rowColor.'"><td><small><a href="'.$feedurl.'?symb='.$$unread{$ressymb}{symb}.'">'.$forum_title.'</a>&nbsp;</td><td><small>'.$type.'&nbsp;</small></td>');
-            if ($countunread) {
+            if ($countunread eq 'on') {
                 my $unreadnum = $$unread{$ressymb}{'unreadcount'};
                 $r->print('<td><small>'.$lastpost.'<small></td><td align="right">'.
                           '<small>',$unreadnum.'&nbsp;</small></td>');
@@ -1276,11 +1462,81 @@
     return $result;
 }
 
+sub store_discussion_setting {
+    my ($uname,$udom,$cid) = @_;
+    my %discussion_settings;
+    my $result;
+    if (defined($env{'form.countunread'})) {
+        $discussion_settings{$cid.':countunread'} = $env{'form.countunread'};
+        my $outcome = &Apache::lonnet::put('nohist_whatsnew',
+                                             \%discussion_settings,$udom,$uname);
+        if ($outcome eq 'ok') {
+            $result = &mt('Count unread posts in discussions display set to [_1]',
+                  '<b>'.$env{'form.countunread'}.'</b><br />');
+                                                                                  
+        } else {
+            &Apache::lonnet::logthis('Error storing whatsnew countunread setting'.
+                     ' '.$outcome.' for '.$uname.':'.$udom.' in course '.$cid);
+            $result = &mt('Unable to set "number unread posts display" to [_1]'.
+                          ' due to [_2].',
+                         '<b>'.$env{'form.countunread'}.'</b>',
+                         '<tt>'.$outcome.'</tt>.<br />');
+        }
+    }
+    return $result;
+}
+
+sub store_courseinit_setting {
+    my ($uname,$udom,$cid,$initpage) = @_;
+    my %courseinit_settings;
+    my $page_control;
+    my $result;
+    if (defined($env{'form.courseinit_control'})) {
+        if ($env{'form.courseinit_control'} eq 'userpref') {
+            $courseinit_settings{$cid.':courseinit'} = '';
+            $page_control = 'global preferences';
+        } else {
+            if (defined($env{'form.courseinit_page'})) {
+                $courseinit_settings{$cid.':courseinit'} = 
+                                                  $env{'form.courseinit_page'};
+                $page_control = 'course specific setting';
+            }
+        }
+        if ($page_control) {
+            my $outcome = &Apache::lonnet::put('nohist_whatsnew',
+                                           \%courseinit_settings,$udom,$uname);
+            if ($outcome eq 'ok') {
+                if ($page_control eq 'global preferences') {
+                    $result = &mt('Page displayed after role selection in course now set by [_1]',"<b>user's global preferences</b>.");
+                } else {
+                    $result = &mt('Page displayed after role selection in this course set to [_1]','<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>.');
+                }
+            } else {
+                &Apache::lonnet::logthis('Error storing whatsnew courseinit '.
+                                         'setting: '.$outcome.' for '.$uname.
+                                                 ':'.$udom.' in course '.$cid);
+                if ($page_control eq 'global preferences') {
+                    $result = &mt('Unable to set control of page display to [_1]'.
+                          ' due to [_2].',
+                         '<b>'.$page_control.'</b>',
+                         '<tt>'.$outcome.'</tt>.<br />');
+                } else {
+                    $result = &mt('Unable to set page display, after role selection, for this course to [_1] due to [_2].',
+                         '<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>',
+                         '<tt>'.$outcome.'</tt>.<br />');
+                }
+            }
+        }
+    }
+    return $result;
+}
+
 sub start_box {
-    my ($r,$tabbg,$show,$heading,$caller) = @_;
+    my ($r,$tabbg,$show,$heading,$caller,$refpage) = @_;
     my %lt = &Apache::lonlocal::texthash( 
                        chth => 'Change thresholds?',
                        chin => 'Change interval?',
+                       chop => 'Change options?',
     );
     my $showhide;
     if ($$show{$caller}) {
@@ -1310,12 +1566,17 @@
      if (($caller eq 'abovethreshold') && ($$show{$caller})) {
          $r->print('
               <tr>
-                <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chgthreshold"><b><small>'.$lt{'chth'}.'</small></b></a></td>
+                <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chgthreshold&refpage='.$refpage.'"><b><small>'.$lt{'chth'}.'</small></b></a></td>
               </tr>');
      } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {
          $r->print('
               <tr>
-                <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chginterval"><b><small>'.$lt{'chin'}.'</small></b></a></td>
+                <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chginterval&refpage='.$refpage.'"><b><small>'.$lt{'chin'}.'</small></b></a></td>
+              </tr>');
+     } elsif ($caller eq 'coursediscussion') {
+         $r->print('
+              <tr>
+                <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chgdisc&refpage='.$refpage.'"><b><small>'.$lt{'chop'}.'</small></b></a></td>
               </tr>');
      }
      $r->print('

--raeburn1135028377--