--- loncom/interface/lonwhatsnew.pm 2013/12/14 02:08:30 1.105.2.9
+++ loncom/interface/lonwhatsnew.pm 2025/03/22 21:18:30 1.132
@@ -1,5 +1,7 @@
+# The LearningOnline Network
+# What's New in a course
#
-# $Id: lonwhatsnew.pm,v 1.105.2.9 2013/12/14 02:08:30 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.132 2025/03/22 21:18:30 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -62,17 +64,37 @@ sub handler {
my $command = $env{'form.command'};
my $refpage = $env{'form.refpage'};
- my %checkallowed = ( coursenormalmail => 1,
- coursecritmail => 1, );
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+
+ my ($isadhoc,%checkallowed);
+
+ if ($env{'request.role'} =~ m{^(cc|co)/}) {
+ my $rolecode = $1;
+ if ($env{"environment.internal.$cdom.$crs.$env{'request.role'}.adhoc"}) {
+ $isadhoc = 1;
+ }
+ } elsif ($env{'request.role'} =~ m{^cr/$cdom/$cdom\-domainconfig/(\w+)\./}) {
+ my $rolename = $1;
+ if ($env{"environment.internal.$cdom.$crs.cr/$cdom/$cdom-domainconfig/$rolename.adhoc"}) {
+ $isadhoc = 1;
+ }
+ }
+ unless ($isadhoc) {
+ %checkallowed = ( coursenormalmail => 1,
+ coursecritmail => 1,);
+ }
foreach my $perm_check (['whn','whatsnew',1],
['pch','coursediscussion',1],
['mgr','handgrading',1],
['vgr','abovethreshold',1],
- ['opa','haserrors',1],
- ['mdc','versionchanges',0],
+ ['vgr','haserrors',1],
+ ['whn','versionchanges',1],
['vcl','newroles',1],
['vcl','oldroles',1],
['whn','crslogin',1],
+ ['vcl','sessions',1],
+ ['mgr','resetcounters',1],
) {
my ($perm,$key,$check_section) = @{ $perm_check };
my $scope = $env{'request.course.id'};
@@ -96,7 +118,23 @@ sub handler {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
- $r->print(&display_header($command,\%checkallowed));
+ my $udom = $env{'user.domain'};
+ my $uname = $env{'user.name'};
+ my $cid = $env{'request.course.id'};
+ my $store_result = &store_display_settings($uname,$udom,$cid,\%checkallowed);
+ my $store_error;
+
+ unless ($store_result eq 'ok') {
+ my $lctype = lc(&Apache::loncommon::course_type());
+ &Apache::lonnet::logthis('Error saving whatsnew settings: '.
+ $store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
+ $store_error = ''
+ .&mt('Unable to save visibility settings due to [_1]',
+ $store_result)
+ .' ';
+ }
+
+ $r->print(&display_header($command,$uname,$udom,$cid,\%checkallowed));
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb
@@ -151,12 +189,19 @@ sub handler {
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Intervals'
));
+ } elsif ($command eq 'chgsessionlimit' && $checkallowed{'sessions'}) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chgsessionlimit&refpage='.$refpage,
+ text=>"Change session range"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ ("What's New?",#'Course_Action_Items_Sessions'
+ ));
} else {
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Display'
));
}
- &display_main_box($r,$command,$refpage,\%checkallowed);
+ &display_main_box($r,$command,$refpage,\%checkallowed,$cdom,$crs,$store_error);
return OK;
}
@@ -167,11 +212,10 @@ sub handler {
#------------------------------
sub display_main_box {
- my ($r,$command,$refpage,$checkallowed) = @_;
+ my ($r,$command,$refpage,$checkallowed,$cdom,$crs,$store_error) = @_;
my $domain=&Apache::loncommon::determinedomain();
my $function = &Apache::loncommon::get_users_function();
my $lctype = lc(&Apache::loncommon::course_type());
- $r->print('
');
my %threshold_titles = &Apache::lonlocal::texthash (
av_attempts => 'Average number of attempts',
@@ -202,25 +246,31 @@ sub display_main_box {
604800 => 'last logins for users in last 7 days',
86400 => 'last logins for users in last 24 hours',
);
+ my %sessions = (
+ 300 => 'course sessions active in the last 5 minutes',
+ 600 => 'course sessions active in the last 10 minutes',
+ 1800 => 'course sessions active in the last 30 minutes',
+ 7200 => 'course sessions active in the last 2 hours',
+ -7200 => 'course sessions with last activity more than 2 hours ago',
+ );
my %interval_titles = (
versions => \%versions,
newroles => \%newroles,
oldroles => \%oldroles,
crslogin => \%crslogins,
+ sessions => \%sessions,
);
- my %initpage = &Apache::lonlocal::texthash (
+ my %initpage = (
firstres => "first resource in the $lctype",
whatsnew => "What's New Page",
userpref => 'your general user preferences',
coursespecific => "specific setting for this $lctype",
);
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $r->print('');
if (($command eq 'chgthreshold')
&& $checkallowed->{'abovethreshold'}) {
- &display_threshold_config($r,$refpage,\%threshold_titles,
- $cdom,$crs);
+ &display_threshold_config($r,$refpage,\%threshold_titles,$cdom,$crs);
} elsif (($command eq 'chginterval')
&& $checkallowed->{'versionchanges'}) {
&display_interval_config($r,$refpage,\%interval_titles,'versions');
@@ -238,17 +288,16 @@ sub display_main_box {
} elsif (($command eq 'chgcrslogininterval')
&& $checkallowed->{'crslogin'}) {
&display_interval_config($r,$refpage,\%interval_titles,'crslogin');
+ } elsif (($command eq 'chgsessionlimit')
+ && $checkallowed->{'sessions'}) {
+ &display_interval_config($r,$refpage,\%interval_titles,'sessions');
} else {
&display_actions_box($r,$command,$refpage,\%threshold_titles,
- \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
+ \%interval_titles,\%initpage,$cdom,$crs,
+ $checkallowed,$store_error);
}
my $end_page = &Apache::loncommon::end_page();
- $r->print(<
-
-
-$end_page
-END_OF_BLOCK
+ $r->print(' '.$end_page);
}
#-------------------------------
@@ -259,13 +308,48 @@ END_OF_BLOCK
#-------------------------------
sub display_header {
- my ($command,$checkallowed) = @_;
-
+ my ($command,$uname,$udom,$cid,$checkallowed) = @_;
+
my $scripttag;
- unless ($command eq 'chgthreshold' || $command eq 'chginterval' ||
- $command eq 'chgoldroleinterval' ||
- $command eq 'chgnewroleinterval' || $command eq 'chgcrslogininterval') {
- $scripttag = <<"END";
+ my $args = {};
+ my %loadentries;
+
+ if ($command eq 'courseinit') {
+ $scripttag = <<"END";
+
+END
+ $loadentries{'onload'} = 'toggleCourseInit(document.courseinitswitch);';
+ } else {
+ unless (($command eq 'chgthreshold' && $checkallowed->{'abovethreshold'}) ||
+ ($command eq 'chginterval' && $checkallowed->{'versionchanges'}) ||
+ ($command eq 'chgdisc' && $checkallowed->{'coursediscussion'}) ||
+ ($command eq 'chgoldroleinterval' && $checkallowed->{'oldroles'}) ||
+ ($command eq 'chgnewroleinterval' && $checkallowed->{'newroles'}) ||
+ ($command eq 'chgcrslogininterval' && $checkallowed->{'crslogin'}) ||
+ ($command eq 'chgsessionlimit' && $checkallowed->{'sessions'})) {
+ my %display_settings = &get_display_settings($uname,$udom,$cid);
+ $scripttag = <<"END";
-';
+ENDTOGG
+ if (($checkallowed->{'crslogin'}) && ($display_settings{$cid.':crslogin'} ne 'hide')) {
+ $loadentries{'onload'} = "toggledetails('login');";
+ }
+ if (($checkallowed->{'sessions'}) && ($display_settings{$cid.':sessions'} ne 'hide')) {
+ $loadentries{'onload'} .= "toggledetails('session');";
+ }
+ }
}
my $course_type=&Apache::loncommon::course_type();
+ if (keys(%loadentries)) {
+ $args->{'add_entries'} = \%loadentries;
+ }
return &Apache::loncommon::start_page("What's New?",
- $scripttag);
+ $scripttag,$args);
}
#-------------------------------
@@ -352,7 +447,7 @@ function togglelogins() {
sub display_actions_box {
my ($r,$command,$refpage,$threshold_titles,$interval_titles,$initpage,
- $cdom,$crs,$checkallowed) = @_;
+ $cdom,$crs,$checkallowed,$store_error) = @_;
my $udom = $env{'user.domain'};
my $uname = $env{'user.name'};
my $cid = $env{'request.course.id'};
@@ -388,6 +483,8 @@ sub display_actions_box {
my %activated;
my %loggedin;
my $logincount;
+ my %sessions;
+ my $sessioncount;
my %res_title = ();
my %show = ();
my $needitems = 0;
@@ -427,7 +524,7 @@ sub display_actions_box {
}
$header .= &mt('Page set to be displayed after you have selected a role in this '.$lctype).'.'
.' '
- .&mt('Currently: [_1].',''.$currinit.' ')
+ .&mt('Currently: [_1].',''.$currinit.' ')
.' '
.&mt('[_1]Change[_2] for just [_3]this '.$lctype.'[_4] or for [_5]all your courses/communities[_6].'
,''
@@ -441,7 +538,7 @@ sub display_actions_box {
$r->print(&Apache::loncommon::head_subbox($header));
if ($command eq 'reset') {
- $result = &process_reset($cdom,$crs);
+ $result = &process_reset($cdom,$crs,$checkallowed);
} elsif ($command eq 'update') {
$result = &process_update($uname,$udom,$threshold_titles);
} elsif ($command eq 'newinterval') {
@@ -450,15 +547,8 @@ sub display_actions_box {
$result = &store_discussion_setting($uname,$udom,$cid);
}
- my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);
-
- unless ($store_result eq 'ok') {
- &Apache::lonnet::logthis('Error saving whatsnew settings: '.
- $store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
- $result .= ''
- .&mt('Unable to save visibility settings due to [_1]',
- $store_result)
- .' ';
+ if ($store_error) {
+ $result = $store_error;
}
if ($result) {
@@ -532,6 +622,22 @@ sub display_actions_box {
$headings{'crslogin'} = &mt('Last login for users in last 24 hours');
}
+ $timediff{'sessions'} = $display_settings{$cid.':sessionactivity'};
+ unless (defined($timediff{'sessions'})) { $timediff{'sessions'} = 7200; }
+ $interval{'sessions'} = $interval_titles->{'sessions'}->{$timediff{'sessions'}};
+
+ if ($timediff{'sessions'} == -7200) {
+ $headings{'sessions'} = &mt('Session with activity more than 2 hours ago');
+ } elsif ($timediff{'sessions'} == 7200) {
+ $headings{'sessions'} = &mt('Session with activity in last 2 hours');
+ } elsif ($timediff{'sessions'} == 1800) {
+ $headings{'sessions'} = &mt('Session with activity in last 30 minutes');
+ } elsif ($timediff{'sessions'} == 600) {
+ $headings{'sessions'} = &mt('Session with activity in last 10 minutes');
+ } elsif ($timediff{'sessions'} == 300) {
+ $headings{'sessions'} = &mt('Session with activity in last 5 minutes');
+ }
+
my ($now,$starttime,$activatedstart,$expiredstart,$crsloginstart);
$now = time;
@@ -572,7 +678,20 @@ sub display_actions_box {
$threshold{'av_attempts'},$threshold{'degdiff'},
' ',$threshold{'numstudents'});
- my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles','crslogin');
+ my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail','newroles','oldroles','crslogin','sessions');
+ my %actioncolumn = (
+ handgrading => 'left',
+ haserrors => 'left',
+ abovethreshold => 'left',
+ versionchanges => 'left',
+ coursediscussion => 'right',
+ coursenormalmail => 'right',
+ coursecritmail => 'right',
+ newroles => 'right',
+ oldroles => 'right',
+ crslogin => 'right',
+ sessions => 'right',
+ );
foreach my $key (keys(%{$checkallowed})) {
if ($key =~ /_section$/) { next; }
@@ -586,7 +705,8 @@ sub display_actions_box {
foreach my $item (@actionorder) {
unless ($item eq 'coursenormalmail' || $item eq 'coursecritmail' ||
- $item eq 'newroles' || $item eq 'oldroles') {
+ $item eq 'newroles' || $item eq 'oldroles' ||
+ $item eq 'crslogin' || $item eq 'sessions') {
if ($show{$item}) {
$needitems = 1;
last;
@@ -596,10 +716,10 @@ sub display_actions_box {
my $itemserror;
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,$checkallowed);
}
my $classlist;
- if ($show{'oldroles'} || $show{'newroles'} || $show{'crslogin'}) {
+ if ($show{'oldroles'} || $show{'newroles'} || $show{'crslogin'} || $show{'sessions'}) {
$classlist = &Apache::loncoursedata::get_classlist();
}
if ($show{'coursenormalmail'}) {
@@ -617,9 +737,16 @@ sub display_actions_box {
if ($show{'crslogin'}) {
$logincount = &getloggedin($cdom,$crs,\%loggedin,$crsloginstart);
}
- $r->print(qq|$lt{'hial'}
- $lt{'shal'}
-
');
}
@@ -695,13 +822,18 @@ sub display_threshold_config {
my $onchange = 'onfocus="javascript:window.document.forms'.
"['thresholdform'].elements['".$parameter."_setparmval']".
'.checked=true;"';
+ my $aria_textbox = ' aria-label="'.&mt('Threshold value for [_1]',
+ $threshold_titles{$type}).'"';
+ my $aria_checkbox = ' aria-label="'.&mt('Change threshold value for [_1]',
+ $threshold_titles{$type}).'"';
$r->print(&Apache::loncommon::start_data_table_row()."\n".
' '.$threshold_titles{$type}.' '."\n".
''.&Apache::lonhtmlcommon::textbox($parameter.'_value',
$threshold{$type},
- 10,$onchange).' '."\n".
+ 10,$onchange.$aria_textbox).''."\n".
''.
- &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
+ &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval',
+ '','',$aria_checkbox).
' '."\n".
&Apache::loncommon::end_data_table_row());
}
@@ -726,6 +858,8 @@ sub display_interval_config {
$setting = 'oldroleinterval';
} elsif ($context eq 'newroles') {
$setting = 'newroleinterval';
+ } elsif ($context eq 'sessions') {
+ $setting = 'sessionactivity';
}
my $lctype = lc(&Apache::loncommon::course_type());
my $current = &get_current($env{'user.name'},$env{'user.domain'},
@@ -736,6 +870,8 @@ sub display_interval_config {
$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).' ');
+ } elsif ($context eq 'sessions') {
+ $r->print(' '.&mt('Choose the time limit to use to display active user sessions in the '.$lctype.'.').' ');
} else {
$r->print(' '.&mt('Choose the time window to use to display resources in the '.$lctype.' with version changes.').' ');
}
@@ -751,12 +887,19 @@ sub display_interval_config {
'.
&mt('Display:').'
-
+
'.&mt('Select').'
');
if (ref($interval_titles) eq 'HASH') {
if (ref($interval_titles->{$context}) eq 'HASH') {
- foreach my $key (reverse sort ({$a cmp $b} (keys(%{$interval_titles->{$context}})))) {
+ my @sorted;
+ if ($context eq 'sessions') {
+ @sorted = sort { $a <=> $b } (keys(%{$interval_titles->{$context}}));
+ push(@sorted,shift(@sorted));
+ } else {
+ @sorted = reverse sort ({$a cmp $b} (keys(%{$interval_titles->{$context}})));
+ }
+ foreach my $key (@sorted) {
$r->print(''.&mt($interval_titles->{$context}->{$key}).
' '."\n");
}
@@ -832,46 +975,49 @@ sub courseinit_config {
my ($control,$current) = &curr_courseinit();
my @chgstate = ('userpref','coursespecific');
my @chgentry = ('firstres','whatsnew');
+ my $courseinitsty = 'display:none;';
+ if ($control eq 'coursespecific') {
+ $courseinitsty = 'display:inline;';
+ }
my $lctype = lc(&Apache::loncommon::course_type());
my %lt = &Apache::lonlocal::texthash(
'chwp' => "Choose which page will be displayed when you enter this $lctype after selecting a role.",
- 'cuva' => 'Current value is determined by',
- 'anis' => 'and is set to display',
'padc' => 'Page display controlled by',
- 'chce' => 'Choose '.$lctype.' entry',
+ 'chce' => "Choose $lctype entry",
'moce' => 'Save',
);
- $r->print(<<"END");
+ $lt{'cuva'} = &mt('Current value is determined by[_1]'.$initpage->{$control}.'[_2] and is set to display[_1]'.$initpage->{$current}.'[_2].',
+ ': ',' ');
+ $r->print(<<"END");
$lt{'chwp'}
- $lt{'cuva'}:
-$$initpage{$control} $lt{'anis'}
-$$initpage{$current} .
+ $lt{'cuva'}
+
');
return;
}
@@ -901,7 +1047,8 @@ sub display_launcher {
$tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered,
$newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs,
$interval,$countunread,$expired,$expirecount,$activated,$activecount,
- $crstype,$itemserror,$loggedin,$logincount,$classlist) = @_;
+ $crstype,$itemserror,$loggedin,$logincount,$sessions,$sessioncount,
+ $classlist) = @_;
if ($$checkallowed{$action}) {
&start_box($r,$show,$headings,$action,$refpage);
@@ -914,7 +1061,7 @@ sub display_launcher {
&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,$itemserror);
+ $res_title,$itemserror,$checkallowed);
} elsif ($action eq 'coursediscussion') { # UNREAD COURSE DISCUSSION
&display_coursediscussion($r,$newdiscussions,$unread,
$countunread,$res_title,$itemserror);
@@ -929,8 +1076,11 @@ sub display_launcher {
&display_rolechanges($r,$expirecount,$expired,$interval->{'oldroles'},
$crstype,$classlist);
} elsif ($action eq 'crslogin') { #LAST LOGIN
- &display_crslogins($r,$logincount,$loggedin,$interval->{'crslogin'},
+ &display_activity($r,'logins',$logincount,$loggedin,$interval->{'crslogin'},
$crstype,$classlist);
+ } elsif ($action eq 'sessions') { #ACTIVE SESSIONS
+ &display_activity($r,'sessions',$sessioncount,$sessions,$interval->{'sessions'},
+ $crstype,$classlist);
}
}
&end_box($r);
@@ -941,7 +1091,7 @@ 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,$checkallowed) = @_;
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].','',' ').' ';
@@ -1001,9 +1151,9 @@ 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,
+ $checkallowed);
}
-
}
return;
}
@@ -1034,12 +1184,28 @@ sub check_discussions {
sub check_handgraded {
my ($resource,$symb,$title,$cdom,$cnum,$ungraded,$tograde) = @_;
if ($resource->is_problem()) {
- my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
+ my ($handgradeable,$is_task);
my $partlist=$resource->parts();
- my $handgradeable;
- foreach my $part (@$partlist) {
- if ($resource->handgrade($part) eq 'yes') {
- $handgradeable=1; last;
+ if ($resource->is_task()) {
+ $is_task = 1;
+ foreach my $part (@$partlist) {
+ if ($resource->handgrade($part) eq 'yes') {
+ $handgradeable=1;
+ last;
+ }
+ }
+ } else {
+ foreach my $part (@$partlist) {
+ my @types = $resource->responseType($part);
+ if (grep(/^essay$/,@types)) {
+ $handgradeable=1;
+ last;
+ } elsif (grep(/^custom$/,@types)) {
+ if ($resource->handgrade($part) eq 'yes') {
+ $handgradeable=1;
+ last;
+ }
+ }
}
}
if ($handgradeable) {
@@ -1048,6 +1214,7 @@ sub check_handgraded {
if (@ungraded > 0) {
$$ungraded{$symb}{count} = scalar(@ungraded);
$$ungraded{$symb}{title} = $title;
+ $$ungraded{$symb}{is_task} = $is_task;
if ($resource->encrypted()) {
$$ungraded{$symb}{'enclink'} = $resource->link();
$$ungraded{$symb}{'encsymb'} = $resource->shown_symb();
@@ -1075,7 +1242,8 @@ sub check_bombed {
}
sub check_thresholds {
- my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings) = @_;
+ my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings,
+ $checkallowed) = @_;
# Compile maxtries and degree of difficulty for problem parts, unless handgradeable
my @parts = @{$resource->parts()};
my %stats;
@@ -1141,8 +1309,14 @@ sub check_thresholds {
'.$stats{$part}{users}.'
'.$stats{$part}{attempts}.'
'.$stats{$part}{degdiff}.'
- '.$lastreset{$part}.'
- ';
+ '.$lastreset{$part}.' ';
+ if ($checkallowed->{'resetcounters'}) {
+ my $aria = ' aria-label="'.&mt('Reset counter for [_1] (part [_2])',
+ $$triggered{$symb}{title},$part).'"';
+ $$triggered{$symb}{text}[$partcount] .=
+ ' '.
+ ' ';
+ }
$partcount ++;
}
$$triggered{$symb}{numparts} = $partcount;
@@ -1164,7 +1338,7 @@ sub get_curr_thresholds {
my $thresholdcount = 0;
my ($tmp) = %thresholdsettings;
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})) {
$$threshold{$item} =
$thresholdsettings{$cid.':threshold_'.$item};
@@ -1179,7 +1353,7 @@ sub get_curr_thresholds {
$cdom,$crs,'internal.threshold');
my ($temp) = %coursesettings;
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})) {
if (exists($coursesettings{'internal.threshold_'.$item})) {
$$threshold{$item} =
@@ -1204,7 +1378,11 @@ sub get_current {
}
sub process_reset {
- my ($dom,$crs) = @_;
+ my ($dom,$crs,$checkallowed) = @_;
+ if (!$checkallowed->{'resetcounters'}) {
+ return ''.&mt('You do not have the required privileges to reset counters').
+ ' ';
+ }
my $result = ''.&mt('Counters reset for following problems (and parts):').
' ';
my @agg_types = ('attempts','users','correct');
@@ -1246,9 +1424,13 @@ sub process_reset {
sub process_update {
my ($uname,$udom,$threshold_titles) = @_;
my $setoutput = ''.&mt('Changes to threshold(s) for problem tracking:').' ';
- foreach (keys %env) {
- next if ($_!~/^form\.(.+)\_setparmval$/);
- my $name = $1;
+ foreach my $key (keys(%env)) {
+ my $name;
+ if ($key =~/^form\.(.+)\_setparmval$/) {
+ $name = $1;
+ } else {
+ next;
+ }
my $value = $env{'form.'.$name.'_value'};
if ($name && defined($value) && ($value ne '')) {
my $put_result = &Apache::lonnet::put('nohist_whatsnew',
@@ -1271,29 +1453,37 @@ sub process_update {
sub getnormalmail {
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 @messages = sort(&Apache::lonnet::getkeys('nohist_email'));
- foreach my $message (@messages) {
- my $msgid=&escape($message);
- my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
- &Apache::lonmsg::unpackmsgid($msgid);
- if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
- if (defined($sendtime) && $sendtime!~/error/) {
- if ($status eq 'new') {
- $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
- $msgcount ++;
- if ($shortsubj eq '') {
- $shortsubj = &mt('No subject');
+ my @messages = &Apache::lonnet::getkeys('nohist_email');
+ return $msgcount if (!@messages);
+ my %emailstatus = &Apache::lonnet::dump('email_status');
+ foreach my $msgid (sort(@messages)) {
+ if ((!$emailstatus{$msgid}) || ($emailstatus{$msgid} eq 'new')) {
+ my $skipstatus;
+ if ($emailstatus{$msgid} eq 'new') {
+ $skipstatus = 1;
+ }
+ my $esc_msgid = &escape($msgid);
+ my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
+ &Apache::lonmsg::unpackmsgid($esc_msgid,undef,$skipstatus,undef,
+ $env{'request.course.id'});
+ if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
+ 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 => $esc_msgid,
+ sendtime => $sendtime,
+ shortsub => $shortsubj,
+ from => $fromname,
+ fromdom => $fromdom
+ });
}
- push(@{$newmsgs}, {
- msgid => $msgid,
- sendtime => $sendtime,
- shortsub => $shortsubj,
- from => $fromname,
- fromdom => $fromdom
- });
}
}
}
@@ -1303,13 +1493,15 @@ sub getnormalmail {
sub getcritmail {
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 $result = '';
my $critmsgcount = 0;
foreach my $msgid (sort(keys(%what))) {
+ my $esc_msgid = &escape($msgid);
my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
- &Apache::lonmsg::unpackmsgid($msgid);
+ &Apache::lonmsg::unpackmsgid($esc_msgid,undef,1,undef,
+ $env{'request.course.id'});
if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
if (defined($sendtime) && $sendtime!~/error/) {
$sendtime = &Apache::lonlocal::locallocaltime($sendtime);
@@ -1318,7 +1510,7 @@ sub getcritmail {
$shortsubj = &mt('No subject');
}
push(@{$critmsgs}, {
- msgid => $msgid,
+ msgid => $esc_msgid,
sendtime => $sendtime,
shortsub => $shortsubj,
from => $fromname,
@@ -1563,6 +1755,78 @@ sub getloggedin {
return $logincount;
}
+sub getsessions {
+ my ($cdom,$cnum,$sessions,$lastactive,$classlist) = @_;
+ my $context = 'course';
+ my ($permission,$allowed) =
+ &Apache::lonuserutils::get_permission($context);
+ my %crs_sessions = &Apache::lonnet::get_course_sessions($cnum,$cdom,$lastactive);
+ my $sessioncount = 0;
+ if (keys(%crs_sessions) > 0) {
+ if (ref($classlist) eq 'HASH') {
+ my $viewablesec = &Apache::lonuserutils::viewable_section($permission);
+ my $secidx = &Apache::loncoursedata::CL_SECTION();
+ my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'_'.$cnum,1);
+ my %personnel;
+ foreach my $role (sort(keys(%coursepersonnel))) {
+ my ($rolecode,$section);
+ if ($role =~ /:/) {
+ ($rolecode,$section) = split(/:/,$role);
+ } else {
+ $rolecode = $role;
+ }
+ if ($viewablesec ne '') {
+ next if ($viewablesec ne $section);
+ }
+ foreach my $user (split(/\,/,$coursepersonnel{$role})) {
+ push(@{$personnel{$user}{$rolecode}},$section);
+ }
+ }
+ foreach my $key (keys(%crs_sessions)) {
+ if (exists($classlist->{$key})) {
+ my $student = $classlist->{$key};
+ my $section = $student->[$secidx];
+ my $lastaccess = $crs_sessions{$key};
+ if ($viewablesec ne '') {
+ next if ($viewablesec ne $section);
+ }
+ my ($stuname,$studom) = split(/:/,$key);
+ my %info = (
+ 'section' => $section,
+ 'role' => 'st',
+ 'uname' => $stuname,
+ 'udom' => $studom,
+ );
+ $sessioncount ++;
+ push(@{$sessions->{$lastaccess}},\%info);
+ } elsif (exists($personnel{$key})) {
+ my $lastaccess = $crs_sessions{$key};
+ my ($uname,$udom) = split(/:/,$key);
+ if (ref($personnel{$key}) eq 'HASH') {
+ my ($showrole,$showsec);
+ foreach my $possrole ('cc','co','in','ta','ep','ad','st') {
+ if (exists($personnel{$key}{$possrole})) {
+ $showrole = $possrole;
+ $showsec = join(', ',@{$personnel{$key}{$possrole}});
+ last;
+ }
+ }
+ my %info = (
+ 'section' => $showsec,
+ 'role' => $showrole,
+ 'uname' => $uname,
+ 'udom' => $udom,
+ );
+ $sessioncount ++;
+ push(@{$sessions->{$lastaccess}},\%info);
+ }
+ }
+ }
+ }
+ }
+ return $sessioncount;
+}
+
sub checkversions {
my ($cdom,$crs,$navmap,$changed,$starttime) = @_;
my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs);
@@ -1611,26 +1875,50 @@ sub display_handgrade {
'nopr' => 'No problems require handgrading',
);
if (@{$tograde} > 0) {
- $r->print(''.
- $lt{'prna'}.' '.
- $lt{'nmun'}.' ');
+ $r->print(''.
+ $lt{'prna'}.' '.
+ $lt{'nmun'}.' ');
my $rowNum = 0;
+ my $usediv;
+ if (@{$tograde} > 1) {
+ $usediv = 1;
+ }
foreach my $res (@{$tograde}) {
$rowNum ++;
my $css_class = $rowNum%2?' class="LC_odd_row"':'';
- my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
- my $linkurl=&Apache::lonnet::clutter($url);
- $linkurl .= '?symb='.&escape($res);
- if ($$ungraded{$res}{'enclink'}) {
- $linkurl =
- $$ungraded{$res}{'enclink'}.'?symb='.$$ungraded{$res}{'encsymb'};
+ my $linkurl;
+ if ($$ungraded{$res}{'is_task'}) {
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
+ $linkurl=&Apache::lonnet::clutter($url);
+ $linkurl .= '?symb='.&escape($res);
+ if ($$ungraded{$res}{'enclink'}) {
+ $linkurl =
+ $$ungraded{$res}{'enclink'}.'?symb='.$$ungraded{$res}{'encsymb'};
+ }
+ } else {
+ $linkurl='/adm/grades';
+ if ($$ungraded{$res}{'enclink'}) {
+ $linkurl.='?symb='.$$ungraded{$res}{'encsymb'};
+ } else {
+ $linkurl.='?symb='.&escape($res);
+ }
+ $linkurl.='&command=ungraded';
+ }
+ $r->print('');
+ if ($usediv) {
+ $r->print('');
}
- $r->print(' '.$$ungraded{$res}{title}.' '.$$ungraded{$res}{count}.' ');
+ $r->print(''.
+ ''.$$ungraded{$res}{count}.' ');
}
} elsif ($itemserror) {
- $r->print(''.$itemserror.' ');
+ $r->print(''.$itemserror.' ');
} else {
- $r->print(''.$lt{'nopr'}.' ');
+ $r->print(''.$lt{'nopr'}.' ');
}
}
@@ -1643,27 +1931,38 @@ sub display_haserrors {
noer => 'No problems with errors',
);
if (@{$bombs} > 0) {
- $r->print(''.
- $lt{'reso'}.' '.
- $lt{'nmer'}.' ');
+ $r->print(''.
+ $lt{'reso'}.' '.
+ $lt{'nmer'}.' ');
@{$bombs} = sort { &cmp_title($a,$b,$res_title) } @{$bombs};
+ my $usediv;
+ if (@{$bombs} > 1) {
+ $usediv = 1;
+ }
foreach my $bomb (@{$bombs}) {
$bombnum ++;
my $css_class = $bombnum%2?' class="LC_odd_row"':'';
- $r->print(''.$$bombed{$bomb}{errorlink}.
- ' '.
+ $r->print(' ');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print($$bombed{$bomb}{errorlink});
+ if ($usediv) {
+ $r->print('
');
+ }
+ $r->print(' '.
$$bombed{$bomb}{errorcount}.' ');
}
} elsif ($itemserror) {
- $r->print(''.$itemserror.' ');
+ $r->print(''.$itemserror.' ');
} else {
- $r->print(''.$lt{'noer'}.' ');
+ $r->print(''.$lt{'noer'}.' ');
}
return;
}
sub display_abovethreshold {
- my ($r,$refpage,$warnings,$triggered,$res_title,$itemserror) = @_;
+ my ($r,$refpage,$warnings,$triggered,$res_title,$itemserror,$checkallowed) = @_;
my %lt = &Apache::lonlocal::texthash(
reso => 'Resource',
part => 'Part',
@@ -1678,13 +1977,19 @@ sub display_abovethreshold {
if (@{$warnings} > 0) {
@{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};
$r->print(''.
- ''.$lt{'reso'}.
- ' '.
- ''.$lt{'part'}.' '.$lt{'nust'}.' '.
- ''.$lt{'avat'}.' '.$lt{'dedi'}.' '.
- ''.$lt{'lare'}.' '.
- $lt{'reco'}.' ');
- my $row;
+ ''.$lt{'reso'}.
+ ' '.
+ ''.$lt{'part'}.' '.$lt{'nust'}.' '.
+ ''.$lt{'avat'}.' '.$lt{'dedi'}.' '.
+ ''.$lt{'lare'}.' ');
+ if ($checkallowed->{'resetcounters'}) {
+ $r->print(''.$lt{'reco'}.' ');
+ }
+ $r->print('');
+ my ($usediv,$row);
+ if (@{$warnings} > 1) {
+ $usediv = 1;
+ }
foreach my $res (@{$warnings}) {
$row++;
my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
@@ -1700,12 +2005,20 @@ sub display_abovethreshold {
}
my $css_class = $row%2?' class="LC_odd_row"':'';
$r->print(''.
- ''.
- $$triggered{$res}{title}.' ');
- if (ref($$triggered{$res}{text}) eq 'ARRAY') {
- $r->print($$triggered{$res}{text}[0]);
- }
- $r->print(' ');
+ '');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print(' ');
+ if (ref($$triggered{$res}{text}) eq 'ARRAY') {
+ $r->print($$triggered{$res}{text}[0]);
+ }
+ $r->print('');
if (ref($$triggered{$res}{text}) eq 'ARRAY') {
if (@{$$triggered{$res}{text}} > 1) {
for (my $i=1; $i<@{$$triggered{$res}{text}}; $i++) {
@@ -1715,11 +2028,13 @@ sub display_abovethreshold {
}
}
}
- $r->print(' ');
+ if ($checkallowed->{'resetcounters'}) {
+ $r->print(' ');
+ }
} elsif ($itemserror) {
- $r->print(''.$itemserror.' ');
+ $r->print(''.$itemserror.' ');
} else {
- $r->print(''.$lt{'nopr'}.' ');
+ $r->print(''.$lt{'nopr'}.' ');
}
}
@@ -1732,12 +2047,18 @@ sub display_versionchanges {
'veru' => 'Version used',
);
if (keys(%{$changed}) > 0) {
- $r->print(''.
- $lt{'reso'}.' '.$lt{'revd'}.' '.
- $lt{'newv'}.' '.
- $lt{'veru'}.' ');
+ $r->print(''.
+ ''.$lt{'reso'}.' '.
+ ''.$lt{'revd'}.' '.
+ ''.$lt{'newv'}.' '.
+ ''.$lt{'veru'}.' '.
+ ' ');
my @changes = sort { &cmp_title($a,$b,$res_title) } keys(%{$changed});
my $changenum = 0;
+ my $usediv;
+ if (@changes > 1) {
+ $usediv = 1;
+ }
foreach my $item (@changes) {
$changenum ++;
my $css_class = $changenum%2?' class="LC_odd_row"':'';
@@ -1745,17 +2066,25 @@ sub display_versionchanges {
my $linkurl=&Apache::lonnet::clutter($url);
$linkurl .= '?symb='.&escape($item);
- $r->print(''.
- $$res_title{$item}.' '.
+ $r->print(' ');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print(' '.
$$changed{$item}{'revdate'}.' '.
$$changed{$item}{'current'}.' '.
$$changed{$item}{'version'}.' ');
}
} elsif ($itemserror) {
- $r->print(''.$itemserror.' ');
+ $r->print(''.$itemserror.' ');
} else {
- $r->print(''
- .&mt('No '.$interval).' ');
+ $r->print(''
+ .&mt('No '.$interval).' ');
}
return;
}
@@ -1772,15 +2101,19 @@ sub display_rolechanges {
);
if ($chgcount) {
$r->print(''.
- ''.$lt{'tich'}.' '.
- ''.$lt{'user'}.' '.
- ''.$lt{'role'}.' '.
- ''.$lt{'sec'}.' '.
- ''.$lt{'status'}.' ');
+ ''.$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;
my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
+ my $usediv;
+ if ($chgcount > 1) {
+ $usediv = 1;
+ }
foreach my $item (@changes) {
if (ref($changed->{$item}) eq 'ARRAY') {
foreach my $chg (@{$changed->{$item}}) {
@@ -1808,7 +2141,15 @@ sub display_rolechanges {
&Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
$r->print(''.
''.&Apache::lonlocal::locallocaltime($item).' '.
- ''.$link.' '.
+ '');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print($link);
+ if ($usediv) {
+ $r->print('
');
+ }
+ $r->print(' '.
''.$role.' '.
''.$section.' '.
''.$status.' ');
@@ -1818,14 +2159,14 @@ sub display_rolechanges {
}
}
} else {
- $r->print(''
- .&mt('There are no '.$interval).' ');
+ $r->print(''
+ .&mt('There are no '.$interval).' ');
}
return;
}
-sub display_crslogins {
- my ($r,$logincount,$loggedin,$interval,$crstype,$classlist) = @_;
+sub display_activity {
+ my ($r,$context,$count,$details,$interval,$crstype,$classlist) = @_;
return unless (ref($classlist) eq 'HASH');
my %lt = &Apache::lonlocal::texthash(
'user' => 'User',
@@ -1833,29 +2174,42 @@ sub display_crslogins {
'sec' => 'Section',
'number' => 'Total number of logins',
);
- if ($logincount) {
-
- my $hdr = ''.
- ''.$lt{'user'}.' '.
- ''.$lt{'role'}.' '.
- ''.$lt{'sec'}.' '.
- ''.
- ''.$lt{'number'}.' '.
- ''.$lt{'role'}.' '.
- ''.$lt{'sec'};
+ my $prefix = 'login';
+ if ($context eq 'sessions') {
+ $lt{'number'} = &mt('Total number of active user sessions');
+ $lt{'active'} = &mt('Last active');
+ $prefix = 'session';
+ }
+ if ($count) {
+
+ my $hdr = ' '.
+ ''.$lt{'user'}.' '.
+ ''.$lt{'role'}.' '.
+ ''.$lt{'sec'}.' ';
+ if ($context eq 'sessions') {
+ $hdr .= ''.$lt{'active'}.' ';
+ }
+ $hdr .= ' '."\n".
+ ''.
+ ''.$lt{'number'}.' '.
+ ''.$lt{'role'}.' '.
+ ''.$lt{'sec'};
my (%bylastname,%counts);
- if (ref($loggedin) eq 'HASH') {
- my @logins = sort { $b <=> $a } (keys(%{$loggedin}));
- my $numlogin = 0;
+ if (ref($details) eq 'HASH') {
+ my @items = sort { $b <=> $a } (keys(%{$details}));
+ my $num = 0;
my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
- foreach my $item (@logins) {
- if (ref($loggedin->{$item}) eq 'ARRAY') {
- foreach my $user (@{$loggedin->{$item}}) {
+ my $usediv;
+ if ($count > 1) {
+ $usediv = 1;
+ }
+ foreach my $item (@items) {
+ if (ref($details->{$item}) eq 'ARRAY') {
+ foreach my $user (@{$details->{$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 {
@@ -1872,10 +2226,21 @@ sub display_crslogins {
}
my $link =
&Apache::loncommon::aboutmewrapper($fullname,$uname,$udom);
- push(@{$bylastname{$fullname}},
- ' '.$link.' '.
- ''.$role.' '.
- ''.$section.' ');
+ my $entry = '';
+ if ($usediv) {
+ $entry .= '';
+ }
+ $entry .= $link;
+ if ($usediv) {
+ $entry .= '
';
+ }
+ $entry .= ' '.
+ ''.$role.' '.
+ ''.$section.' ';
+ if ($context eq 'sessions') {
+ $entry .= ''.&Apache::lonlocal::locallocaltime($item).' ';
+ }
+ push(@{$bylastname{$fullname}},$entry);
}
}
}
@@ -1884,9 +2249,9 @@ sub display_crslogins {
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.' ';
+ $num ++;
+ my $css_class = $num%2?' class="LC_odd_row"':'';
+ $table .= ''.$item.' ';
}
}
}
@@ -1897,56 +2262,60 @@ sub display_crslogins {
foreach my $sec (sort { $b <=> $a } (keys(%{$counts{$role}}))) {
$numrow ++;
my $css_class = $numrow%2?' class="LC_odd_row"':'';
- $table .= ''.
+ $table .= ' '.
''.$counts{$role}{$sec}.' '.
''.$showrole.' '.
''.$sec.' ';
}
}
}
- $r->print($hdr.' '.$table);
+ $r->print($hdr.' '.$table);
}
} else {
- $r->print(''.
+ $r->print(' '.
&mt('There are no '.$interval).
- ' ');
+ ' ');
}
return;
}
-
+
sub display_coursediscussion {
my ($r,$newdiscussions,$unread,$countunread,$res_title,$itemserror) = @_;
my $lctype = lc(&Apache::loncommon::course_type());
my %lt = &Apache::lonlocal::texthash(
'loca' => 'Location',
'type' => 'Type',
- 'numn' => 'Number of new posts',
+ 'numn' => 'New posts',
'noun' => 'No unread posts in '.$lctype.' discussions',
'tmlp' => 'Time of last post',
);
if (@{$newdiscussions} > 0) {
- $r->print(''.
- $lt{'loca'}.' '.
- $lt{'type'}.' ');
+ $r->print(''.
+ ''.$lt{'loca'}.' '.
+ ''.$lt{'type'}.' ');
if ($countunread eq 'on') {
- $r->print(''.$lt{'tmlp'}.' '.
- ''.$lt{'numn'}.' ');
+ $r->print(''.$lt{'tmlp'}.' '.
+ ''.$lt{'numn'}.' ');
} else {
- $r->print(''.$lt{'tmlp'}.' ');
+ $r->print(''.$lt{'tmlp'}.' ');
}
$r->print(" \n");
@{$newdiscussions} = sort { &cmp_title($a,$b,$res_title) }
@{$newdiscussions};
my $rowNum = 0;
+ my $usediv;
+ if (@{$newdiscussions} > 1) {
+ $usediv = 1;
+ }
foreach my $ressymb (@{$newdiscussions}) {
$rowNum ++;
my $forum_title = $$unread{$ressymb}{'title'};
my $type = 'Resource';
my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
- my $disclink = $feedurl.'?symb='.&escape($$unread{$ressymb}{symb});
+ my $disclink = $feedurl.'?symb='. &escape($$unread{$ressymb}{symb});
if ($feedurl =~ /bulletinboard/) {
$type = 'Discussion Board';
}
@@ -1956,20 +2325,29 @@ sub display_coursediscussion {
my $css_class = $rowNum%2?' class="LC_odd_row"':'';
my $lastpost = &Apache::lonnavmaps::timeToHumanString(
$$unread{$ressymb}{'lastpost'});
- $r->print(''.$forum_title.' '.&mt($type).' ');
+ $r->print('');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print(' '.
+ ''.&mt($type).' ');
if ($countunread eq 'on') {
my $unreadnum = $$unread{$ressymb}{'unreadcount'};
- $r->print(''.$lastpost.' '.
- $unreadnum.' ');
+ $r->print(''.$lastpost.' '.
+ $unreadnum.' ');
} else {
- $r->print(''.$lastpost.' ');
+ $r->print(''.$lastpost.' ');
}
$r->print(" \n");
}
} elsif ($itemserror) {
- $r->print(''.$itemserror.' ');
+ $r->print(''.$itemserror.' ');
} else {
- $r->print(''.$lt{'noun'}.' ');
+ $r->print(''.$lt{'noun'}.' ');
}
}
@@ -1977,24 +2355,37 @@ sub display_coursenormalmail {
my ($r,$msgcount,$newmsgs) = @_;
my $lctype = lc(&Apache::loncommon::course_type());
if ($msgcount > 0) {
- $r->print(''.
- &mt('Number').' '.&mt('Subject').' '.
- &mt('Sender').' '.
- &mt('Date/Time').' ');
+ $r->print(''.
+ &mt('Number').' '.
+ &mt('Subject').' '.
+ &mt('Sender').' '.
+ &mt('Date/Time').' ');
my $mailcount = 0;
+ my $usediv;
+ if (@{$newmsgs}) {
+ $usediv = 1;
+ }
foreach my $msg (@{$newmsgs}) {
$mailcount ++;
my $css_class = $mailcount%2?' class="LC_odd_row"':'';
$r->print(''.$mailcount
- .'. ');
+ }
+ $r->print(' '
- .$msg->{'shortsub'}.' '
- .$msg->{'from'}.':'.$msg->{'fromdom'}.' '
+ .$msg->{'shortsub'}.' ');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print(' '
+ .$msg->{'from'}.':'.$msg->{'fromdom'}.' '
.$msg->{'sendtime'}.' ');
}
} else {
- $r->print(''.
- &mt('No new '.$lctype.' messages').' ');
+ $r->print(''.
+ &mt('No new '.$lctype.' messages').' ');
}
}
@@ -2002,24 +2393,37 @@ sub display_coursecritmail {
my ($r,$critmsgcount,$critmsgs) = @_;
my $lctype = lc(&Apache::loncommon::course_type());
if ($critmsgcount > 0) {
- $r->print(''.
- &mt('Number').' '.&mt('Subject').' '.
- &mt('Sender').' '.
- &mt('Date/Time').' ');
+ $r->print(''.
+ &mt('Number').' '.&mt('Subject').' '.
+ &mt('Sender').' '.
+ &mt('Date/Time').' ');
my $mailcount = 0;
+ my $usediv;
+ if (@{$critmsgs} > 1) {
+ $usediv = 1;
+ }
foreach my $msg (@{$critmsgs}) {
$mailcount ++;
my $css_class = $mailcount%2?' class="LC_odd_row"':'';
$r->print(''.$mailcount.
- '. '.
- $msg->{'shortsub'}.' '.
+ '. '.
+ '');
+ if ($usediv) {
+ $r->print('');
+ }
+ $r->print(' '.
$msg->{'from'}.':'.$msg->{'fromdom'}.' '.
$msg->{'sendtime'}.' ');
}
} else {
- $r->print(''.
+ $r->print(' '.
&mt('No unread critical messages in '.$lctype).
- ' ');
+ '');
}
}
@@ -2079,6 +2483,8 @@ sub store_interval_setting {
$interval_settings{$cid.':newroleinterval'} = $env{'form.interval'};
} elsif ($context eq 'crslogin') {
$interval_settings{$cid.':crslogininterval'} = $env{'form.interval'};
+ } elsif ($context eq 'sessions') {
+ $interval_settings{$cid.':sessionactivity'} = $env{'form.interval'};
} else {
$interval_settings{$cid.':interval'} = $env{'form.interval'};
}
@@ -2151,7 +2557,7 @@ sub store_courseinit_setting {
$result = &Apache::lonhtmlcommon::confirm_success(&mt("Page displayed after role selection in $lctype now set by [_1]user's global preferences[_2].",'',' '));
} else {
$result = &Apache::lonhtmlcommon::confirm_success(&mt('Page displayed after role selection in this '.$lctype.' set to [_1].'
- ,''.$$initpage{$env{'form.courseinit_page'}}.' '));
+ ,''.&mt($initpage->{$env{'form.courseinit_page'}}).' '));
}
} else {
&Apache::lonnet::logthis('Error saving whatsnew courseinit '.
@@ -2164,7 +2570,7 @@ sub store_courseinit_setting {
''.$outcome.' '),1);
} else {
$result = &Apache::lonhtmlcommon::confirm_success(&mt('Unable to set page display, after role selection, for this '.$lctype.' to [_1] due to [_2].'
- ,''.$$initpage{$env{'form.courseinit_page'}}.' '
+ ,''.&mt($initpage->{$env{'form.courseinit_page'}}).' '
,''.$outcome.' '),1);
}
}
@@ -2237,11 +2643,17 @@ sub start_box {
if ($$show{$caller}) {
$r->print('
-
+
+ ');
+ }
+ } elsif (($caller eq 'sessions') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
');
}
}
-
$r->print('