--- loncom/interface/lonwhatsnew.pm 2007/09/26 12:34:19 1.73
+++ loncom/interface/lonwhatsnew.pm 2008/12/12 15:48:05 1.83
@@ -1,5 +1,5 @@
#
-# $Id: lonwhatsnew.pm,v 1.73 2007/09/26 12:34:19 raeburn Exp $
+# $Id: lonwhatsnew.pm,v 1.83 2008/12/12 15:48:05 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,6 +36,7 @@ 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;
@@ -68,6 +69,8 @@ sub handler {
['vgr','abovethreshold',1],
['opa','haserrors',1],
['mdc','versionchanges',0],
+ ['vcl','newroles',1],
+ ['vcl','oldroles',1],
) {
my ($perm,$key,$check_section) = @{ $perm_check };
my $scope = $env{'request.course.id'};
@@ -125,6 +128,20 @@ sub handler {
$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'
+ ));
} else {
$r->print(&Apache::lonhtmlcommon::breadcrumbs
("What's New?",#'Course_Action_Items_Display'
@@ -152,14 +169,29 @@ 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 %interval_titles = (
+ versions => \%versions,
+ newroles => \%newroles,
+ oldroles => \%oldroles,
);
-
my %initpage = &Apache::lonlocal::texthash (
firstres => "first resource in the $lctype",
whatsnew => "what's new? page",
@@ -175,12 +207,18 @@ 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');
} else {
&display_actions_box($r,$command,$refpage,\%threshold_titles,
\%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
@@ -205,12 +243,13 @@ 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') {
$scripttag = <<"END";
');
- $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 'What's New?' page by a few seconds.").' '.&mt("Currently set to $current."));
+ $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 'What's New?' page by a few seconds.")
+ .' '
+ .&mt('Currently set to [_1].',''.$current.'.')
+ );
$r->print('
');
@@ -653,7 +785,8 @@ 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) = @_;
if ($$checkallowed{$action}) {
&start_box($r,$show,$headings,$action,$refpage,$action);
@@ -663,7 +796,7 @@ sub display_launcher {
} elsif ($action eq 'haserrors') { # BOMBS
&display_haserrors($r,$bombs,$bombed,$res_title);
} elsif ($action eq 'versionchanges') { # VERSION CHANGES
- &display_versionchanges($r,$changed,$res_title,$interval);
+ &display_versionchanges($r,$changed,$res_title,$interval->{'versions'});
} elsif ($action eq 'abovethreshold') { # DEGDIFF/AV. TRIES TRIGGERS
&display_abovethreshold($r,$refpage,$warnings,$triggered,
$res_title);
@@ -674,6 +807,12 @@ sub display_launcher {
&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);
}
}
&end_box($r);
@@ -866,10 +1005,10 @@ 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').' | ';
}
$$triggered{$symb}{text}[$partcount] .= '
'.$stats{$part}{users}.' |
@@ -979,7 +1118,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;
@@ -1066,6 +1205,205 @@ 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 checkversions {
my ($cdom,$crs,$navmap,$changed,$starttime) = @_;
@@ -1231,7 +1569,6 @@ sub display_versionchanges {
'revd' => 'Last revised',
'newv' => 'New version',
'veru' => 'Version used',
- 'noup' => 'No updated versions',
);
if (keys(%{$changed}) > 0) {
$r->print(''.
@@ -1254,8 +1591,65 @@ sub display_versionchanges {
$$changed{$item}{'version'}.' |
');
}
} else {
- $r->print(''.$lt{'noup'}.
- ' '.$interval.' |
');
+ $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;
}
@@ -1326,11 +1720,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(''.
@@ -1411,20 +1806,28 @@ 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'};
+ } 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 saving 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.'. ');
}
}
@@ -1441,7 +1844,7 @@ 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());
@@ -1449,7 +1852,7 @@ sub store_discussion_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.'. ');
}
}
@@ -1478,9 +1881,10 @@ 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 saving whatsnew courseinit '.
@@ -1492,8 +1896,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.'')
+ .' ';
}
}
}
@@ -1547,6 +1953,20 @@ sub start_box {
|
');
}
+ } elsif (($caller eq 'newroles') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
+
');
+ }
+ } elsif (($caller eq 'oldroles') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+
+
');
+ }
}
$r->print('