--- loncom/interface/lonwhatsnew.pm 2009/12/14 22:24:31 1.98.2.1 +++ loncom/interface/lonwhatsnew.pm 2010/08/09 23:39:43 1.98.2.2 @@ -1,5 +1,5 @@ # -# $Id: lonwhatsnew.pm,v 1.98.2.1 2009/12/14 22:24:31 raeburn Exp $ +# $Id: lonwhatsnew.pm,v 1.98.2.2 2010/08/09 23:39:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -72,6 +72,7 @@ sub handler { ['mdc','versionchanges',0], ['vcl','newroles',1], ['vcl','oldroles',1], + ['whn','crslogin',1], ) { my ($perm,$key,$check_section) = @{ $perm_check }; my $scope = $env{'request.course.id'}; @@ -143,6 +144,13 @@ sub handler { $r->print(&Apache::lonhtmlcommon::breadcrumbs ("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 { $r->print(&Apache::lonhtmlcommon::breadcrumbs ("What's New?",#'Course_Action_Items_Display' @@ -188,10 +196,17 @@ sub display_main_box { 604800 => 'roles which expired since last week', 86400 => 'roles which expired since yesterday', ); + my %crslogins = ( + -1 => 'last login for anyone who has ever logged in', + 2592000 => 'last login for users in last 30 days', + 604800 => 'last login for users in last 7 days', + 86400 => 'last login for users in last 24 hours', + ); my %interval_titles = ( versions => \%versions, newroles => \%newroles, oldroles => \%oldroles, + crslogin => \%crslogins, ); my %initpage = &Apache::lonlocal::texthash ( firstres => "first resource in the $lctype", @@ -220,6 +235,9 @@ sub display_main_box { } elsif (($command eq 'chgoldroleinterval') && $checkallowed->{'oldroles'}) { &display_interval_config($r,$refpage,\%interval_titles,'oldroles'); + } elsif (($command eq 'chgcrslogininterval') + && $checkallowed->{'crslogin'}) { + &display_interval_config($r,$refpage,\%interval_titles,'crslogin'); } else { &display_actions_box($r,$command,$refpage,\%threshold_titles, \%interval_titles,\%initpage,$cdom,$crs,$checkallowed); @@ -245,7 +263,8 @@ sub display_header { my $scripttag; unless ($command eq 'chgthreshold' || $command eq 'chginterval' || - $command eq 'chgoldroleinterval' || $command eq 'chgnewroleinterval') { + $command eq 'chgoldroleinterval' || + $command eq 'chgnewroleinterval' || $command eq 'chgcrslogininterval') { $scripttag = <<"END"; '; } @@ -316,6 +380,8 @@ sub display_actions_box { my %expired; my $activecount; my %activated; + my %loggedin; + my $logincount; my %res_title = (); my %show = (); my $needitems = 0; @@ -448,6 +514,20 @@ sub display_actions_box { $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since yesterday'); } + $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 = time; if ($timediff{'versions'} == -1) { $timediff{'versions'} = time; @@ -462,8 +542,15 @@ sub display_actions_box { if ($timediff{'oldroles'} == -1) { $timediff{'oldroles'} = time; } + my $expiredstart = $now - $timediff{'oldroles'}; + if ($timediff{'crslogin'} == -1) { + $timediff{'crslogin'} = time; + } + + my $crsloginstart = $now - $timediff{'crslogin'}; + my $countunread = $display_settings{$cid.':countunread'}; unless (defined($countunread)) { $countunread = 'on'; @@ -479,7 +566,7 @@ sub display_actions_box { my @actionorder; if ($custommenu) { - @actionorder = ('coursenormalmail','coursecritmail','newroles','oldroles'); + @actionorder = ('coursenormalmail','coursecritmail','newroles','oldroles','crslogin'); } else { @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles'); } @@ -520,6 +607,10 @@ sub display_actions_box { if ($show{'newroles'}) { $activecount = &getactivated(\%activated,$activatedstart,'active'); } + if ($show{'crslogin'}) { + $logincount = &getloggedin($cdom,$crs,\%loggedin,$crsloginstart); + } + $r->print(qq|$lt{'hial'} $lt{'shal'}
');
+ $r->print('
'.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' expired.').' '); } elsif ($context eq 'newroles') { $r->print(' '.&mt('Choose the time window to use to display roles for which access to the '.$lctype.' became available.').' '); + } elsif ($context eq 'crslogin') { + $r->print(' '.&mt('Choose the time window to use to display the last login by a user in the '.$lctype).' '); } else { $r->print(' '.&mt('Choose the time window to use to display resources in the '.$lctype.' with version changes.').' '); } @@ -804,7 +897,7 @@ sub display_launcher { $tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered, $newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs, $interval,$countunread,$expired,$expirecount,$activated,$activecount, - $crstype,$itemserror) = @_; + $crstype,$itemserror,$loggedin,$logincount) = @_; if ($$checkallowed{$action}) { &start_box($r,$show,$headings,$action,$refpage,$action); @@ -831,6 +924,10 @@ sub display_launcher { } elsif ($action eq 'oldroles') { # EXPIRED ROLES &display_rolechanges($r,$expirecount,$expired,$interval->{'oldroles'}, $crstype); + } elsif ($action eq 'crslogin') { #LAST LOGIN + &display_crslogins($r,$logincount,$loggedin,$interval->{'crslogin'}, + $crstype); + } } &end_box($r); @@ -1428,6 +1525,39 @@ sub getrolechanges { 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 { my ($cdom,$crs,$navmap,$changed,$starttime) = @_; my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs); @@ -1684,6 +1814,90 @@ sub display_rolechanges { } return; } + +sub display_crslogins { + my ($r,$logincount,$loggedin,$interval,$crstype) = @_; + my %lt = &Apache::lonlocal::texthash( + 'user' => 'User', + 'role' => 'Role', + 'sec' => 'Section', + 'number' => 'Total number of logins', + ); + if ($logincount) { + $r->print(' | |||
'.$lt{'number'}.' | '. + ''.$lt{'role'}.' | '. + ''.$lt{'sec'}.' | '.$link.' | '. + ''.$role.' | '. + ''.$section.' | '); + } + } + } + } + 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"':''; + $r->print(' '); + } + } + } + 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"':''; + $r->print('
'.$counts{$role}{$sec}.' | '. + ''.$showrole.' | '. + ''.$sec.' | |
'. + &mt('There are no '.$interval). + ' | '.$lt{'chin'}.' | '); } + } elsif (($caller eq 'crslogin') && ($$show{$caller})) { + if ($$show{$caller}) { + $r->print(' +||
'.$lt{'chin'}.' | +|||