--- loncom/interface/lonwhatsnew.pm 2007/03/02 20:58:32 1.69
+++ loncom/interface/lonwhatsnew.pm 2010/09/19 15:05:59 1.98.2.4
@@ -1,5 +1,5 @@
#
-# $Id: lonwhatsnew.pm,v 1.69 2007/03/02 20:58:32 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.98.2.4 2010/09/19 15:05:59 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,11 +36,13 @@ use Apache::lonlocal;
use Apache::loncoursedata();
use Apache::lonnavmaps();
use Apache::lonuserstate;
+use Apache::lonuserutils;
use Apache::Constants qw(:common :http);
use Time::Local;
use GDBM_File;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
+use HTML::Entities;
#----------------------------
# handler
@@ -68,6 +70,9 @@ sub handler {
['vgr','abovethreshold',1],
['opa','haserrors',1],
['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'};
@@ -96,35 +101,56 @@ sub handler {
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb
({href=>'/adm/whatsnew',
- text=>"Display Action Items"});
+ text=>"What's New?"});
if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
+ ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
text=>"Change thresholds"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Thresholds'
));
} elsif (($command eq 'chginterval') && $checkallowed{'versionchanges'} ) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
+ ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
text=>"Change interval"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Intervals'
));
} elsif (($command eq 'chgdisc') && $checkallowed{'coursediscussion'}) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
+ ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
text=>"Change discussion display"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Intervals'
));
} elsif ($command eq 'courseinit') {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/whatsnew?command=courseinit&refpage='.$refpage,
+ ({href=>'/adm/whatsnew?command=courseinit&refpage='.$refpage,
text=>"Course initialization preference"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Initialization'
));
+ } elsif ($command eq 'chgoldroleinterval' && $checkallowed{'oldroles'}) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chgoldroleinterval&refpage='.$refpage,
+ text=>"Change interval"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ ("What's New?",#'Course_Action_Items_Intervals'
+ ));
+ } elsif ($command eq 'chgnewroleinterval' && $checkallowed{'newroles'}) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chgnewroleinterval&refpage='.$refpage,
+ text=>"Change interval"});
+ $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'
@@ -152,17 +178,39 @@ sub display_main_box {
degdiff => 'Degree of difficulty',
numstudents => 'Total number of students with submissions',
);
-
- my %interval_titles = &Apache::lonlocal::texthash (
- -1 => "since start of $lctype",
- 2592000 => 'since last month',
- 604800 => 'since last week',
- 86400 => 'since yesterday',
+ my %versions = (
+ -1 => "version changes since start of $lctype",
+ 2592000 => 'version changes since last month',
+ 604800 => 'version changes since last week',
+ 86400 => 'version changes since yesterday',
+ );
+ my %newroles = (
+ -1 => "roles which have become active since start of $lctype",
+ 2592000 => 'roles which have become active since last month',
+ 604800 => 'roles which have become active since last week',
+ 86400 => 'roles which have become active since yesterday',
+ );
+ my %oldroles = (
+ -1 => "roles which expired since start of $lctype",
+ 2592000 => 'roles which expired since last month',
+ 604800 => 'roles which expired since last week',
+ 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 = (
+ versions => \%versions,
+ newroles => \%newroles,
+ oldroles => \%oldroles,
+ crslogin => \%crslogins,
);
-
my %initpage = &Apache::lonlocal::texthash (
firstres => "first resource in the $lctype",
- whatsnew => "what's new? page",
+ whatsnew => "What's New Page",
userpref => 'your general user preferences',
coursespecific => "specific setting for this $lctype",
);
@@ -175,12 +223,21 @@ sub display_main_box {
$cdom,$crs);
} elsif (($command eq 'chginterval')
&& $checkallowed->{'versionchanges'}) {
- &display_interval_config($r,$refpage,\%interval_titles);
+ &display_interval_config($r,$refpage,\%interval_titles,'versions');
} elsif (($command eq 'chgdisc')
&& $checkallowed->{'coursediscussion'}) {
&display_discussion_config($r,$refpage);
} elsif ($command eq 'courseinit') {
&courseinit_config($r,$refpage,\%initpage);
+ } elsif (($command eq 'chgnewroleinterval')
+ && $checkallowed->{'newroles'}) {
+ &display_interval_config($r,$refpage,\%interval_titles,'newroles');
+ } 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);
@@ -205,12 +262,15 @@ sub display_header {
my ($command,$checkallowed) = @_;
my $scripttag;
- unless ($command eq 'chgthreshold' || $command eq 'chginterval') {
+ unless ($command eq 'chgthreshold' || $command eq 'chginterval' ||
+ $command eq 'chgoldroleinterval' ||
+ $command eq 'chgnewroleinterval' || $command eq 'chgcrslogininterval') {
$scripttag = <<"END";
';
}
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);
}
@@ -242,6 +348,7 @@ END
sub display_actions_box {
my ($r,$command,$refpage,$threshold_titles,$interval_titles,$initpage,
$cdom,$crs,$checkallowed) = @_;
+ my $custommenu = &Apache::loncommon::needs_gci_custom();
my $udom = $env{'user.domain'};
my $uname = $env{'user.name'};
my $cid = $env{'request.course.id'};
@@ -249,7 +356,7 @@ sub display_actions_box {
my $lctype = lc($crstype);
my %stulabel = (
'Course' => 'students',
- 'Group' => 'members',
+ 'Community' => 'members',
);
my %lt = &Apache::lonlocal::texthash(
'yacc' => 'You are accessing an invalid course',
@@ -271,7 +378,12 @@ sub display_actions_box {
my @warnings = ();
my $msgcount = 0;
my $critmsgcount = 0;
-
+ my $expirecount;
+ my %expired;
+ my $activecount;
+ my %activated;
+ my %loggedin;
+ my $logincount;
my %res_title = ();
my %show = ();
my $needitems = 0;
@@ -285,7 +397,7 @@ sub display_actions_box {
my %threshold = ();
my %pagedesc = &Apache::lonlocal::texthash (
firstres => 'First resource',
- whatsnew => "What's New? page",
+ whatsnew => "What's New Page",
userpref => 'user preference',
coursespecific => $lctype.' only',
default => 'default',
@@ -295,23 +407,36 @@ sub display_actions_box {
my $currinit = $pagedesc{$initdisp}.' ('.$pagedesc{$initcontrol}.')';
unless ($cid) {
- $r->print('
'.$lt{'yacc'}.' ');
+ $r->print(''.$lt{'yacc'}.'
');
return;
}
- if ($refpage eq 'start') {
+ my $header = '';
+ if (($refpage eq 'start') && (!$custommenu)) {
if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
&GDBM_READER(),0640)) {
- my $furl=$bighash{'first_url'};
+ my $furl=&HTML::Entities::encode($bighash{'first_url'},'"<>&');
untie(%bighash);
- $r->print(''.$lt{'gtfr'}.
- ' ');
+ $header .= ''.$lt{'gtfr'}.
+ ' ';
}
}
- $r->print(&mt('Page set to be displayed after you have selected a role in this '.$lctype).
- '. '.&mt('Currently: [_1] ',$currinit).'. '.
- &mt('Change for just this '.$lctype.' ',$refpage).' '.
- &mt('or for all your courses ',$refpage).' ');
+ unless ($custommenu) {
+ $header .= &mt('Page set to be displayed after you have selected a role in this '.$lctype).'.'
+ .' '
+ .&mt('Currently: [_1].',''.$currinit.' ')
+ .' '
+ .&mt('[_1]Change[_2] for just [_3]this '.$lctype.'[_4] or for [_5]all your courses/communities[_6].'
+ ,''
+ ,' '
+ ,''
+ ,' '
+ ,''
+ ,' ')
+ .' ';
+
+ $r->print(&Apache::loncommon::head_subbox($header));
+ }
if ($command eq 'reset') {
$result = &process_reset($cdom,$crs);
@@ -326,51 +451,131 @@ sub display_actions_box {
my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);
unless ($store_result eq 'ok') {
- &Apache::lonnet::logthis('Error storing whatsnew settings: '.
+ &Apache::lonnet::logthis('Error saving whatsnew settings: '.
$store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
- $result .= &mt('Unable to store visibility settings due to [_1]',
- $store_result);
+ $result .= ''
+ .&mt('Unable to save visibility settings due to [_1]',
+ $store_result)
+ .' ';
}
if ($result) {
- $r->print($result.' ');
+ $r->print($result.' ');
}
$r->rflush();
-
+ my (%timediff,%interval);
my %display_settings = &get_display_settings($uname,$udom,$cid);
- my $timediff = $display_settings{$cid.':interval'};
- unless (defined($timediff)) { $timediff = 604800; }
- my $now = time;
- my $interval = $$interval_titles{$timediff};
- if ($timediff == -1) {
- $timediff = time;
- }
- my $starttime = $now - $timediff;
- my $countunread = $display_settings{$cid.':countunread'};
- unless (defined($countunread)) {
- $countunread = 'on';
- }
+ $timediff{'versions'} = $display_settings{$cid.':interval'};
+ unless (defined($timediff{'versions'})) { $timediff{'versions'} = 604800; }
+ $interval{'versions'} = $interval_titles->{'versions'}->{$timediff{'versions'}};
my %headings = &Apache::lonlocal::texthash(
- coursediscussion => 'Unread '.$lctype.' discussion posts',
- handgrading => 'Problems requiring handgrading',
- haserrors => 'Problems with errors',
- versionchanges => 'Resources in '.$lctype.' with version changes '.$interval,
+ coursediscussion => 'Unread '.$lctype.' discussion posts',
+ handgrading => 'Problems requiring handgrading',
+ haserrors => 'Problems with errors',
coursenormalmail => 'New '.$lctype.' messages',
- coursecritmail => 'New critical messages in '.$lctype,
+ coursecritmail => 'New critical messages in '.$lctype,
);
+ if ($timediff{'versions'} == -1) {
+ $headings{'versionchanges'} = &mt('Resources in '.$lctype.' with version changes since start of '.$lctype);
+ } elsif ($timediff{'versions'} == 2592000) {
+ $headings{'versionchanges'} = &mt('Resources in '.$lctype.' with version changes since last month');
+ } elsif ($timediff{'versions'} == 604800) {
+ $headings{'versionchanges'} = &mt('Resources in '.$lctype.' with version changes since last week');
+ } elsif ($timediff{'versions'} == 86400) {
+ $headings{'versionchanges'} = &mt('Resources in '.$lctype.' with version changes since yesterday');
+ }
+
+ $timediff{'oldroles'} = $display_settings{$cid.':oldroleinterval'};
+ unless (defined($timediff{'oldroles'})) { $timediff{'oldroles'} = 604800; }
+ $interval{'oldroles'} = $interval_titles->{'oldroles'}->{$timediff{'oldroles'}};
+
+ if ($timediff{'oldroles'} == -1) {
+ $headings{'oldroles'} = &mt('Roles for which access to '.$lctype.' has expired since start of '.$lctype);
+ } elsif ($timediff{'oldroles'} == 2592000) {
+ $headings{'oldroles'} = &mt('Roles for which access to '.$lctype.' has expired since last month');
+ } elsif ($timediff{'oldroles'} == 604800) {
+ $headings{'oldroles'} = &mt('Roles for which access to '.$lctype.' has expired since last week');
+ } elsif ($timediff{'oldroles'} == 86400) {
+ $headings{'oldroles'} = &mt('Roles for which access to '.$lctype.' has expired since yesterday');
+ }
+
+ $timediff{'newroles'} = $display_settings{$cid.':newroleinterval'};
+ unless (defined($timediff{'newroles'})) { $timediff{'newroles'} = 604800; }
+ $interval{'newroles'} = $interval_titles->{'newroles'}->{$timediff{'newroles'}};
+
+ if ($timediff{'newroles'} == -1) {
+ $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since start of '.$lctype);
+ } elsif ($timediff{'newroles'} == 2592000) {
+ $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since last month');
+ } elsif ($timediff{'newroles'} == 604800) {
+ $headings{'newroles'} = &mt('Roles for which access to '.$lctype.' has become available since last week');
+ } elsif ($timediff{'newroles'} == 86400) {
+ $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;
+ }
+ my $starttime = $now - $timediff{'versions'};
+
+ if ($timediff{'newroles'} == -1) {
+ $timediff{'newroles'} = time;
+ }
+ my $activatedstart = $now - $timediff{'newroles'};
+
+ 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';
+ }
if ($$checkallowed{'abovethreshold'}) {
- &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
+ &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs,$custommenu);
}
- $headings{'abovethreshold'} =
- &mt('Problems with av. attempts ≥ [_1] or deg. difficulty ≥ [_2] and total number of '.$stulabel{$crstype}.' with submissions ≥ [_3]',
- $threshold{'av_attempts'},$threshold{'degdiff'},
- $threshold{'numstudents'});
+ if ($custommenu) {
+ $headings{'abovethreshold'} = &mt('Questions with submissions');
+ } else {
+ $headings{'abovethreshold'} =
+ &mt('(Problems with av. attempts ≥ [_1] or deg. difficulty ≥ [_2]) [_3] and total number of '.$stulabel{$crstype}.' with submissions ≥ [_4]',
+ $threshold{'av_attempts'},$threshold{'degdiff'},
+ ' ',$threshold{'numstudents'});
+ }
- my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail');
+ my @actionorder;
+ if ($custommenu) {
+ @actionorder = ('coursenormalmail','coursecritmail','abovethreshold','newroles','oldroles','crslogin');
+ } else {
+ @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles');
+ }
foreach my $key (keys(%{$checkallowed})) {
if ($key =~ /_section$/) { next; }
@@ -383,7 +588,8 @@ sub display_actions_box {
}
foreach my $item (@actionorder) {
- unless ($item eq 'coursenormalmail' || $item eq 'coursecritmail') {
+ unless ($item eq 'coursenormalmail' || $item eq 'coursecritmail' ||
+ $item eq 'newroles' || $item eq 'oldroles') {
if ($show{$item}) {
$needitems = 1;
last;
@@ -391,8 +597,9 @@ sub display_actions_box {
}
}
+ my $itemserror;
if ($needitems) {
- &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,$custommenu);
}
if ($show{'coursenormalmail'}) {
$msgcount = &getnormalmail(\@newmsgs);
@@ -400,6 +607,15 @@ sub display_actions_box {
if ($show{'coursecritmail'}) {
$critmsgcount = &getcritmail(\@critmsgs);
}
+ if ($show{'oldroles'}) {
+ $expirecount = &getexpired(\%expired,$expiredstart,'previous');
+ }
+ if ($show{'newroles'}) {
+ $activecount = &getactivated(\%activated,$activatedstart,'active');
+ }
+ if ($show{'crslogin'}) {
+ $logincount = &getloggedin($cdom,$crs,\%loggedin,$crsloginstart);
+ }
$r->print(qq|$lt{'hial'}
$lt{'shal'}
@@ -411,7 +627,11 @@ sub display_actions_box {
}
}
- $r->print('');
+ $r->print(' ');
+ unless($custommenu) {
+ $r->print('');
+ }
+ $r->print('');
my $displayed = 0;
my $totalboxes = 0;
@@ -422,24 +642,28 @@ sub display_actions_box {
$totalboxes ++;
}
}
- my $halfway = int($totalboxes/2) + $totalboxes%2;
+ my $halfway = 4;
+# my $halfway = int($totalboxes/2) + $totalboxes%2;
+ if ($custommenu) {
+ $halfway = 3;
+ }
foreach my $actionitem (@actionorder) {
if ($$checkallowed{$actionitem}) {
if ($displayed == $halfway) {
- $r->print(' ');
+ $r->print(' ');
}
- &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);
+ &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,$custommenu);
$displayed ++;
}
}
$r->print('
-
-
-
-
- ');
+
+');
+ if ($custommenu) {
+ $r->print("\n");
+ }
}
#-------------------------------
@@ -470,9 +694,9 @@ sub display_threshold_config {
$r->print(' ');
@@ -505,28 +729,51 @@ sub display_threshold_config {
#-------------------------------
sub display_interval_config {
- my ($r,$refpage,$interval_titles) = @_;
+ my ($r,$refpage,$interval_titles,$context) = @_;
+ my $setting = 'interval';
+ if ($context eq 'oldroles') {
+ $setting = 'oldroleinterval';
+ } elsif ($context eq 'newroles') {
+ $setting = 'newroleinterval';
+ }
my $lctype = lc(&Apache::loncommon::course_type());
my $current = &get_current($env{'user.name'},$env{'user.domain'},
- $env{'request.course.id'},'interval');
- $r->print(' '.&mt('Choose the time window to use for display of version changes for resources in the '.$lctype.'.'));
+ $env{'request.course.id'},$setting);
+ if ($context eq 'oldroles') {
+ $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.').' ');
+ }
unless ($current eq '') {
- $r->print(' '.&mt('Current value is [_1]',''.
- $$interval_titles{$current}.' .'));
+ if (ref($interval_titles->{$context}) eq 'HASH') {
+ $r->print(' '.&mt('Current value is "[_1]".',''.
+ $interval_titles->{$context}->{$current}.' ').' ');
+ }
}
- $r->print('
+ $r->print('
');
+ &mt('Save').'" />');
return;
}
@@ -549,14 +796,22 @@ sub display_discussion_config {
'off' => 'on',
);
$r->print('');
- $r->print(' '.&mt('Choose whether or not to display a count of the number of new posts for each resource or bulletin board which has unread posts.').' '.&mt('This can increase the time taken to gather data for the [_1] page by a few seconds.',"What's New? ").' '.&mt('Currently set to [_1].',''.$current.' '));
+ $r->print(' '
+ .&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("This can increase the time taken to gather data for the [_1]What's New Page[_2] by a few seconds.",'',' ')
+ .' '
+ .&mt('Currently set to [_1].',''.$current.' .')
+ );
$r->print('
');
@@ -595,7 +850,7 @@ sub courseinit_config {
'anis' => 'and is set to display',
'padc' => 'Page display controlled by',
'chce' => 'Choose '.$lctype.' entry',
- 'moce' => 'Modify '.$lctype.' entry',
+ 'moce' => 'Save',
);
$r->print(<<"END");
$lt{'chwp'}
@@ -612,9 +867,9 @@ END
if ($choice eq $control) {
$chkstring = ' checked="checked" ';
}
- $r->print(' '.$$initpage{$choice}.
- ' ');
+ ' ');
}
$r->print(' '.&mt('If').' '.$$initpage{'coursespecific'}.
' - '.$lt{'chce'}.": \n");
@@ -623,9 +878,9 @@ END
if (($choice eq $current) && ($control eq 'coursespecific')) {
$chkstring = ' checked="checked" ';
}
- $r->print(' '.$$initpage{$choice}.
- ' ');
+ ' ');
}
$r->print(' ');
@@ -656,27 +911,38 @@ sub display_launcher {
my ($r,$action,$refpage,$checkallowed,$show,$headings,$res_title,
$tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered,
$newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs,
- $interval,$countunread) = @_;
+ $interval,$countunread,$expired,$expirecount,$activated,$activecount,
+ $crstype,$itemserror,$loggedin,$logincount,$custommenu) = @_;
if ($$checkallowed{$action}) {
- &start_box($r,$show,$headings,$action,$refpage,$action);
+ &start_box($r,$show,$headings,$action,$refpage,$action,$custommenu);
if ($$show{$action}) {
if ($action eq 'handgrading') { # UNGRADED ITEMS
- &display_handgrade($r,$tograde,$ungraded);
+ &display_handgrade($r,$tograde,$ungraded,$itemserror);
} elsif ($action eq 'haserrors') { # BOMBS
- &display_haserrors($r,$bombs,$bombed,$res_title);
+ &display_haserrors($r,$bombs,$bombed,$res_title,$itemserror);
} elsif ($action eq 'versionchanges') { # VERSION CHANGES
- &display_versionchanges($r,$changed,$res_title,$interval);
+ &display_versionchanges($r,$changed,$res_title,$interval->{'versions'},$itemserror);
} elsif ($action eq 'abovethreshold') { # DEGDIFF/AV. TRIES TRIGGERS
&display_abovethreshold($r,$refpage,$warnings,$triggered,
- $res_title);
+ $res_title,$itemserror,$custommenu);
} elsif ($action eq 'coursediscussion') { # UNREAD COURSE DISCUSSION
&display_coursediscussion($r,$newdiscussions,$unread,
- $countunread,$res_title);
+ $countunread,$res_title,$itemserror);
} elsif ($action eq 'coursenormalmail') { # NORMAL MESSAGES
&display_coursenormalmail($r,$msgcount,$newmsgs);
} elsif ($action eq 'coursecritmail') { # CRITICAL MESSAGES
&display_coursecritmail($r,$critmsgcount,$critmsgs);
+ } elsif ($action eq 'newroles') { # ACTIVATED ROLES
+ &display_rolechanges($r,$activecount,$activated,$interval->{'newroles'},
+ $crstype);
+ } 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);
@@ -687,8 +953,12 @@ sub display_launcher {
sub getitems {
my ($unread,$ungraded,$bombed,$triggered,$changed,$newdiscussions,
$tograde,$bombs,$warnings,$threshold,$cdom,$crs,$res_title,$show,
- $starttime,$countunread) = @_;
+ $starttime,$countunread,$custommenu) = @_;
my $navmap = Apache::lonnavmaps::navmap->new();
+ if (!defined($navmap)) {
+ my $itemserror = ''.&mt('An error occurred retrieving information about the course.').' '.&mt('It is recommended that you [_1]re-select the course[_2].','',' ').' ';
+ return $itemserror;
+ }
# force retrieve Resource to seed the part id cache we'll need it later
my @allres=$navmap->retrieveResources(undef,
sub {if ($_[0]->is_problem) { $_[0]->parts();} return 1;});
@@ -743,10 +1013,11 @@ sub getitems {
# Maxtries and degree of difficulty for problem parts, unless handgradeable
if ($$show{'abovethreshold'}) {
&check_thresholds($resource,$symb,\%resourcetracker,
- $triggered,$threshold,$warnings);
+ $triggered,$threshold,$warnings,$custommenu);
}
}
+ return;
}
sub check_discussions {
@@ -816,7 +1087,7 @@ sub check_bombed {
}
sub check_thresholds {
- my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings) = @_;
+ my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings,$custommenu) = @_;
# Compile maxtries and degree of difficulty for problem parts, unless handgradeable
my @parts = @{$resource->parts()};
my %stats;
@@ -869,17 +1140,22 @@ sub check_thresholds {
my $resettitle = 'title_'.&escape($symb."\0".$part);
if (@parts > 1) {
$$triggered{$symb}{text}[$partcount] = '
- part - '.$part.' ';
+ '.&mt('part - ').$part.' ';
} else {
$$triggered{$symb}{text}[$partcount] = '
- single part ';
+ '.&mt('single part').' ';
+ }
+ if ($custommenu) {
+ $$triggered{$symb}{text}[$partcount] .= '
+ '.$stats{$part}{users}.' ';
+ } else {
+ $$triggered{$symb}{text}[$partcount] .= '
+ '.$stats{$part}{users}.'
+ '.$stats{$part}{attempts}.'
+ '.$stats{$part}{degdiff}.'
+ '.$lastreset{$part}.'
+ ';
}
- $$triggered{$symb}{text}[$partcount] .= '
- '.$stats{$part}{users}.'
- '.$stats{$part}{attempts}.'
- '.$stats{$part}{degdiff}.'
- '.$lastreset{$part}.'
- ';
$partcount ++;
}
$$triggered{$symb}{numparts} = $partcount;
@@ -890,7 +1166,14 @@ sub check_thresholds {
sub get_curr_thresholds {
- my ($threshold,$uname,$udom,$cid,$cdom,$crs) = @_;
+ my ($threshold,$uname,$udom,$cid,$cdom,$crs,$custommenu) = @_;
+ if ($custommenu) {
+ %$threshold = (av_attempts => 0,
+ degdiff => 0.00000000000000,
+ numstudents => 1
+ );
+ return;
+ }
# set default values
%$threshold = (av_attempts => 2,
degdiff => 0.5,
@@ -982,7 +1265,7 @@ sub process_reset {
sub process_update {
my ($uname,$udom,$threshold_titles) = @_;
- my $setoutput = 'Changes to threshold(s) for problem tracking: ';
+ my $setoutput = ''.&mt('Changes to threshold(s) for problem tracking:').' ';
foreach (keys %env) {
next if ($_!~/^form\.(.+)\_setparmval$/);
my $name = $1;
@@ -1019,9 +1302,9 @@ sub getnormalmail {
if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
if (defined($sendtime) && $sendtime!~/error/) {
my $numsendtime = $sendtime;
- $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
if ($status eq 'new') {
- $msgcount ++;
+ $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
+ $msgcount ++;
if ($shortsubj eq '') {
$shortsubj = &mt('No subject');
}
@@ -1069,6 +1352,238 @@ sub getcritmail {
return $critmsgcount;
}
+sub getexpired {
+ my ($rolechgs,$rolechgtime,$status) = @_;
+ my $expirecount = &getrolechanges($rolechgs,$rolechgtime,$status);
+ return $expirecount;
+}
+
+sub getactivated {
+ my ($rolechgs,$rolechgtime,$status) = @_;
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $now = time();
+ my $context = 'course';
+ my ($permission,$allowed) =
+ &Apache::lonuserutils::get_permission($context);
+ my $viewablesec = &Apache::lonuserutils::viewable_section($permission);
+ my %changes=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
+ my (%stucounted,%advcounted);
+ my $activatedcount = 0;
+ if (keys(%changes) > 0) {
+ foreach my $chg (sort { $b <=> $a } (keys(%changes))) {
+ if (ref($changes{$chg}) eq 'HASH') {
+ my $timestamp = $changes{$chg}{'exe_time'};
+ if ($timestamp) {
+ if ($rolechgtime > 0) {
+ if ($timestamp < $rolechgtime) {
+ last;
+ }
+ }
+ 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 $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);
+ if (($viewablesec ne '') && ($section ne '')) {
+ next if ($viewablesec ne $section);
+ }
+ next if ($start >= $timestamp);
+ if ($role eq 'st') {
+ $stucounted{$uname.':'.$udom.':'.$section} = $start.':'.$end;
+ } else {
+ $advcounted{$uname.':'.$udom.':'.$role.':'.$section} = $start.':'.$end;
+ }
+ my %chginfo = (
+ 'section' => $section,
+ 'uname' => $uname,
+ 'udom' => $udom,
+ 'role' => $role,
+ 'status' => $status,
+ );
+ $activatedcount ++;
+ push (@{$rolechgs->{$timestamp}},\%chginfo);
+ }
+ }
+ }
+ }
+ }
+ $activatedcount += &getrolechanges($rolechgs,$rolechgtime,$status,\%stucounted,\%advcounted);
+ return $activatedcount;
+}
+
+sub getrolechanges {
+ my ($rolechgs,$rolechgtime,$status,$stucountref,$advcountref) = @_;
+ my (%stucounted,%advcounted);
+ if (ref($stucountref) eq 'HASH') {
+ %stucounted = %{$stucountref};
+ }
+ if (ref($advcountref) eq 'HASH') {
+ %advcounted = %{$advcountref};
+ }
+ my $withsec = 1;
+ my $hidepriv = 1;
+ my $context = 'course';
+ my @statuses = ($status);
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $now = time();
+ my ($permission,$allowed) =
+ &Apache::lonuserutils::get_permission($context);
+ my $viewablesec = &Apache::lonuserutils::viewable_section($permission);
+ my $classlist = &Apache::loncoursedata::get_classlist();
+ my $secidx = &Apache::loncoursedata::CL_SECTION();
+ my $startidx = &Apache::loncoursedata::CL_START();
+ my $endidx = &Apache::loncoursedata::CL_END();
+ my $rolechgcount = 0;
+ foreach my $key (keys(%{$classlist})) {
+ my ($userstatus,$eventtime);
+ my $student = $classlist->{$key};
+ if (ref($student) eq 'ARRAY') {
+ my $start = $student->[$startidx];
+ my $end = $student->[$endidx];
+ my $sec = $student->[$secidx];
+ my ($stuname,$studom) = split(/:/,$key);
+ if ($status eq 'active') {
+ if (exists($stucounted{$key.':'.$sec})) {
+ next;
+ }
+ }
+ if (($end == 0) || ($end > $start)) {
+ if ($start <= $now) {
+ if ($end && $end < $now) {
+ if ($rolechgtime > 0) {
+ if ($end > $rolechgtime) {
+ $userstatus = 'previous';
+ }
+ } else {
+ $userstatus = 'previous';
+ }
+ } else {
+ if ($rolechgtime > 0) {
+ if ($start >= $rolechgtime) {
+ $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);
+ }
+ }
+ my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,
+ \@statuses,undef,undef,$withsec,$hidepriv);
+ foreach my $item (keys(%advrolehash)) {
+ my ($userstatus,$eventtime);
+ my ($uname,$udom,$role,$section) = split(/:/,$item,-1);
+ my ($start,$end) = split(/:/,$advrolehash{$item});
+ if ($start eq '-1' && $end eq '-1') {
+ next;
+ } else {
+ if ($status eq 'active') {
+ if (exists($advcounted{$item})) {
+ next;
+ }
+ }
+ if (($end == 0) || ($end > $start)) {
+ if ($start <= $now) {
+ if ($end && $end < $now) {
+ if ($rolechgtime > 0) {
+ if ($end > $rolechgtime) {
+ $userstatus = 'previous';
+ }
+ } else {
+ $userstatus = 'previous';
+ }
+ } else {
+ if ($rolechgtime > 0) {
+ if ($start >= $rolechgtime) {
+ $userstatus = 'active';
+ }
+ } else {
+ $userstatus = 'active';
+ }
+ }
+ }
+ }
+ next if ($userstatus ne $status);
+ if ($status eq 'active') {
+ $eventtime = $start;
+ } else {
+ $eventtime = $end;
+ }
+ }
+ if (($viewablesec ne '') && ($section ne '')) {
+ next if ($viewablesec ne $section);
+ }
+ my %chginfo = (
+ 'section' => $section,
+ 'uname' => $uname,
+ 'udom' => $udom,
+ 'role' => $role,
+ 'status' => $userstatus,
+ );
+ $rolechgcount ++;
+ push (@{$rolechgs->{$eventtime}},\%chginfo);
+ }
+ 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) = @_;
@@ -1111,7 +1626,7 @@ sub checkversions {
}
sub display_handgrade {
- my ($r,$tograde,$ungraded) = @_;
+ my ($r,$tograde,$ungraded,$itemserror) = @_;
my %lt = &Apache::lonlocal::texthash(
'prna' => 'Problem Name',
'nmun' => 'Number ungraded',
@@ -1134,13 +1649,15 @@ sub display_handgrade {
}
$r->print(''.$$ungraded{$res}{title}.' '.$$ungraded{$res}{count}.' ');
}
+ } elsif ($itemserror) {
+ $r->print(''.$itemserror.' ');
} else {
$r->print(''.$lt{'nopr'}.' ');
}
}
sub display_haserrors {
- my ($r,$bombs,$bombed,$res_title) = @_;
+ my ($r,$bombs,$bombed,$res_title,$itemserror) = @_;
my $bombnum = 0;
my %lt = &Apache::lonlocal::texthash(
reso => 'Resource',
@@ -1159,6 +1676,8 @@ sub display_haserrors {
''.
$$bombed{$bomb}{errorcount}.' ');
}
+ } elsif ($itemserror) {
+ $r->print(''.$itemserror.' ');
} else {
$r->print(''.$lt{'noer'}.' ');
}
@@ -1166,7 +1685,7 @@ sub display_haserrors {
}
sub display_abovethreshold {
- my ($r,$refpage,$warnings,$triggered,$res_title) = @_;
+ my ($r,$refpage,$warnings,$triggered,$res_title,$itemserror,$custommenu) = @_;
my %lt = &Apache::lonlocal::texthash(
reso => 'Resource',
part => 'Part',
@@ -1180,16 +1699,35 @@ sub display_abovethreshold {
);
if (@{$warnings} > 0) {
@{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};
- $r->print('');
+ unless ($custommenu) {
+ $r->print(' ');
+ }
+ } elsif ($itemserror) {
+ $r->print(''.$itemserror.' ');
} else {
$r->print(''.$lt{'nopr'}.' ');
}
}
sub display_versionchanges {
- my ($r,$changed,$res_title,$interval) = @_;
+ my ($r,$changed,$res_title,$interval,$itemserror) = @_;
my %lt = &Apache::lonlocal::texthash(
'reso' => 'Resource',
'revd' => 'Last revised',
'newv' => 'New version',
'veru' => 'Version used',
- 'noup' => 'No updated versions',
);
if (keys(%{$changed}) > 0) {
$r->print(''.
@@ -1256,15 +1797,160 @@ sub display_versionchanges {
$$changed{$item}{'current'}.' '.
$$changed{$item}{'version'}.' ');
}
+ } elsif ($itemserror) {
+ $r->print(''.$itemserror.' ');
+ } else {
+ $r->print(''
+ .&mt('No '.$interval).' ');
+ }
+ return;
+}
+
+sub display_rolechanges {
+ my ($r,$chgcount,$changed,$interval,$crstype) = @_;
+ my $now = time();
+ my %lt = &Apache::lonlocal::texthash(
+ 'user' => 'User',
+ 'tich' => 'Time of change',
+ 'role' => 'Role',
+ 'sec' => 'Section',
+ 'status' => 'Status',
+ );
+ if ($chgcount) {
+ $r->print(''.
+ ''.$lt{'tich'}.' '.
+ ''.$lt{'user'}.' '.
+ ''.$lt{'role'}.' '.
+ ''.$lt{'sec'}.' '.
+ ''.$lt{'status'}.' ');
+ if (ref($changed) eq 'HASH') {
+ my @changes = sort { $b <=> $a } (keys(%{$changed}));
+ my $changenum = 0;
+ foreach my $item (@changes) {
+ if (ref($changed->{$item}) eq 'ARRAY') {
+ foreach my $chg (@{$changed->{$item}}) {
+ if (ref($chg) eq 'HASH') {
+ my $section;
+ my $role =
+ &Apache::lonnet::plaintext($chg->{'role'},$crstype);
+ my $status = &mt($chg->{'status'});
+ if ($chg->{'section'} eq '') {
+ $section = &mt('none');
+ } else {
+ $section = $chg->{'section'};
+ }
+ my $uname = $chg->{'uname'};
+ my $udom = $chg->{'udom'};
+ $changenum ++;
+ my $css_class = $changenum%2?' class="LC_odd_row"':'';
+ my $link =
+ &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom);
+ $r->print(''.
+ ''.&Apache::lonlocal::locallocaltime($item).' '.
+ ''.$link.' '.
+ ''.$role.' '.
+ ''.$section.' '.
+ ''.$status.' ');
+ }
+ }
+ }
+ }
+ }
+ } else {
+ $r->print(''
+ .&mt('There are no '.$interval).' ');
+ }
+ 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) {
+
+ my $hdr = ''.
+ ''.$lt{'user'}.' '.
+ ''.$lt{'role'}.' '.
+ ''.$lt{'sec'}.' '.
+ ''.
+ ''.$lt{'number'}.' '.
+ ''.$lt{'role'}.' '.
+ ''.$lt{'sec'};
+ my (%bylastname,%counts);
+ if (ref($loggedin) eq 'HASH') {
+ my @logins = sort { $b <=> $a } (keys(%{$loggedin}));
+ my $numlogin = 0;
+ 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 = &Apache::loncommon::plainname($uname,$udom,'lastname');
+ my $link =
+ &Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
+ push(@{$bylastname{$fullname}},
+ ' '.$link.' '.
+ ''.$role.' '.
+ ''.$section.' ');
+ }
+ }
+ }
+ }
+ 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 .= ' '.$item.' ';
+ }
+ }
+ }
+ 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 .= ''.
+ ''.$counts{$role}{$sec}.' '.
+ ''.$showrole.' '.
+ ''.$sec.' ';
+ }
+ }
+ }
+ $r->print($hdr.' '.$table);
+ }
} else {
- $r->print(''.$lt{'noup'}.
- ' '.$interval.' ');
+ $r->print(''.
+ &mt('There are no '.$interval).
+ ' ');
}
return;
}
sub display_coursediscussion {
- my ($r,$newdiscussions,$unread,$countunread,$res_title) = @_;
+ my ($r,$newdiscussions,$unread,$countunread,$res_title,$itemserror) = @_;
my $lctype = lc(&Apache::loncommon::course_type());
my %lt = &Apache::lonlocal::texthash(
'loca' => 'Location',
@@ -1294,7 +1980,7 @@ sub display_coursediscussion {
my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
my $disclink = $feedurl.'?symb='.$$unread{$ressymb}{symb};
if ($feedurl =~ /bulletinboard/) {
- $type = 'Bulletin Board';
+ $type = 'Discussion Board';
}
if ($$unread{$ressymb}{'enclink'}) {
$disclink = $$unread{$ressymb}{'enclink'}.'?symb='.$$unread{$ressymb}{'encsymb'};
@@ -1302,7 +1988,7 @@ sub display_coursediscussion {
my $css_class = $rowNum%2?' class="LC_odd_row"':'';
my $lastpost = &Apache::lonnavmaps::timeToHumanString(
$$unread{$ressymb}{'lastpost'});
- $r->print(''.$forum_title.' '.$type.' ');
+ $r->print(''.$forum_title.' '.&mt($type).' ');
if ($countunread eq 'on') {
my $unreadnum = $$unread{$ressymb}{'unreadcount'};
$r->print(''.$lastpost.' '.
@@ -1312,6 +1998,8 @@ sub display_coursediscussion {
}
$r->print(" \n");
}
+ } elsif ($itemserror) {
+ $r->print(''.$itemserror.' ');
} else {
$r->print(''.$lt{'noun'}.' ');
}
@@ -1329,11 +2017,12 @@ sub display_coursenormalmail {
foreach my $msg (@{$newmsgs}) {
$mailcount ++;
my $css_class = $mailcount%2?' class="LC_odd_row"':'';
- $r->print(''.$mailcount.
- '. '.
- $msg->{'shortsub'}.' '.
- $msg->{'from'}.'@'.$msg->{'fromdom'}.' '.
- $msg->{'sendtime'}.' ');
+ $r->print(''.$mailcount
+ .'. '
+ .$msg->{'shortsub'}.' '
+ .$msg->{'from'}.':'.$msg->{'fromdom'}.' '
+ .$msg->{'sendtime'}.' ');
}
} else {
$r->print(''.
@@ -1356,7 +2045,7 @@ sub display_coursecritmail {
$r->print(' '.$mailcount.
'. '.
$msg->{'shortsub'}.' '.
- $msg->{'from'}.'@'.$msg->{'fromdom'}.' '.
+ $msg->{'from'}.':'.$msg->{'fromdom'}.' '.
$msg->{'sendtime'}.' ');
}
} else {
@@ -1414,20 +2103,30 @@ sub store_interval_setting {
my ($uname,$udom,$cid,$interval_titles) = @_;
my %interval_settings = ();
my $result;
- if (defined($env{'form.interval'})) {
- $interval_settings{$cid.':interval'} = $env{'form.interval'};
+ my $context = $env{'form.intervaltype'};
+ if ($env{'form.interval'} ne '') {
+ if ($context eq 'oldroles') {
+ $interval_settings{$cid.':oldroleinterval'} = $env{'form.interval'};
+ } elsif ($context eq 'newroles') {
+ $interval_settings{$cid.':newroleinterval'} = $env{'form.interval'};
+ } elsif ($context eq 'crslogin') {
+ $interval_settings{$cid.':crslogininterval'} = $env{'form.interval'};
+ } else {
+ $interval_settings{$cid.':interval'} = $env{'form.interval'};
+ }
my $outcome = &Apache::lonnet::put('nohist_whatsnew',
\%interval_settings,$udom,$uname);
if ($outcome eq 'ok') {
- $result = &mt('Interval set to version changes [_1]',
- ''.$$interval_titles{$env{'form.interval'}}.' ');
-
+ if (ref($interval_titles->{$context}) eq 'HASH') {
+ $result = &mt('New filter setting: [_1].',''.
+ $interval_titles->{$context}->{$env{'form.interval'}}.' ').' ';
+ }
} else {
my $lctype = lc(&Apache::loncommon::course_type());
- &Apache::lonnet::logthis('Error storing whatsnew interval setting'.
+ &Apache::lonnet::logthis('Error saving whatsnew '.$context.' interval setting'.
' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
$result = &mt('Unable to set interval to [_1] due to [_2].',
- ''.$$interval_titles{$env{'form.interval'}}.' ',
+ ''.$interval_titles->{$context}->{$env{'form.interval'}}.' ',
''.$outcome.' . ');
}
}
@@ -1444,15 +2143,15 @@ sub store_discussion_setting {
\%discussion_settings,$udom,$uname);
if ($outcome eq 'ok') {
$result = &mt('Count unread posts in discussions display set to [_1]',
- ''.$env{'form.countunread'}.' ');
+ ''.&mt($env{'form.countunread'}).' ').' ';
} else {
my $lctype = lc(&Apache::loncommon::course_type());
- &Apache::lonnet::logthis('Error storing whatsnew countunread setting'.
+ &Apache::lonnet::logthis('Error saving whatsnew countunread setting'.
' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
$result = &mt('Unable to set "number unread posts display" to [_1]'.
' due to [_2].',
- ''.$env{'form.countunread'}.' ',
+ ''.&mt($env{'form.countunread'}).' ',
''.$outcome.' . ');
}
}
@@ -1481,12 +2180,13 @@ sub store_courseinit_setting {
\%courseinit_settings,$udom,$uname);
if ($outcome eq 'ok') {
if ($page_control eq 'global preferences') {
- $result = &mt("Page displayed after role selection in $lctype now set by user's global preferences .");
+ $result = &mt("Page displayed after role selection in $lctype now set by [_1]user's global preferences[_2].",'',' ');
} else {
- $result = &mt('Page displayed after role selection in this '.$lctype.' set to [_2] ',$lctype,$$initpage{$env{'form.courseinit_page'}});
+ $result = &mt('Page displayed after role selection in this '.$lctype.' set to [_1].'
+ ,''.$$initpage{$env{'form.courseinit_page'}}.' ');
}
} else {
- &Apache::lonnet::logthis('Error storing whatsnew courseinit '.
+ &Apache::lonnet::logthis('Error saving whatsnew courseinit '.
'setting: '.$outcome.' for '.$uname.
':'.$udom.' in '.$lctype.' '.$cid);
if ($page_control eq 'global preferences') {
@@ -1495,8 +2195,10 @@ sub store_courseinit_setting {
''.$page_control.' ',
''.$outcome.' . ');
} else {
- $result = &mt('Unable to set page display, after role selection, for this '.$lctype.' to [_2] due to [_3] . ',
- $$initpage{$env{'form.courseinit_page'}},$outcome);
+ $result = &mt('Unable to set page display, after role selection, for this '.$lctype.' to [_1] due to [_2].'
+ ,''.$$initpage{$env{'form.courseinit_page'}}.' '
+ ,''.$outcome.' ')
+ .' ';
}
}
}
@@ -1505,7 +2207,7 @@ sub store_courseinit_setting {
}
sub start_box {
- my ($r,$show,$heading,$caller,$refpage) = @_;
+ my ($r,$show,$heading,$caller,$refpage,$action,$custommenu) = @_;
my %lt = &Apache::lonlocal::texthash(
chth => 'Change thresholds?',
chin => 'Change interval?',
@@ -1514,41 +2216,65 @@ sub start_box {
my $showhide;
if ($$show{$caller}) {
$showhide = 'Hide ';
+ 'display_'.$caller.",'hide'".');">'.
+ &mt('Hide').'';
} else {
$showhide = 'Show ';
+ 'display_'.$caller.",'show'".');">'.
+ &mt('Show').'';
}
$r->print('
- '.$$heading{$caller}.'
+ '.$$heading{$caller}.'
'.$showhide.'
');
if (($caller eq 'abovethreshold') && ($$show{$caller})) {
- if ($$show{$caller}) {
+ if ($$show{$caller} && !$custommenu) {
$r->print('
-
+
');
}
} elsif (($caller eq 'versionchanges') && ($$show{$caller})) {
if ($$show{$caller}) {
$r->print('
-
+
');
}
} elsif ($caller eq 'coursediscussion') {
if ($$show{$caller}) {
$r->print('
-
+
+ ');
+ }
+ } elsif (($caller eq 'newroles') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
+ ');
+ }
+ } elsif (($caller eq 'oldroles') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
+ ');
+ }
+ } elsif (($caller eq 'crslogin') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
');
}
}
+
$r->print('