Diff for /loncom/interface/lonwhatsnew.pm between versions 1.86 and 1.118

version 1.86, 2009/02/10 09:30:16 version 1.118, 2015/07/21 21:26:32
Line 42  use Time::Local; Line 42  use Time::Local;
 use GDBM_File;  use GDBM_File;
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA;
   use HTML::Entities;
   
 #----------------------------  #----------------------------
 # handler  # handler
Line 71  sub handler { Line 72  sub handler {
     ['mdc','versionchanges',0],      ['mdc','versionchanges',0],
                             ['vcl','newroles',1],                              ['vcl','newroles',1],
                             ['vcl','oldroles',1],                              ['vcl','oldroles',1],
                               ['whn','crslogin',1],
     ) {      ) {
  my ($perm,$key,$check_section) = @{ $perm_check };   my ($perm,$key,$check_section) = @{ $perm_check };
  my $scope = $env{'request.course.id'};   my $scope = $env{'request.course.id'};
Line 87  sub handler { Line 89  sub handler {
   
     if ( ! $env{'request.course.fn'} || ! $checkallowed{'whatsnew'}) {      if ( ! $env{'request.course.fn'} || ! $checkallowed{'whatsnew'}) {
         # Not in a course, or no whn priv in course          # 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";          $env{'user.error.msg'}="/adm/whatsnew:whn:0:0:Cannot display what's new page";
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
   
Line 99  sub handler { Line 101  sub handler {
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew',              ({href=>'/adm/whatsnew',
               text=>"Display Action Items"});                text=>"What's New?"});
     if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {      if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,              ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
Line 142  sub handler { Line 144  sub handler {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
             ("What's New?",#'Course_Action_Items_Intervals'              ("What's New?",#'Course_Action_Items_Intervals'
              ));               ));
       } elsif ($command eq 'chgcrslogininterval' && $checkallowed{'crslogin'}) {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/whatsnew?command=chgcrslogininterval&refpage='.$refpage,
                 text=>"Change interval"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs
               ("What's New?",#'Course_Action_Items_Intervals'
                ));
     } else {      } else {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
             ("What's New?",#'Course_Action_Items_Display'              ("What's New?",#'Course_Action_Items_Display'
Line 187  sub display_main_box { Line 196  sub display_main_box {
                    604800 => 'roles which expired since last week',                     604800 => 'roles which expired since last week',
                     86400 => 'roles which expired since yesterday',                      86400 => 'roles which expired since yesterday',
                    );                     );
       my %crslogins = (
                          -1 => 'last logins for anyone who has ever logged in',
                     2592000 => 'last logins for users in last 30 days',
                      604800 => 'last logins for users in last 7 days',
                       86400 => 'last logins for users in last 24 hours',
                      );
     my %interval_titles = (      my %interval_titles = (
         versions => \%versions,          versions => \%versions,
         newroles => \%newroles,          newroles => \%newroles,
         oldroles => \%oldroles,          oldroles => \%oldroles,
           crslogin => \%crslogins,
     );      );
     my %initpage = &Apache::lonlocal::texthash (      my %initpage = &Apache::lonlocal::texthash (
                      firstres => "first resource in the $lctype",                       firstres => "first resource in the $lctype",
                      whatsnew => "what's new? page",                       whatsnew => "What's New Page",
                      userpref => 'your general user preferences',                       userpref => 'your general user preferences',
                      coursespecific => "specific setting for this $lctype",                       coursespecific => "specific setting for this $lctype",
                    );                     );
Line 219  sub display_main_box { Line 235  sub display_main_box {
     } elsif (($command eq 'chgoldroleinterval')      } elsif (($command eq 'chgoldroleinterval')
              && $checkallowed->{'oldroles'}) {               && $checkallowed->{'oldroles'}) {
         &display_interval_config($r,$refpage,\%interval_titles,'oldroles');          &display_interval_config($r,$refpage,\%interval_titles,'oldroles');
       } elsif (($command eq 'chgcrslogininterval')
                && $checkallowed->{'crslogin'}) {
           &display_interval_config($r,$refpage,\%interval_titles,'crslogin');
     } else {      } else {
         &display_actions_box($r,$command,$refpage,\%threshold_titles,          &display_actions_box($r,$command,$refpage,\%threshold_titles,
                         \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);                          \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
Line 244  sub display_header { Line 263  sub display_header {
           
     my $scripttag;      my $scripttag;
     unless ($command eq 'chgthreshold' || $command eq 'chginterval' ||       unless ($command eq 'chgthreshold' || $command eq 'chginterval' || 
             $command eq 'chgoldroleinterval' || $command eq 'chgnewroleinterval') {              $command eq 'chgoldroleinterval' ||
               $command eq 'chgnewroleinterval' || $command eq 'chgcrslogininterval') {
        $scripttag = <<"END";         $scripttag = <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function change_display(caller,change) {  function change_display(caller,change) {
     caller.value = change;      caller.value = change;
     document.visible.submit();      document.visible.submit();
Line 263  END Line 284  END
         }          }
         $scripttag.='document.visible.submit();          $scripttag.='document.visible.submit();
 }  }
   
   function thresholdreset() {
       document.visible.command.value="reset";
       document.visible.submit();
   }
   
   function togglelogins() {
       var total = document.visible.logincount.value;
       var sumrow = document.visible.loginrow.value;
       if (total == 0) {
           return;
       }
       var showlogindetails = 0;
       for (var i=0; i<document.visible.logindetails.length; i++) {
           if (document.visible.logindetails[i].checked) {
               showlogindetails = document.visible.logindetails[i].value;
           }
       }
       var detval = "none";
       var sumval = "";
       if (showlogindetails == 1) {
           detval = "";
           sumval = "none";
       }
       for (var j=0; j<total; j++) {
           var counter = j+1;
           var itemid = "logindet_"+counter;
           personele = document.getElementById(itemid);
           if (personele != null) {
               personele.style.display = detval;
           }
       }
       var detheaderele = document.getElementById("logintitledet");
       if (detheaderele != null) {
           detheaderele.style.display = detval;
       }
       for (var k=0; k<sumrow; k++) {
           var counter = k+1;
           var itemid = "loginsum_"+counter;
           logincatele = document.getElementById(itemid);
           if (logincatele != null) {
               logincatele.style.display = sumval;
           }
       }
       var sumheaderele = document.getElementById("logintitlesum");
       if (sumheaderele != null) {
           sumheaderele.style.display = sumval;
       }
       return;
   }
   // ]]>
 </script>  </script>
 ';  ';
     }      }
     my $course_type=&Apache::loncommon::course_type();      my $course_type=&Apache::loncommon::course_type();
     return &Apache::loncommon::start_page($course_type.' Action Items',      return &Apache::loncommon::start_page("What's New?",
   $scripttag);    $scripttag);
 }  }
   
Line 288  sub display_actions_box { Line 360  sub display_actions_box {
     my $lctype = lc($crstype);      my $lctype = lc($crstype);
     my %stulabel = (      my %stulabel = (
                     'Course' => 'students',                      'Course' => 'students',
                     'Group' => 'members',                      'Community' => 'members',
                    );                     );
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                  'yacc' => 'You are accessing an invalid course',                   'yacc' => 'You are accessing an invalid course',
Line 314  sub display_actions_box { Line 386  sub display_actions_box {
     my %expired;      my %expired;
     my $activecount;      my $activecount;
     my %activated;      my %activated;
       my %loggedin;
       my $logincount;
     my %res_title = ();      my %res_title = ();
     my %show = ();      my %show = ();
     my $needitems = 0;      my $needitems = 0;
Line 327  sub display_actions_box { Line 401  sub display_actions_box {
     my %threshold = ();      my %threshold = ();
     my %pagedesc = &Apache::lonlocal::texthash (      my %pagedesc = &Apache::lonlocal::texthash (
                      firstres => 'First resource',                       firstres => 'First resource',
                      whatsnew => "What's New? page",                       whatsnew => "What's New Page",
                      userpref => 'user preference',                       userpref => 'user preference',
                      coursespecific => $lctype.' only',                       coursespecific => $lctype.' only',
                      default => 'default',                       default => 'default',
Line 341  sub display_actions_box { Line 415  sub display_actions_box {
         return;          return;
     }      }
   
       my $header = '';
     if ($refpage eq 'start') {      if ($refpage eq 'start') {
         if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',          if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
             &GDBM_READER(),0640)) {              &GDBM_READER(),0640)) {
             my $furl=$bighash{'first_url'};              my $furl=&HTML::Entities::encode($bighash{'first_url'},'"<>&');
             untie(%bighash);              untie(%bighash);
             $r->print('<span style="font-size: larger;"><a href="'.$furl.'">'.$lt{'gtfr'}.              $header .= '<b><a href="'.$furl.'">'.$lt{'gtfr'}.
                   '</a></span><br />');                    '</a></b><br />';
         }          }
     }      }
     $r->print(&mt('Page set to be displayed after you have selected a role in this '.$lctype).'.'      $header .= &mt('Page set to be displayed after you have selected a role in this '.$lctype).'.'
               .' <span class="LC_nobreak">'                .' <span class="LC_nobreak">'
               .&mt('Currently: [_1].','<i>'.$currinit.'</i>')                .&mt('Currently: [_1].','<i>'.$currinit.'</i>')
               .'&nbsp;&nbsp;'                .'&nbsp;&nbsp;'
               .&mt('[_1]Change[_2] for just [_3]this course[_4] or for all [_5]your courses[_6].'                .&mt('[_1]Change[_2] for just [_3]this '.$lctype.'[_4] or for [_5]all your courses/communities[_6].'
                   ,'<b>'                    ,'<b>'
                   ,'</b>'                    ,'</b>'
                   ,'<a href="/adm/whatsnew?command=courseinit&amp;refpage='.$refpage.'">'                    ,'<a href="/adm/whatsnew?command=courseinit&amp;refpage='.$refpage.'">'
                   ,'</a>'                    ,'</a>'
                   ,'<a href="/adm/preferences?action=changecourseinit&amp;refpage='.$refpage.'">'                    ,'<a href="/adm/preferences?action=changecourseinit&amp;refpage='.$refpage.'">'
                   ,'</a>')                    ,'</a>')
               .' </span><br /><hr />');                .' </span>';
   
       $r->print(&Apache::loncommon::head_subbox($header));
   
     if ($command eq 'reset') {      if ($command eq 'reset') {
         $result = &process_reset($cdom,$crs);          $result = &process_reset($cdom,$crs);
Line 378  sub display_actions_box { Line 455  sub display_actions_box {
     unless ($store_result eq 'ok') {       unless ($store_result eq 'ok') { 
         &Apache::lonnet::logthis('Error saving whatsnew settings: '.          &Apache::lonnet::logthis('Error saving whatsnew settings: '.
             $store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);              $store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
         $result .= &mt('Unable to save visibility settings due to [_1]',          $result .= '<span class="LC_error">'
                        $store_result);                     .&mt('Unable to save visibility settings due to [_1]',
                          $store_result)
                     .'</span>';
     }      }
   
     if ($result) {      if ($result) {
         $r->print($result.'<hr width="100%" />');          $r->print($result.'<hr />');
     }      }
     $r->rflush();      $r->rflush();
   
Line 439  sub display_actions_box { Line 518  sub display_actions_box {
         $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since yesterday');          $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since yesterday');
     }      }
   
     my $now = time;      $timediff{'crslogin'} = $display_settings{$cid.':crslogininterval'};
       unless (defined($timediff{'crslogin'})) { $timediff{'crslogin'} = 604800; }
       $interval{'crslogin'} = $interval_titles->{'crslogin'}->{$timediff{'crslogin'}};
   
       if ($timediff{'crslogin'} == -1) {
           $headings{'crslogin'} = &mt('Last login for anyone who has ever logged in');
       } elsif ($timediff{'crslogin'} == 2592000) {
           $headings{'crslogin'} = &mt('Last login for users in last 30 days');
       } elsif ($timediff{'crslogin'} == 604800) {
           $headings{'crslogin'} = &mt('Last login for users in last 7 days');
       } elsif ($timediff{'crslogin'} == 86400) {
           $headings{'crslogin'} = &mt('Last login for users in last 24 hours');
       }
   
       my ($now,$starttime,$activatedstart,$expiredstart,$crsloginstart);
       $now = time;
   
     if ($timediff{'versions'} == -1) {      if ($timediff{'versions'} == -1) {
         $timediff{'versions'} = time;          $starttime = 0;
       } else {
           $starttime = $now - $timediff{'versions'};
     }      }
     my $starttime = $now - $timediff{'versions'};  
   
     if ($timediff{'newroles'} == -1) {      if ($timediff{'newroles'} == -1) {
         $timediff{'newroles'} = time;          $activatedstart = 0;
       } else {
           $activatedstart = $now - $timediff{'newroles'};
     }      }
     my $activatedstart = $now - $timediff{'newroles'};  
   
     if ($timediff{'oldroles'} == -1) {      if ($timediff{'oldroles'} == -1) {
         $timediff{'oldroles'} = time;          $expiredstart = 0;
       } else {
           $expiredstart = $now - $timediff{'oldroles'};
       }
   
       if ($timediff{'crslogin'} == -1) {
           $crsloginstart = 0;
       } else {
           $crsloginstart = $now - $timediff{'crslogin'};
     }      }
     my $expiredstart = $now - $timediff{'oldroles'};  
   
     my $countunread = $display_settings{$cid.':countunread'};      my $countunread = $display_settings{$cid.':countunread'};
     unless (defined($countunread)) {      unless (defined($countunread)) {
Line 468  sub display_actions_box { Line 572  sub display_actions_box {
     $threshold{'av_attempts'},$threshold{'degdiff'},      $threshold{'av_attempts'},$threshold{'degdiff'},
     '<br />',$threshold{'numstudents'});      '<br />',$threshold{'numstudents'});
   
     my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles');      my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles','crslogin');
   
     foreach my $key (keys(%{$checkallowed})) {      foreach my $key (keys(%{$checkallowed})) {
  if ($key =~ /_section$/) { next; }   if ($key =~ /_section$/) { next; }
Line 494  sub display_actions_box { Line 598  sub display_actions_box {
     if ($needitems) {      if ($needitems) {
         $itemserror = &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\%changed,\@newdiscussions,\@tograde,\@bombs,\@warnings,\%threshold,$cdom,$crs,\%res_title,\%show,$starttime,$countunread);          $itemserror = &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\%changed,\@newdiscussions,\@tograde,\@bombs,\@warnings,\%threshold,$cdom,$crs,\%res_title,\%show,$starttime,$countunread);
     }      }
       my $classlist;
       if ($show{'oldroles'} || $show{'newroles'} || $show{'crslogin'}) {
           $classlist = &Apache::loncoursedata::get_classlist();
       }
     if ($show{'coursenormalmail'}) {      if ($show{'coursenormalmail'}) {
         $msgcount = &getnormalmail(\@newmsgs);          $msgcount = &getnormalmail(\@newmsgs);
     }      }
Line 501  sub display_actions_box { Line 609  sub display_actions_box {
         $critmsgcount = &getcritmail(\@critmsgs);          $critmsgcount = &getcritmail(\@critmsgs);
     }      }
     if ($show{'oldroles'}) {      if ($show{'oldroles'}) {
         $expirecount = &getexpired(\%expired,$expiredstart,'previous');          $expirecount = &getexpired(\%expired,$expiredstart,'previous',$classlist);
     }      }
     if ($show{'newroles'}) {      if ($show{'newroles'}) {
         $activecount = &getactivated(\%activated,$activatedstart,'active');          $activecount = &getactivated(\%activated,$activatedstart,'active',$classlist);
       }
       if ($show{'crslogin'}) {
           $logincount = &getloggedin($cdom,$crs,\%loggedin,$crsloginstart);
     }      }
     $r->print(qq|<a href="javascript:changeAll('hide');">$lt{'hial'}</a>      $r->print(qq|<a href="javascript:changeAll('hide');">$lt{'hial'}</a>
      &nbsp;&nbsp;<a href="javascript:changeAll('show');">$lt{'shal'}</a>       &nbsp;&nbsp;<a href="javascript:changeAll('show');">$lt{'shal'}</a>
Line 516  sub display_actions_box { Line 627  sub display_actions_box {
         }          }
     }      }
   
     $r->print('<input type="hidden" name="refpage" value="'.$refpage.'" /></form><table class="LC_double_column"><tr><td class="LC_left_col">');      $r->print('<input type="hidden" name="refpage" value="'.$refpage.'" /><table class="LC_double_column"><tr><td class="LC_left_col">');
   
     my $displayed = 0;      my $displayed = 0;
     my $totalboxes = 0;      my $totalboxes = 0;
Line 534  sub display_actions_box { Line 645  sub display_actions_box {
             if ($displayed == $halfway) {              if ($displayed == $halfway) {
                 $r->print('</td><td>&nbsp;</td><td class="LC_right_col" >');                  $r->print('</td><td>&nbsp;</td><td class="LC_right_col" >');
             }              }
             &display_launcher($r,$actionitem,$refpage,$checkallowed,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,\%interval,$countunread,\%expired,$expirecount,\%activated,$activecount,$crstype,$itemserror);              &display_launcher($r,$actionitem,$refpage,$checkallowed,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,\%interval,$countunread,\%expired,$expirecount,\%activated,$activecount,$crstype,$itemserror,\%loggedin,$logincount,$classlist);
             $displayed ++;               $displayed ++; 
         }          }
     }      }
Line 542  sub display_actions_box { Line 653  sub display_actions_box {
       </td>        </td>
     </tr>      </tr>
    </table>     </table>
      </form>
 ');  ');
 }  }
   
Line 580  sub display_threshold_config { Line 692  sub display_threshold_config {
     foreach my $type (@thresholditems) {      foreach my $type (@thresholditems) {
         my $parameter = $env{'request.course.id'}.':threshold_'.$type;          my $parameter = $env{'request.course.id'}.':threshold_'.$type;
 # onchange is javascript to automatically check the 'Set' button.  # onchange is javascript to automatically check the 'Set' button.
         my $onchange = 'onFocus="javascript:window.document.forms'.          my $onchange = 'onfocus="javascript:window.document.forms'.
               "['thresholdform'].elements['".$parameter."_setparmval']".                "['thresholdform'].elements['".$parameter."_setparmval']".
               '.checked=true;"';                '.checked=true;"';
         $r->print(&Apache::loncommon::start_data_table_row()."\n".          $r->print(&Apache::loncommon::start_data_table_row()."\n".
Line 594  sub display_threshold_config { Line 706  sub display_threshold_config {
                  &Apache::loncommon::end_data_table_row());                   &Apache::loncommon::end_data_table_row());
     }      }
     $r->print(&Apache::loncommon::end_data_table()."\n".      $r->print(&Apache::loncommon::end_data_table()."\n".
           '<br /><input type="submit" name="threshold" value="'.&mt('Make changes').'" />            '<br /><input type="submit" name="threshold" value="'.&mt('Save').'" />
                  <input type="hidden" name="command" value="update" />                   <input type="hidden" name="command" value="update" />
                  <input type="hidden" name="refpage" value="'.$refpage.'" />                   <input type="hidden" name="refpage" value="'.$refpage.'" />
                </form>');                 </form>');
Line 622  sub display_interval_config { Line 734  sub display_interval_config {
         $r->print('<br />'.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' expired.').'<br />');          $r->print('<br />'.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' expired.').'<br />');
     } elsif ($context eq 'newroles') {      } elsif ($context eq 'newroles') {
         $r->print('<br />'.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' became available.').'<br />');          $r->print('<br />'.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' became available.').'<br />');
       } elsif ($context eq 'crslogin') {
           $r->print('<br />'.&mt('Choose the time window to use to display the last login by a user in the '.$lctype).'<br />');
     } else {      } else {
         $r->print('<br />'.&mt('Choose the time window to use to display resources in the '.$lctype.' with version changes.').'<br />');          $r->print('<br />'.&mt('Choose the time window to use to display resources in the '.$lctype.' with version changes.').'<br />');
     }      }
Line 650  sub display_interval_config { Line 764  sub display_interval_config {
     }      }
     $r->print('</select>&nbsp;&nbsp;      $r->print('</select>&nbsp;&nbsp;
                <input type="submit" name="display" value="'.                 <input type="submit" name="display" value="'.
                &mt('Change interval').'" /></form>');                 &mt('Save').'" /></form>');
     return;      return;
 }  }
   
Line 683  function toggle_countunread(choice) { Line 797  function toggle_countunread(choice) {
     $r->print('<br />'      $r->print('<br />'
              .&mt('Choose whether or not to display a count of the number of new posts for each resource or discussion board which has unread posts.')               .&mt('Choose whether or not to display a count of the number of new posts for each resource or discussion board which has unread posts.')
              .'<br />'               .'<br />'
              .&mt("This can increase the time taken to gather data for the '<i>What's New?</i>' page by a few seconds.")               .&mt("This can increase the time taken to gather data for the [_1]What's New Page[_2] by a few seconds.",'<i>','</i>')
              .'&nbsp;&nbsp;'               .'&nbsp;&nbsp;'
              .&mt('Currently set to [_1].','<b>'.$current.'</b>.')               .&mt('Currently set to [_1].','<b>'.$current.'</b>')
     );      );
     $r->print('<br /><br />      $r->print('<br /><br />
 <form method="post" name="discussionswitch" action="/adm/whatsnew">  <form method="post" name="discussionswitch" action="/adm/whatsnew">
Line 725  sub courseinit_config { Line 839  sub courseinit_config {
                              'anis' => 'and is set to display',                               'anis' => 'and is set to display',
                              'padc' => 'Page display controlled by',                               'padc' => 'Page display controlled by',
                              'chce' => 'Choose '.$lctype.' entry',                               'chce' => 'Choose '.$lctype.' entry',
                              'moce' => 'Modify '.$lctype.' entry',                               'moce' => 'Save',
     );      );
     $r->print(<<"END");       $r->print(<<"END"); 
 <br />$lt{'chwp'}  <br />$lt{'chwp'}
Line 787  sub display_launcher { Line 901  sub display_launcher {
         $tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered,          $tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered,
         $newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs,          $newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs,
         $interval,$countunread,$expired,$expirecount,$activated,$activecount,          $interval,$countunread,$expired,$expirecount,$activated,$activecount,
         $crstype,$itemserror) = @_;          $crstype,$itemserror,$loggedin,$logincount,$classlist) = @_;
   
     if ($$checkallowed{$action}) {      if ($$checkallowed{$action}) {
         &start_box($r,$show,$headings,$action,$refpage,$action);          &start_box($r,$show,$headings,$action,$refpage);
         if ($$show{$action}) {          if ($$show{$action}) {
             if ($action eq 'handgrading') {    # UNGRADED ITEMS              if ($action eq 'handgrading') {    # UNGRADED ITEMS
                 &display_handgrade($r,$tograde,$ungraded,$itemserror);                  &display_handgrade($r,$tograde,$ungraded,$itemserror);
Line 810  sub display_launcher { Line 924  sub display_launcher {
                 &display_coursecritmail($r,$critmsgcount,$critmsgs);                  &display_coursecritmail($r,$critmsgcount,$critmsgs);
             } elsif ($action eq 'newroles') { # ACTIVATED ROLES              } elsif ($action eq 'newroles') { # ACTIVATED ROLES
                 &display_rolechanges($r,$activecount,$activated,$interval->{'newroles'},                  &display_rolechanges($r,$activecount,$activated,$interval->{'newroles'},
                                      $crstype);                                       $crstype,$classlist);
             } elsif ($action eq 'oldroles') { # EXPIRED ROLES              } elsif ($action eq 'oldroles') { # EXPIRED ROLES
                 &display_rolechanges($r,$expirecount,$expired,$interval->{'oldroles'},                  &display_rolechanges($r,$expirecount,$expired,$interval->{'oldroles'},
                                      $crstype);                                       $crstype,$classlist);
               } elsif ($action eq 'crslogin') { #LAST LOGIN
                   &display_crslogins($r,$logincount,$loggedin,$interval->{'crslogin'},
                                      $crstype,$classlist);
             }              }
         }          }
         &end_box($r);          &end_box($r);
Line 968  sub check_thresholds { Line 1085  sub check_thresholds {
         if ($resource->handgrade($part) eq 'yes') {          if ($resource->handgrade($part) eq 'yes') {
             next;              next;
         }          }
           if ($resource->is_anonsurvey($part)) {
               next;
           }
         if ($resource->is_survey($part)) {          if ($resource->is_survey($part)) {
             next;              next;
         }          }
Line 990  sub check_thresholds { Line 1110  sub check_thresholds {
             $av_attempts = $attempts/$users;              $av_attempts = $attempts/$users;
             $av_attempts = sprintf("%.2f",$av_attempts);              $av_attempts = sprintf("%.2f",$av_attempts);
         }          }
           &Apache::lonnet::statslog($symb,$part,$users,$av_attempts,$degdiff);
         if ((($degdiff ne '' && $degdiff >= $$threshold{'degdiff'}) || ($av_attempts ne '' && $av_attempts >= $$threshold{'av_attempts'})) && ($users >= $$threshold{'numstudents'})) {          if ((($degdiff ne '' && $degdiff >= $$threshold{'degdiff'}) || ($av_attempts ne '' && $av_attempts >= $$threshold{'av_attempts'})) && ($users >= $$threshold{'numstudents'})) {
             $stats{$part}{degdiff} = $degdiff;              $stats{$part}{degdiff} = $degdiff;
             $stats{$part}{attempts} = $av_attempts;              $stats{$part}{attempts} = $av_attempts;
Line 1043  sub get_curr_thresholds { Line 1164  sub get_curr_thresholds {
     my $thresholdcount = 0;      my $thresholdcount = 0;
     my ($tmp) = %thresholdsettings;      my ($tmp) = %thresholdsettings;
     unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {      unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
         foreach my $item (keys %{$threshold}) {           foreach my $item (keys(%{$threshold})) { 
             if (exists($thresholdsettings{$cid.':threshold_'.$item})) {              if (exists($thresholdsettings{$cid.':threshold_'.$item})) {
                 $$threshold{$item} =                   $$threshold{$item} = 
                              $thresholdsettings{$cid.':threshold_'.$item};                               $thresholdsettings{$cid.':threshold_'.$item};
Line 1058  sub get_curr_thresholds { Line 1179  sub get_curr_thresholds {
                                               $cdom,$crs,'internal.threshold');                                                $cdom,$crs,'internal.threshold');
     my ($temp) = %coursesettings;      my ($temp) = %coursesettings;
     unless ($temp =~ /^(con_lost|error|no_such_host)/i) {        unless ($temp =~ /^(con_lost|error|no_such_host)/i) {  
         foreach my $item (keys %{$threshold}) {          foreach my $item (keys(%{$threshold})) {
             unless (exists($thresholdsettings{$cid.':threshold_'.$item})) {              unless (exists($thresholdsettings{$cid.':threshold_'.$item})) {
                 if (exists($coursesettings{'internal.threshold_'.$item})) {                  if (exists($coursesettings{'internal.threshold_'.$item})) {
                     $$threshold{$item} =                       $$threshold{$item} = 
Line 1124  sub process_reset { Line 1245  sub process_reset {
   
 sub process_update {  sub process_update {
     my ($uname,$udom,$threshold_titles) = @_;      my ($uname,$udom,$threshold_titles) = @_;
     my $setoutput = '<b>'.&mt('Changes to threshold(s) for problem tracking:').'</b><br />';      my $setoutput = '<b>'.&mt('Changes to threshold(s) for problem tracking:').'</b><br/><br />';
     foreach (keys %env) {      foreach my $key (keys(%env)) {
         next if ($_!~/^form\.(.+)\_setparmval$/);          my $name;
         my $name  = $1;          if ($key =~/^form\.(.+)\_setparmval$/) {
               $name  = $1;
           } else {
               next;
           }
         my $value = $env{'form.'.$name.'_value'};          my $value = $env{'form.'.$name.'_value'};
         if ($name && defined($value) && ($value ne '')) {          if ($name && defined($value) && ($value ne '')) {
             my $put_result = &Apache::lonnet::put('nohist_whatsnew',              my $put_result = &Apache::lonnet::put('nohist_whatsnew',
Line 1135  sub process_update { Line 1260  sub process_update {
                         
             my ($shortname) = ($name =~ /^\Q$env{'request.course.id'}\E:threshold_(.+)$/);              my ($shortname) = ($name =~ /^\Q$env{'request.course.id'}\E:threshold_(.+)$/);
             if ($put_result eq 'ok') {              if ($put_result eq 'ok') {
                 $setoutput.=&mt('Set threshold for [_1] to [_2]',                  $setoutput.= &Apache::lonhtmlcommon::confirm_success(&mt('Set threshold for [_1] to [_2]',
  '<b>'.$$threshold_titles{$shortname}.'</b>',   '<b>'.$$threshold_titles{$shortname}.'</b>',
  '<b>'.$value.'</b>').'<br />';   '<b>'.$value.'</b>').'<br />');
     } else {      } else {
                 $setoutput.=&mt('Unable to set threshold for [_1] to [_2] due to [_3].',                  $setoutput.= &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set threshold for [_1] to [_2] due to [_3].',
  '<b>'.$name.'</b>','<b>'.$value.'</b>',   '<b>'.$name.'</b>','<b>'.$value.'</b>',
  '<tt>'.$put_result.'</tt>').'<br />';   '<tt>'.$put_result.'</tt>').'<br />',1);
             }              }
         }          }
     }      }
     return $setoutput;      return &Apache::loncommon::confirmwrapper($setoutput);
 }  }
   
 sub getnormalmail {  sub getnormalmail {
     my ($newmsgs) = @_;      my ($newmsgs) = @_;
 # Check for unread mail in course  # Check for unread messages in user's INBOX (which were sent in context of current course).
     my $msgcount = 0;      my $msgcount = 0;
       my @messages = &Apache::lonnet::getkeys('nohist_email');
     my @messages = sort(&Apache::lonnet::getkeys('nohist_email'));      return $msgcount if (!@messages);
     foreach my $message (@messages) {      my %emailstatus = &Apache::lonnet::dump('email_status');
  my $msgid=&escape($message);      foreach my $msgid (sort(@messages)) {
         my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=          if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) {
             &Apache::lonmsg::unpackmsgid($msgid);              my $skipstatus;
         if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {              if ($emailstatus{$msgid} eq 'new') {
             if (defined($sendtime) && $sendtime!~/error/) {                  $skipstatus = 1;
                 my $numsendtime = $sendtime;              }
                 $sendtime = &Apache::lonlocal::locallocaltime($sendtime);              my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
                 if ($status eq 'new') {                  &Apache::lonmsg::unpackmsgid($msgid,undef,$skipstatus,undef,
                     $msgcount ++;                                               $env{'request.course.id'});
                     if ($shortsubj eq '') {              if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
                         $shortsubj = &mt('No subject');                  if (defined($sendtime) && $sendtime!~/error/) {
                       if (($emailstatus{$msgid} eq 'new') || ($status eq 'new')) {
                           $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
           $msgcount ++;
                           if ($shortsubj eq '') {
                               $shortsubj = &mt('No subject');
                           }
                           push(@{$newmsgs}, {
                               msgid    => $msgid,
                               sendtime => $sendtime,
                               shortsub => $shortsubj,
                               from     => $fromname,
                               fromdom  => $fromdom
                               });
                     }                      }
                     push(@{$newmsgs}, {  
                         msgid    => $msgid,  
                         sendtime => $sendtime,  
                         shortsub => $shortsubj,  
                         from     => $fromname,  
                         fromdom  => $fromdom  
                         });  
                 }                  }
             }              }
         }          }
Line 1183  sub getnormalmail { Line 1314  sub getnormalmail {
   
 sub getcritmail {  sub getcritmail {
     my ($critmsgs) = @_;       my ($critmsgs) = @_; 
 # Check for critical messages in course  # Check for critical messages which were sent in context of current course.
     my %what=&Apache::lonnet::dump('critical');      my %what=&Apache::lonnet::dump('critical');
     my $result = '';      my $result = '';
     my $critmsgcount = 0;      my $critmsgcount = 0;
     foreach my $msgid (sort(keys(%what))) {      foreach my $msgid (sort(keys(%what))) {
         my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=          my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
             &Apache::lonmsg::unpackmsgid($msgid);              &Apache::lonmsg::unpackmsgid($msgid,undef,1,undef,
                                            $env{'request.course.id'});
         if (($fromcid) && ($fromcid eq  $env{'request.course.id'})) {          if (($fromcid) && ($fromcid eq  $env{'request.course.id'})) {
             if (defined($sendtime) && $sendtime!~/error/) {              if (defined($sendtime) && $sendtime!~/error/) {
                 my $numsendtime = $sendtime;  
                 $sendtime = &Apache::lonlocal::locallocaltime($sendtime);                  $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
                 $critmsgcount ++;                  $critmsgcount ++;
                 if ($shortsubj eq '') {                  if ($shortsubj eq '') {
Line 1212  sub getcritmail { Line 1343  sub getcritmail {
 }  }
   
 sub getexpired {  sub getexpired {
     my ($rolechgs,$rolechgtime,$status) = @_;      my ($rolechgs,$rolechgtime,$status,$classlist) = @_;
     my $expirecount = &getrolechanges($rolechgs,$rolechgtime,$status);      my $expirecount = &getrolechanges($rolechgs,$rolechgtime,$status,$classlist);
     return $expirecount;      return $expirecount;
 }  }
   
 sub getactivated {  sub getactivated {
     my ($rolechgs,$rolechgtime,$status) = @_;      my ($rolechgs,$rolechgtime,$status,$classlist) = @_;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $now = time();      my $now = time();
Line 1230  sub getactivated { Line 1361  sub getactivated {
     my (%stucounted,%advcounted);      my (%stucounted,%advcounted);
     my $activatedcount = 0;      my $activatedcount = 0;
     if (keys(%changes) > 0) {      if (keys(%changes) > 0) {
         foreach my $chg (sort { $b <=> $a } (keys(%changes))) {          foreach my $chg (keys(%changes)) {
             if (ref($changes{$chg}) eq 'HASH') {              if (ref($changes{$chg}) eq 'HASH') {
                 my $timestamp = $changes{$chg}{'exe_time'};                  next if ($changes{$chg}{'delflag'});
                 if ($timestamp) {                  if ($rolechgtime > 0) {
                     if ($rolechgtime > 0) {                      next if ($changes{$chg}{'exe_time'} < $rolechgtime);
                         if ($timestamp < $rolechgtime) {                  }
                             last;                  if ($changes{$chg}{'exe_time'}) {
                         }                      my $timestamp = $changes{$chg}{'exe_time'};
                     }  
                     if (ref($changes{$chg}{'logentry'}) eq 'HASH') {                      if (ref($changes{$chg}{'logentry'}) eq 'HASH') {
                         next if ($changes{$chg}{'delflag'});  
                         my $start = $changes{$chg}{'logentry'}{'start'};  
                         my $end = $changes{$chg}{'logentry'}{'end'};                          my $end = $changes{$chg}{'logentry'}{'end'};
                         my $section = $changes{$chg}{'logentry'}{'section'};  
                         my $role = $changes{$chg}{'logentry'}{'role'};  
                         my $uname = $changes{$chg}{'uname'};  
                         my $udom = $changes{$chg}{'udom'};  
                         next if ($end && $end <= $now);                          next if ($end && $end <= $now);
                           my $start = $changes{$chg}{'logentry'}{'start'};
                           next if ($start >= $timestamp);
                           my $section = $changes{$chg}{'logentry'}{'section'};
                         if (($viewablesec ne '') && ($section ne '')) {                          if (($viewablesec ne '') && ($section ne '')) {
                             next if ($viewablesec ne $section);                              next if ($viewablesec ne $section);
                         }                          }
                         next if ($start >= $timestamp);                          my $role = $changes{$chg}{'logentry'}{'role'};
                           my $uname = $changes{$chg}{'uname'};
                           my $udom = $changes{$chg}{'udom'};
                         if ($role eq 'st') {                          if ($role eq 'st') {
                             $stucounted{$uname.':'.$udom.':'.$section} = $start.':'.$end;                              $stucounted{$uname.':'.$udom.':'.$section} = $start.':'.$end;
                         } else {                          } else {
Line 1271  sub getactivated { Line 1400  sub getactivated {
             }              }
         }          }
     }      }
     $activatedcount += &getrolechanges($rolechgs,$rolechgtime,$status,\%stucounted,\%advcounted);      $activatedcount += &getrolechanges($rolechgs,$rolechgtime,$status,$classlist,\%stucounted,
                                          \%advcounted);
     return $activatedcount;      return $activatedcount;
 }  }
   
 sub getrolechanges {  sub getrolechanges {
     my ($rolechgs,$rolechgtime,$status,$stucountref,$advcountref) = @_;      my ($rolechgs,$rolechgtime,$status,$classlist,$stucountref,$advcountref) = @_;
     my (%stucounted,%advcounted);      my (%stucounted,%advcounted);
     if (ref($stucountref) eq 'HASH') {      if (ref($stucountref) eq 'HASH') {
         %stucounted = %{$stucountref};          %stucounted = %{$stucountref};
Line 1294  sub getrolechanges { Line 1424  sub getrolechanges {
     my ($permission,$allowed) =      my ($permission,$allowed) =
         &Apache::lonuserutils::get_permission($context);          &Apache::lonuserutils::get_permission($context);
     my $viewablesec = &Apache::lonuserutils::viewable_section($permission);      my $viewablesec = &Apache::lonuserutils::viewable_section($permission);
     my $classlist = &Apache::loncoursedata::get_classlist();  
     my $secidx = &Apache::loncoursedata::CL_SECTION();      my $secidx = &Apache::loncoursedata::CL_SECTION();
     my $startidx = &Apache::loncoursedata::CL_START();      my $startidx = &Apache::loncoursedata::CL_START();
     my $endidx = &Apache::loncoursedata::CL_END();      my $endidx = &Apache::loncoursedata::CL_END();
     my $rolechgcount = 0;      my $rolechgcount = 0;
     foreach my $key (keys(%{$classlist})) {      if (ref($classlist) eq 'HASH') {
         my ($userstatus,$eventtime);             foreach my $key (keys(%{$classlist})) {
         my $student = $classlist->{$key};              my ($userstatus,$eventtime);   
         if (ref($student) eq 'ARRAY') {              my $student = $classlist->{$key};
             my $start = $student->[$startidx];              if (ref($student) eq 'ARRAY') {
             my $end = $student->[$endidx];                  my $start = $student->[$startidx];
             my $sec = $student->[$secidx];                   my $end = $student->[$endidx];
             my ($stuname,$studom) = split(/:/,$key);                  my $sec = $student->[$secidx]; 
             if ($status eq 'active') {                  my ($stuname,$studom) = split(/:/,$key);
                 if (exists($stucounted{$key.':'.$sec})) {                  if ($status eq 'active') {
                     next;                      if (exists($stucounted{$key.':'.$sec})) {
                           next;
                       }
                 }                  }
             }                  if (($end == 0) || ($end > $start)) {
             if (($end == 0) || ($end > $start)) {                      if ($start <= $now) {
                 if ($start <= $now) {                          if ($end && $end < $now) {
                     if ($end && $end < $now) {                              if ($rolechgtime > 0) {
                         if ($rolechgtime > 0) {                                  if ($end > $rolechgtime) {
                             if ($end > $rolechgtime) {                                      $userstatus = 'previous';
                                   }
                               } else {
                                 $userstatus = 'previous';                                  $userstatus = 'previous';
                             }                              }
                         } else {                          } else {
                             $userstatus = 'previous';                              if ($rolechgtime > 0) {
                         }                                  if ($start >= $rolechgtime) {
                     } else {                                      $userstatus = 'active';
                         if ($rolechgtime > 0) {                                  }
                             if ($start >= $rolechgtime) {                              } else {
                                 $userstatus = 'active';                                  $userstatus = 'active';
                             }                              }
                         } else {  
                             $userstatus = 'active';  
                         }                          }
                     }                      }
                 }                  }
                   next if ($userstatus ne $status);
                   if ($status eq 'active') {
                       $eventtime = $start;
                   } else {
                       $eventtime = $end;
                   }
                   if (($viewablesec ne '') && ($sec ne '')) {
                       next if ($viewablesec ne $sec);
                   }
                   my %chginfo = (
                                   'section' => $sec,
                                   'uname'   => $stuname,
                                   'udom'    => $studom,
                                   'role'    => 'st', 
                                   'status'  => $userstatus,
                                 );
                   $rolechgcount ++;
                   push(@{$rolechgs->{$eventtime}},\%chginfo);
             }              }
             next if ($userstatus ne $status);  
             if ($status eq 'active') {  
                 $eventtime = $start;  
             } else {  
                 $eventtime = $end;  
             }  
             if (($viewablesec ne '') && ($sec ne '')) {  
                 next if ($viewablesec ne $sec);  
             }  
             my %chginfo = (  
                             'section' => $sec,  
                             'uname'   => $stuname,  
                             'udom'    => $studom,  
                             'role'    => 'st',   
                             'status'  => $userstatus,  
                           );  
             $rolechgcount ++;  
             push (@{$rolechgs->{$eventtime}},\%chginfo);  
         }          }
     }      }
     my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,      my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,
Line 1411  sub getrolechanges { Line 1542  sub getrolechanges {
     return $rolechgcount;      return $rolechgcount;
 }  }
   
   sub getloggedin {
       my ($cdom,$crs,$lastlogins,$starttime) = @_;
       my $context = 'course';
       my ($permission,$allowed) =
           &Apache::lonuserutils::get_permission($context);
       my $viewablesec = &Apache::lonuserutils::viewable_section($permission);
       my %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$crs);
       my $logincount = 0;
       my ($tmp) = keys(%crslogins);
       unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
           if (keys(%crslogins) > 0) {
               foreach my $key (keys(%crslogins)) {
                   my ($uname,$udom,$section,$role) = split(/:/,$key);
                   my $eventtime = $crslogins{$key};
                   if ($eventtime > $starttime) {
                       if (($viewablesec ne '') && ($section ne '')) {
                           next if ($viewablesec ne $section);
                       }
                       my %chginfo = (
                                      'section' => $section,
                                      'uname'   => $uname,
                                      'udom'    => $udom,
                                      'role'    => $role,
                       );
                       $logincount ++;
                       push (@{$lastlogins->{$eventtime}},\%chginfo);
                   }
               }
           }
       }
       return $logincount;
   }
   
 sub checkversions {  sub checkversions {
     my ($cdom,$crs,$navmap,$changed,$starttime) = @_;      my ($cdom,$crs,$navmap,$changed,$starttime) = @_;
     my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs);      my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs);
Line 1427  sub checkversions { Line 1591  sub checkversions {
                                                      'lastrevisiondate');                                                       'lastrevisiondate');
                     $revdate =  &Apache::lonlocal::locallocaltime($revdate);                      $revdate =  &Apache::lonlocal::locallocaltime($revdate);
                     my $linkurl=&Apache::lonnet::clutter($key);                      my $linkurl=&Apache::lonnet::clutter($key);
                     my $usedversion=$navmap->usedVersion('version_'.$linkurl);                      my $usedversion=$navmap->usedVersion($linkurl);
                     my @resources = $navmap->getResourceByUrl($linkurl,1);                      my @resources = $navmap->getResourceByUrl($linkurl,1);
                     if (($usedversion) && ($usedversion ne 'mostrecent')) {                      if (($usedversion) && ($usedversion ne 'mostrecent')) {
                         $version = $usedversion;                               $version = $usedversion;     
Line 1466  sub display_handgrade { Line 1630  sub display_handgrade {
         foreach my $res (@{$tograde}) {          foreach my $res (@{$tograde}) {
             $rowNum ++;              $rowNum ++;
             my $css_class = $rowNum%2?' class="LC_odd_row"':'';              my $css_class = $rowNum%2?' class="LC_odd_row"':'';
             my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);              my $linkurl='/adm/grades';
             my $linkurl=&Apache::lonnet::clutter($url);  
             $linkurl .= '?symb='.&escape($res);  
             if ($$ungraded{$res}{'enclink'}) {              if ($$ungraded{$res}{'enclink'}) {
                 $linkurl =                   $linkurl.='?symb='.$$ungraded{$res}{'encsymb'};
                     $$ungraded{$res}{'enclink'}.'?symb='.$$ungraded{$res}{'encsymb'};              } else {
             }                   $linkurl.='?symb='.&escape($res);
               }
               $linkurl.='&amp;command=ungraded';
             $r->print('<tr'.$css_class.'><td><a href="'.$linkurl.'">'.$$ungraded{$res}{title}.'</a></td><td class="LC_right_item">'.$$ungraded{$res}{count}.'</td></tr>');              $r->print('<tr'.$css_class.'><td><a href="'.$linkurl.'">'.$$ungraded{$res}{title}.'</a></td><td class="LC_right_item">'.$$ungraded{$res}{count}.'</td></tr>');
         }          }
     } elsif ($itemserror) {      } elsif ($itemserror) {
Line 1525  sub display_abovethreshold { Line 1689  sub display_abovethreshold {
     );      );
     if (@{$warnings} > 0) {      if (@{$warnings} > 0) {
         @{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};          @{$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="refpage" value="'.$refpage.'" />'.  
                 "\n");  
         $r->print('<tr class="LC_info_row">'.          $r->print('<tr class="LC_info_row">'.
   '<td class="LC_left_item">'.$lt{'reso'}.'</td>'.    '<td class="LC_left_item">'.$lt{'reso'}.
                     '<input type="hidden" name="command" value="" /></td>'.
   '<td>'.$lt{'part'}.'</td><td>'.$lt{'nust'}.'</td>'.    '<td>'.$lt{'part'}.'</td><td>'.$lt{'nust'}.'</td>'.
   '<td>'.$lt{'avat'}.'</td><td>'.$lt{'dedi'}.'</td>'.    '<td>'.$lt{'avat'}.'</td><td>'.$lt{'dedi'}.'</td>'.
   '<td>'.$lt{'lare'}.'</td><td  class="LC_right_item">'.    '<td>'.$lt{'lare'}.'</td><td  class="LC_right_item">'.
Line 1560  sub display_abovethreshold { Line 1721  sub display_abovethreshold {
             if (ref($$triggered{$res}{text}) eq 'ARRAY') {              if (ref($$triggered{$res}{text}) eq 'ARRAY') {
                 if (@{$$triggered{$res}{text}} > 1) {                  if (@{$$triggered{$res}{text}} > 1) {
                     for (my $i=1; $i<@{$$triggered{$res}{text}}; $i++) {                      for (my $i=1; $i<@{$$triggered{$res}{text}}; $i++) {
                         $r->print('<tr class="'.$css_class.'">'.                          $r->print('<tr '.$css_class.'>'.
                                   $$triggered{$res}{text}[$i].'</tr>');                                    $$triggered{$res}{text}[$i].'</tr>');
                     }                      }
                 }                  }
             }              }
         }          }
         $r->print('<tr class="LC_info_row"><td colspan="7" class="LC_right_item"><br /><input type="submit" name="counters" value="'.$lt{'rese'}.'" /></td></tr></form>');          $r->print('<tr class="LC_info_row"><td colspan="7" class="LC_right_item"><br /><input type="button" name="counters" value="'.$lt{'rese'}.'" onclick="javascript:thresholdreset();" /></td></tr>');
     } elsif ($itemserror) {      } elsif ($itemserror) {
         $r->print('<tr class="LC_empty_row"><td>'.$itemserror.'</td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.$itemserror.'</td></tr>');
     } else {      } else {
Line 1612  sub display_versionchanges { Line 1773  sub display_versionchanges {
 }  }
   
 sub display_rolechanges {  sub display_rolechanges {
     my ($r,$chgcount,$changed,$interval,$crstype) = @_;      my ($r,$chgcount,$changed,$interval,$crstype,$classlist) = @_;
     my $now = time();      my $now = time();
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'user'  => 'User',          'user'  => 'User',
Line 1631  sub display_rolechanges { Line 1792  sub display_rolechanges {
         if (ref($changed) eq 'HASH') {          if (ref($changed) eq 'HASH') {
             my @changes = sort { $b <=> $a } (keys(%{$changed}));              my @changes = sort { $b <=> $a } (keys(%{$changed}));
             my $changenum = 0;              my $changenum = 0;
               my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
             foreach my $item (@changes) {              foreach my $item (@changes) {
                 if (ref($changed->{$item}) eq 'ARRAY') {                  if (ref($changed->{$item}) eq 'ARRAY') {
                     foreach my $chg (@{$changed->{$item}}) {                      foreach my $chg (@{$changed->{$item}}) {
Line 1648  sub display_rolechanges { Line 1810  sub display_rolechanges {
                             my $udom = $chg->{'udom'};                              my $udom = $chg->{'udom'};
                             $changenum ++;                              $changenum ++;
                             my $css_class = $changenum%2?' class="LC_odd_row"':'';                              my $css_class = $changenum%2?' class="LC_odd_row"':'';
                               my $fullname;
                               if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {
                                   $fullname = $classlist->{$uname.':'.$udom}->[$fullnameidx];
                               } else {
                                   $fullname = &Apache::loncommon::plainname($uname,$udom,'lastname');
                               }
                             my $link =                               my $link = 
                                 &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom);                                  &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
                             $r->print('<tr'.$css_class.'>'.                              $r->print('<tr'.$css_class.'>'.
                                       '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.                                        '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.
                                       '<td>'.$link.'</td>'.                                        '<td>'.$link.'</td>'.
Line 1667  sub display_rolechanges { Line 1835  sub display_rolechanges {
     }      }
     return;      return;
 }  }
   
   sub display_crslogins {
       my ($r,$logincount,$loggedin,$interval,$crstype,$classlist) = @_;
       return unless (ref($classlist) eq 'HASH');
       my %lt = &Apache::lonlocal::texthash(
           'user'   => 'User',
           'role'   => 'Role',
           'sec'    => 'Section',
           'number' => 'Total number of logins',
       );
       if ($logincount) {
   
           my $hdr = '<tr class="LC_info_row" style="display:none" id="logintitledet">'.
                     '<td class="LC_left_item">'.$lt{'user'}.'</td>'.
                     '<td class="LC_left_item">'.$lt{'role'}.'</td>'.
                     '<td class="LC_left_item">'.$lt{'sec'}.'</td></tr>'.
                     '<tr class="LC_info_row" id="logintitlesum">'.
                     '<td class="LC_left_item">'.$lt{'number'}.'</td>'.
                     '<td class="LC_left_item">'.$lt{'role'}.'</td>'.
                     '<td class="LC_left_item">'.$lt{'sec'};
           my (%bylastname,%counts);
           if (ref($loggedin) eq 'HASH') {
               my @logins = sort { $b <=> $a } (keys(%{$loggedin}));
               my $numlogin = 0;
               my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
               foreach my $item (@logins) {
                   if (ref($loggedin->{$item}) eq 'ARRAY') {
                       foreach my $user (@{$loggedin->{$item}}) {
                           if (ref($user) eq 'HASH') {
                               my $section;
                               my $role =
                                   &Apache::lonnet::plaintext($user->{'role'},$crstype);
                               my $status = &mt($user->{'status'});
                               if ($user->{'section'} eq '') {
                                   $section = &mt('none');
                               } else {
                                   $section = $user->{'section'};
                               }
                               $counts{$user->{'role'}}{$section} ++;
                               my $uname = $user->{'uname'};
                               my $udom = $user->{'udom'};
                               my $fullname;
                               if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {
                                   $fullname = $classlist->{$uname.':'.$udom}->[$fullnameidx];
                               } else {
                                   $fullname = &Apache::loncommon::plainname($uname,$udom,'lastname');
                               }
                               my $link =
                                   &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
                               push(@{$bylastname{$fullname}},
                                                             '<td>'.$link.'</td>'.
                                                             '<td>'.$role.'</td>'.
                                                             '<td>'.$section.'</td>');
                           }
                       }
                   }
               }
               my $table;
               foreach my $person (sort(keys(%bylastname))) {
                   if (ref($bylastname{$person}) eq 'ARRAY') {
                       foreach my $item (@{$bylastname{$person}}) {
                           $numlogin ++;
                           my $css_class = $numlogin%2?' class="LC_odd_row"':'';
                           $table .= '<tr'.$css_class.' style="display:none;"  id="logindet_'.$numlogin.'">'.$item.'</tr>';
                       }
                   }
               }
               my $numrow = 0;
               foreach my $role (sort(keys(%counts))) {
                   my $showrole = &Apache::lonnet::plaintext($role,$crstype);
                   if (ref($counts{$role}) eq 'HASH') {
                       foreach my $sec (sort { $b <=> $a } (keys(%{$counts{$role}}))) {
                           $numrow ++;
                           my $css_class = $numrow%2?' class="LC_odd_row"':'';
                           $table .= '<tr '.$css_class.' id="loginsum_'.$numrow.'">'.
                                     '<td>'.$counts{$role}{$sec}.'</td>'.
                                     '<td>'.$showrole.'</td>'.
                                     '<td>'.$sec.'</td></tr>';
                      }
                   }
               }
               $r->print($hdr.'<input type="hidden" name="logincount" value="'.$numlogin.
                         '" /><input type="hidden" name="loginrow" value="'.$numrow.
                         '" /></td></tr>'.$table);
           }
       } else {
           $r->print('<tr class="LC_empty_row"><td>'.
                     &mt('There are no '.$interval).
                     '<input type="hidden" name="logincount" value="'.$logincount.
                     '." /></td></tr>');
       }
       return;
   }
     
 sub display_coursediscussion {  sub display_coursediscussion {
     my ($r,$newdiscussions,$unread,$countunread,$res_title,$itemserror) = @_;      my ($r,$newdiscussions,$unread,$countunread,$res_title,$itemserror) = @_;
Line 1697  sub display_coursediscussion { Line 1958  sub display_coursediscussion {
             my $forum_title = $$unread{$ressymb}{'title'};              my $forum_title = $$unread{$ressymb}{'title'};
             my $type = 'Resource';              my $type = 'Resource';
             my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);              my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
             my $disclink = $feedurl.'?symb='.$$unread{$ressymb}{symb};              my $disclink = $feedurl.'?symb='. &escape($$unread{$ressymb}{symb});
             if ($feedurl =~ /bulletinboard/) {              if ($feedurl =~ /bulletinboard/) {
                 $type = 'Discussion Board';                  $type = 'Discussion Board';
             }              }
Line 1828  sub store_interval_setting { Line 2089  sub store_interval_setting {
             $interval_settings{$cid.':oldroleinterval'} = $env{'form.interval'};              $interval_settings{$cid.':oldroleinterval'} = $env{'form.interval'};
         } elsif ($context eq 'newroles') {          } elsif ($context eq 'newroles') {
             $interval_settings{$cid.':newroleinterval'} = $env{'form.interval'};              $interval_settings{$cid.':newroleinterval'} = $env{'form.interval'};
           } elsif ($context eq 'crslogin') {
               $interval_settings{$cid.':crslogininterval'} = $env{'form.interval'};
         } else {          } else {
             $interval_settings{$cid.':interval'} = $env{'form.interval'};              $interval_settings{$cid.':interval'} = $env{'form.interval'};
         }          }
Line 1835  sub store_interval_setting { Line 2098  sub store_interval_setting {
                                              \%interval_settings,$udom,$uname);                                               \%interval_settings,$udom,$uname);
         if ($outcome eq 'ok') {          if ($outcome eq 'ok') {
             if (ref($interval_titles->{$context}) eq 'HASH') {              if (ref($interval_titles->{$context}) eq 'HASH') {
                 $result = &mt('New filter setting: [_1].','<b>'.                   $result = &Apache::lonhtmlcommon::confirm_success(&mt('New filter setting: [_1].','<b>'. 
                               $interval_titles->{$context}->{$env{'form.interval'}}.'</b>').'<br />';                                $interval_titles->{$context}->{$env{'form.interval'}}.'</b>').'<br />');
             }              }
         } else {          } else {
     my $lctype = lc(&Apache::loncommon::course_type());      my $lctype = lc(&Apache::loncommon::course_type());
             &Apache::lonnet::logthis('Error saving whatsnew '.$context.' interval setting'.              &Apache::lonnet::logthis('Error saving whatsnew '.$context.' interval setting'.
                 ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);                  ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
             $result = &mt('Unable to set interval to [_1] due to [_2].',              $result = &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set interval to [_1] due to [_2].',
                          '<b>'.$interval_titles->{$context}->{$env{'form.interval'}}.'</b>',                           '<b>'.$interval_titles->{$context}->{$env{'form.interval'}}.'</b>',
                          '<tt>'.$outcome.'</tt>.<br />');                           '<tt>'.$outcome.'</tt>'),1);
         }          }
     }      }
     return $result;      return &Apache::loncommon::confirmwrapper($result);
 }  }
   
 sub store_discussion_setting {  sub store_discussion_setting {
Line 1859  sub store_discussion_setting { Line 2122  sub store_discussion_setting {
         my $outcome = &Apache::lonnet::put('nohist_whatsnew',          my $outcome = &Apache::lonnet::put('nohist_whatsnew',
                                              \%discussion_settings,$udom,$uname);                                               \%discussion_settings,$udom,$uname);
         if ($outcome eq 'ok') {          if ($outcome eq 'ok') {
             $result = &mt('Count unread posts in discussions display set to [_1]',              $result = &Apache::lonhtmlcommon::confirm_success(&mt('Count unread posts in discussions display set to [_1]',
                   '<b>'.&mt($env{'form.countunread'}).'</b>').'<br />';                    '<b>'.&mt($env{'form.countunread'}).'</b>').'<br />');
                                                                                                                                                                       
         } else {          } else {
     my $lctype = lc(&Apache::loncommon::course_type());      my $lctype = lc(&Apache::loncommon::course_type());
             &Apache::lonnet::logthis('Error saving whatsnew countunread setting'.              &Apache::lonnet::logthis('Error saving whatsnew countunread setting'.
                 ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);                  ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
             $result = &mt('Unable to set "number unread posts display" to [_1]'.              $result = &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set "number unread posts display" to [_1]'.
                           ' due to [_2].',                            ' due to [_2].',
                          '<b>'.&mt($env{'form.countunread'}).'</b>',                           '<b>'.&mt($env{'form.countunread'}).'</b>',
                          '<tt>'.$outcome.'</tt>.<br />');                           '<tt>'.$outcome.'</tt>'),1);
         }          }
     }      }
     return $result;      return &Apache::loncommon::confirmwrapper($result);
 }  }
   
 sub store_courseinit_setting {  sub store_courseinit_setting {
Line 1897  sub store_courseinit_setting { Line 2160  sub store_courseinit_setting {
                                            \%courseinit_settings,$udom,$uname);                                             \%courseinit_settings,$udom,$uname);
             if ($outcome eq 'ok') {              if ($outcome eq 'ok') {
                 if ($page_control eq 'global preferences') {                  if ($page_control eq 'global preferences') {
                     $result = &mt("Page displayed after role selection in $lctype now set by [_1]user's global preferences[_2].",'<b>','</b>');                      $result = &Apache::lonhtmlcommon::confirm_success(&mt("Page displayed after role selection in $lctype now set by [_1]user's global preferences[_2].",'<b>','</b>'));
                 } else {                  } else {
                     $result = &mt('Page displayed after role selection in this '.$lctype.' set to [_1].'                      $result = &Apache::lonhtmlcommon::confirm_success(&mt('Page displayed after role selection in this '.$lctype.' set to [_1].'
                                  ,'<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>');                                   ,'<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>'));
                 }                  }
             } else {              } else {
                 &Apache::lonnet::logthis('Error saving whatsnew courseinit '.                  &Apache::lonnet::logthis('Error saving whatsnew courseinit '.
                                          'setting: '.$outcome.' for '.$uname.                                           'setting: '.$outcome.' for '.$uname.
                                          ':'.$udom.' in '.$lctype.' '.$cid);                                           ':'.$udom.' in '.$lctype.' '.$cid);
                 if ($page_control eq 'global preferences') {                  if ($page_control eq 'global preferences') {
                     $result = &mt('Unable to set control of page display to [_1]'.                      $result = &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set control of page display to [_1]'.
                           ' due to [_2].',                            ' due to [_2].',
                          '<b>'.$page_control.'</b>',                           '<b>'.$page_control.'</b>',
                          '<tt>'.$outcome.'</tt>.<br />');                           '<tt>'.$outcome.'</tt>'),1);
                 } else {                  } else {
                     $result = &mt('Unable to set page display, after role selection, for this '.$lctype.' to [_1] due to [_2].'                      $result = &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set page display, after role selection, for this '.$lctype.' to [_1] due to [_2].'
                                  ,'<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>'                                   ,'<b>'.$$initpage{$env{'form.courseinit_page'}}.'</b>'
                                  ,'<tt>'.$outcome.'</tt>')                                   ,'<tt>'.$outcome.'</tt>'),1);
                              .'<br />';  
                 }                  }
             }              }
         }          }
     }      }
     return $result;      return &Apache::loncommon::confirmwrapper($result);
 }  }
   
 sub start_box {  sub start_box {
Line 1952  sub start_box { Line 2214  sub start_box {
          if ($$show{$caller}) {           if ($$show{$caller}) {
              $r->print('               $r->print('
               <tr>                <tr>
                 <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgthreshold&refpage='.$refpage.'">'.$lt{'chth'}.'</a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgthreshold&amp;refpage='.$refpage.'">'.$lt{'chth'}.'</a></td>
               </tr>');                </tr>');
          }           }
      } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {       } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {
          if ($$show{$caller}) {           if ($$show{$caller}) {
              $r->print('               $r->print('
               <tr>                <tr>
                 <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chginterval&refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chginterval&amp;refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>
               </tr>');                </tr>');
          }           }
      } elsif ($caller eq 'coursediscussion') {       } elsif ($caller eq 'coursediscussion') {
          if ($$show{$caller}) {           if ($$show{$caller}) {
              $r->print('               $r->print('
               <tr>                <tr>
                 <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgdisc&refpage='.$refpage.'">'.$lt{'chop'}.'</a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgdisc&amp;refpage='.$refpage.'">'.$lt{'chop'}.'</a></td>
               </tr>');                </tr>');
          }           }
      } elsif (($caller eq 'newroles') && ($$show{$caller})) {       } elsif (($caller eq 'newroles') && ($$show{$caller})) {
          if ($$show{$caller}) {           if ($$show{$caller}) {
              $r->print('               $r->print('
               <tr>                <tr>
                 <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgnewroleinterval&refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgnewroleinterval&amp;refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>
               </tr>');                </tr>');
          }           }
      } elsif (($caller eq 'oldroles') && ($$show{$caller})) {       } elsif (($caller eq 'oldroles') && ($$show{$caller})) {
          if ($$show{$caller}) {           if ($$show{$caller}) {
              $r->print('               $r->print('
               <tr>                <tr>
                 <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgoldroleinterval&refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgoldroleinterval&amp;refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>
               </tr>');                </tr>');
          }           }
      }      } elsif (($caller eq 'crslogin') && ($$show{$caller})) {
           if ($$show{$caller}) {
               $r->print('
                 <tr>
                   <td class="LC_subheader" align="left"><span class="LC_nobreak"><label><input type="radio" name="logindetails" value="0" checked="checked" onclick="javascript:togglelogins();" />&nbsp;'.&mt('Summary').'</label><label><input type="radio" name="logindetails" value="1" onclick="javascript:togglelogins();" />&nbsp;'.&mt('Details').'</label></span></td><td class="LC_subheader"><a href="/adm/whatsnew?command=chgcrslogininterval&amp;refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>
                 </tr>');
           }
       }
   
     $r->print('      $r->print('
               <tr>                <tr>
                <td colspan="2">                 <td colspan="2">

Removed from v.1.86  
changed lines
  Added in v.1.118


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.