--- loncom/interface/lonwhatsnew.pm	2005/12/20 15:56:38	1.40
+++ loncom/interface/lonwhatsnew.pm	2006/01/06 22:37:27	1.45
@@ -1,5 +1,5 @@
 #
-# $Id: lonwhatsnew.pm,v 1.40 2005/12/20 15:56:38 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.45 2006/01/06 22:37:27 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -58,26 +58,36 @@ sub handler {
     my $command = $env{'form.command'};
     my $refpage = $env{'form.refpage'};
 
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
-    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";
+    my %checkallowed = ( coursenormalmail => 1,
+			 coursecritmail => 1, );
+    foreach my $perm_check (['whn','whatsnew',1],
+			    ['pch','coursediscussion',1],
+			    ['mgr','handgrading',1],
+			    ['vgr','abovethreshold',1],
+			    ['opa','haserrors',1],
+			    ['mdc','versionchanges',0],
+			    ) {
+	my ($perm,$key,$check_section) = @{ $perm_check };
+	my $scope = $env{'request.course.id'};
+	if (!($checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope))) {
+	    $scope .= '/'.$env{'request.course.sec'};
+	    if ( $check_section ) {
+		$checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope);
+	    }
+	    if ($checkallowed{$key}) {
+		$checkallowed{$key.'_section'} = $env{'request.course.sec'};
+	    }
+	}
+    }
+
+    if ( ! $env{'request.course.fn'} || ! $checkallowed{'whatsnew'}) {
+        # Not in a course, or no whn priv in course
+        $env{'user.error.msg'}="/adm/whatsnew::whn:0:0:Cannot display what's new page";
         return HTTP_NOT_ACCEPTABLE;
     }
 
-    my %checkallowed = (
-             coursediscussion => &Apache::lonnet::allowed('pch',$env{'request.course.id'}),
-             handgrading => &Apache::lonnet::allowed('mgr',$env{'request.course.id'}),
-             abovethreshold => &Apache::lonnet::allowed('vgr',$env{'request.course.id'}),
-             haserrors => &Apache::lonnet::allowed('opa',$env{'request.course.id'}),
-             versionchanges => &Apache::lonnet::allowed('opa',$env{'request.course.id'}),
-             coursenormalmail => 1,
-             coursecritmail => 1,
-    );
+    &Apache::loncommon::content_type($r,'text/html');
+    $r->send_http_header;
 
     $r->print(&display_header($command,\%checkallowed));
 
@@ -85,19 +95,19 @@ sub handler {
     &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew',
               text=>"Display Action Items"});
-    if (($command eq 'chgthreshold') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
+    if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
               text=>"Change thresholds"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,"What's New?",'Course_Action_Items_Thresholds'));
-    } elsif (($command eq 'chginterval') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
+    } elsif (($command eq 'chginterval') && $checkallowed{'versionchanges'} ) {
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
               text=>"Change interval"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,"What's New?",'Course_Action_Items_Intervals'));
-    } elsif (($command eq 'chgdisc') && (&Apache::lonnet::allowed('pch',$env{'request.course.id'}))) {
+    } elsif (($command eq 'chgdisc') && $checkallowed{'coursediscussion'}) {
         &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
               text=>"Change discussion display"});
@@ -152,15 +162,15 @@ sub display_main_box {
     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'}))) {
+    if (($command eq 'chgthreshold') 
+	&& $checkallowed->{'abovethreshold'}) {
         &display_threshold_config($r,$refpage,$tabbg,\%threshold_titles,
                                                                    $cdom,$crs);
-    } elsif (($command eq 'chginterval') && 
-               (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) {
+    } elsif (($command eq 'chginterval') 
+	     && $checkallowed->{'versionchanges'}) {
         &display_interval_config($r,$refpage,\%interval_titles);
-    } elsif (($command eq 'chgdisc') && 
-               (&Apache::lonnet::allowed('pch',$env{'request.course.id'}))) {
+    } elsif (($command eq 'chgdisc') 
+	     && $checkallowed->{'coursediscussion'}) {
         &display_discussion_config($r,$refpage);
     } elsif ($command eq 'courseinit') {
         &courseinit_config($r,$refpage,\%initpage);
@@ -200,6 +210,7 @@ function change_display(caller,change) {
 function changeAll(change) {
 END
         foreach my $item (keys(%{$checkallowed})) {
+	    if ($item =~ /_section$/) { next; }
             if ($$checkallowed{$item}) {
                 $scripttag.='document.visible.display_'.$item.'.value=change'.
                             "\n";
@@ -363,6 +374,7 @@ sub display_actions_box {
     my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail');
 
     foreach my $key (keys(%{$checkallowed})) {
+	if ($key =~ /_section$/) { next; }
         $show{$key} = 0;
         if ($$checkallowed{$key}) {
             unless ($display_settings{$cid.':'.$key} eq 'hide') {
@@ -394,6 +406,7 @@ sub display_actions_box {
      &nbsp;&nbsp;<a href="javascript:changeAll('show');">$lt{'shal'}</a>
      <form method="post" name="visible" action="/adm/whatsnew">\n|);
     foreach my $item (keys(%{$checkallowed})) {
+	if ($item =~ /_section$/) { next; }
         if ($$checkallowed{$item}) {
             $r->print('<input type="hidden" name="display_'.$item.'" />'."\n");
         }
@@ -404,6 +417,8 @@ sub display_actions_box {
     my $displayed = 0;
     my $totalboxes = 0;
     foreach my $key (keys(%{$checkallowed})) {
+	if ($key =~ /_section$/) { next; }
+	if ($key eq 'whatsnew' ) { next; } # whatsnew check creates no box
         if ($$checkallowed{$key}) {
             $totalboxes ++;
         }
@@ -560,9 +575,9 @@ sub display_discussion_config {
 &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
+<label><input type ="radio" '.$status{'on'}.' name="countunread" value="on">on</label>
 &nbsp;&nbsp;&nbsp;
-<input type ="radio" '.$status{'off'}.' name="countunread" value="off">off
+<label><input type ="radio" '.$status{'off'}.' name="countunread" value="off">off</label>
 ');
     $r->print('<br/><br />
                <input type="submit" name="display" value="'.
@@ -602,14 +617,14 @@ $$initpage{$current}</b>.<br /><br />
 $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('<nobr><label><input type="radio" name="courseinit_control" value="'.
+                   $choice.'"/>'.$$initpage{$choice}.'&nbsp;&nbsp;</label></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('<nobr><label><input type="radio" name="courseinit_page" value="'.
+                  $choice.'"/>'.$$initpage{$choice}.'&nbsp;&nbsp;</label></nobr>');
     }
     $r->print('<br /><br /><input type="submit" name="display" value="'.
                $lt{'moce'}.'" /></form>');
@@ -1401,9 +1416,9 @@ sub get_display_settings {
     my ($tmp) = keys(%settings);
     if ($tmp=~ /^(con_lost|error|no_such_host)/i) {
         %settings = ();
-        unless ($tmp eq 'error: 2 tie(GDBM) Failed while attempting dump') {
-            &logthis('Error retrieving whatsnew settings: '.$tmp.' for '.
-                                $uname.':'.$udom.' for course: '.$cid);
+        unless ($tmp =~ /^error: 2 /) {
+            &Apache::lonnet::logthis('Error retrieving whatsnew settings: '.
+            $tmp.' for '.$uname.':'.$udom.' for course: '.$cid);
         }
     }
     return %settings;
@@ -1414,6 +1429,7 @@ sub store_display_settings {
     my %whatsnew_settings;
     my $result;
     foreach my $key (keys(%{$checkallowed})) {
+	if ($key =~ /_section$/) { next; }
         if (exists($env{'form.display_'.$key})) {
             unless ($env{'form.display_'.$key} eq '') {
                 $whatsnew_settings{$cid.':'.$key} = $env{'form.display_'.$key};