--- loncom/interface/lonwhatsnew.pm 2005/04/05 22:49:17 1.1
+++ loncom/interface/lonwhatsnew.pm 2006/01/09 22:55:47 1.48
@@ -1,15 +1,44 @@
+#
+# $Id: lonwhatsnew.pm,v 1.48 2006/01/09 22:55:47 raeburn Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+
+
package Apache::lonwhatsnew;
use strict;
use lib qw(/home/httpd/lib/perl);
use Apache::lonnet;
-use Apache::loncommon;
-use Apache::lonhtmlcommon;
+use Apache::loncommon();
+use Apache::lonhtmlcommon();
use Apache::lonlocal;
-use Apache::loncoursedata;
-use Apache::lonnavmaps;
+use Apache::loncoursedata();
+use Apache::lonnavmaps();
+use Apache::lonuserstate;
use Apache::Constants qw(:common :http);
use Time::Local;
+use GDBM_File;
#----------------------------
# handler
@@ -18,22 +47,84 @@ use Time::Local;
sub handler {
my $r = shift;
- &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['command']);
+ if ($r->header_only) {
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+ return OK;
+ }
+ &Apache::loncommon::get_unprocessed_cgi(
+ $ENV{'QUERY_STRING'},['command','refpage']);
- my $command = $ENV{'form.command'};
+ my $command = $env{'form.command'};
+ my $refpage = $env{'form.refpage'};
- if ($command eq '') {
- $command = "info";
+ my %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],
+ ) {
+ my ($perm,$key,$check_section) = @{ $perm_check };
+ my $scope = $env{'request.course.id'};
+ if (!($checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope))) {
+ $scope .= '/'.$env{'request.course.sec'};
+ if ( $check_section ) {
+ $checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope);
+ }
+ if ($checkallowed{$key}) {
+ $checkallowed{$key.'_section'} = $env{'request.course.sec'};
+ }
+ }
}
- $r->print(&display_header());
- if (! (($ENV{'request.course.fn'}) && (&Apache::lonnet::allowed('vsa',$ENV{'request.course.id'})))) {
- # Not in a course, or not allowed to modify parms
- $ENV{'user.error.msg'}="/adm/whatsnew:vsa:0:0:Cannot display student activity";
+ if ( ! $env{'request.course.fn'} || ! $checkallowed{'whatsnew'}) {
+ # Not in a course, or no whn priv in course
+ $env{'user.error.msg'}="/adm/whatsnew::whn:0:0:Cannot display what's new page";
return HTTP_NOT_ACCEPTABLE;
}
- &display_main_box($r,$command);
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+
+ $r->print(&display_header($command,\%checkallowed));
+
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew',
+ text=>"Display Action Items"});
+ if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
+ text=>"Change thresholds"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ (undef,"What's New?",'Course_Action_Items_Thresholds'));
+ } elsif (($command eq 'chginterval') && $checkallowed{'versionchanges'} ) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
+ text=>"Change interval"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ (undef,"What's New?",'Course_Action_Items_Intervals'));
+ } elsif (($command eq 'chgdisc') && $checkallowed{'coursediscussion'}) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
+ text=>"Change discussion display"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ (undef,"What's New?",'Course_Action_Items_Intervals'));
+ } elsif ($command eq 'courseinit') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/whatsnew?command=courseinit&refpage='.$refpage,
+ text=>"Course initialization preference"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ (undef,"What's New?",'Course_Action_Items_Initialization'));
+ } else {
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs
+ (undef,"What's New?",'Course_Action_Items_Display'));
+ }
+ &display_main_box($r,$command,$refpage,\%checkallowed);
+ return OK;
}
#------------------------------
@@ -43,66 +134,51 @@ sub handler {
#------------------------------
sub display_main_box {
- my ($r,$command) = @_;
+ my ($r,$command,$refpage,$checkallowed) = @_;
my $domain=&Apache::loncommon::determinedomain();
- my $tabbg=&Apache::loncommon::designparm('coordinator.tabbg',$domain);
- $r->print(<
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Course Action Items
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-END_OF_BLOCK
- &display_nav_box($r,$command);
- $r->print('
');
- $r->print('');
-
- if ($command eq 'config') {
- &display_config_box($r);
+ my $function = &Apache::loncommon::get_users_function();
+ my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);
+ $r->print('');
+
+ my %threshold_titles = &Apache::lonlocal::texthash (
+ av_attempts => 'Average number of attempts',
+ degdiff => 'Degree of difficulty',
+ numstudents => 'Total number of students with submissions',
+ );
+
+ my %interval_titles = &Apache::lonlocal::texthash (
+ -1 => 'since start of course',
+ 2592000 => 'since last month',
+ 604800 => 'since last week',
+ 86400 => 'since yesterday',
+ );
+
+ my %initpage = &Apache::lonlocal::texthash (
+ firstres => 'first resource in the course',
+ whatsnew => "what's new? page",
+ userpref => 'your general user preferences',
+ coursespecific => 'specific setting for this course',
+ );
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+
+ if (($command eq 'chgthreshold')
+ && $checkallowed->{'abovethreshold'}) {
+ &display_threshold_config($r,$refpage,$tabbg,\%threshold_titles,
+ $cdom,$crs);
+ } elsif (($command eq 'chginterval')
+ && $checkallowed->{'versionchanges'}) {
+ &display_interval_config($r,$refpage,\%interval_titles);
+ } elsif (($command eq 'chgdisc')
+ && $checkallowed->{'coursediscussion'}) {
+ &display_discussion_config($r,$refpage);
+ } elsif ($command eq 'courseinit') {
+ &courseinit_config($r,$refpage,\%initpage);
} else {
- &display_actions_box($r);
+ &display_actions_box($r,$tabbg,$command,$refpage,\%threshold_titles,
+ \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
}
$r->print(<
-
-
-
-
-
-
-
-
-
-
-
@@ -111,37 +187,6 @@ END_OF_BLOCK
END_OF_BLOCK
}
-#------------------------------
-# display_nav_box
-#
-# Display the navigation box
-#------------------------------
-
-sub display_nav_box {
- my ($r,$command) = @_;
- $r->print(''."\n");
- if ($command eq "info") {
- $r->print('');
- $r->print('Action Items ');
- $r->print(' ');
- } else {
- $r->print('');
- $r->print('Current Action Items ');
- $r->print(' ');
- }
- $r->print(' ');
- if ($command eq "config") {
- $r->print('');
- $r->print('Display options ');
- $r->print(' ');
- } else {
- $r->print('');
- $r->print('Display options ');
- $r->print(' ');
- }
- $r->print('
');
-}
-
#-------------------------------
# display_header
#
@@ -149,12 +194,38 @@ sub display_nav_box {
# up the HTML
#-------------------------------
-sub display_header{
+sub display_header {
+ my ($command,$checkallowed) = @_;
+ my $html=&Apache::lonxml::xmlbegin();
my $bodytag=&Apache::loncommon::bodytag('Course Action Items');
+ my $scripttag;
+ unless ($command eq 'chgthreshold' || $command eq 'chginterval') {
+ $scripttag = <<"END";
+
+';
+ }
return(<
+$html
Course Action Items
+$scripttag
$bodytag
ENDHEAD
@@ -167,339 +238,864 @@ ENDHEAD
#
#-------------------------------
-sub display_actions_box() {
- my $r = shift;
-
+sub display_actions_box {
+ my ($r,$tabbg,$command,$refpage,$threshold_titles,$interval_titles,
+ $initpage,$cdom,$crs,$checkallowed) = @_;
my $rowColor1 = "#ffffff";
my $rowColor2 = "#eeeeee";
- my $rowColor;
+
+ my $udom = $env{'user.domain'};
+ my $uname = $env{'user.name'};
+ my $cid = $env{'request.course.id'};
+
+ my %lt = &Apache::lonlocal::texthash(
+ 'yacc' => 'You are accessing an invalid course.',
+ 'gtfr' => 'Go to first resource',
+ 'pgse' => 'Page set to be displayed after you have selected a role in this course?',
+ 'hial' => 'Hide all',
+ 'shal' => 'Show all',
+ );
my %unread = ();
my %ungraded = ();
my %bombed = ();
+ my %triggered = ();
+ my %changed = ();
my @newmsgs = ();
my @critmsgs = ();
my @newdiscussions = ();
my @tograde = ();
my @bombs = ();
+ my @warnings = ();
+ my $msgcount = 0;
+ my $critmsgcount = 0;
- my $domain=&Apache::loncommon::determinedomain();
- my $function;
- if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {
- $function='coordinator';
- }
- if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {
- $function='admin';
+ my %res_title = ();
+ my %show = ();
+ my $needitems = 0;
+ my $boxcount = 0;
+
+ my $result;
+ if ($command eq 'newcourseinit') {
+ $result = &store_courseinit_setting($uname,$udom,$cid,$initpage);
}
- my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);
- my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);
+ my %threshold = (
+ av_attempts => 2,
+ degdiff => 0.5,
+ numstudents => 2,
+ );
+ my %pagedesc = &Apache::lonlocal::texthash (
+ firstres => 'First resource',
+ whatsnew => "What's New? page",
+ userpref => 'user preference',
+ coursespecific => 'course only',
+ default => 'default',
+ );
- &getitems(\%unread,\%ungraded,\%bombed,\@newdiscussions,\@tograde,\@bombs);
- my ($msgcount,$critmsgcount) = &getmail(\@newmsgs,\@critmsgs);
+ my ($initcontrol,$initdisp) = &curr_courseinit();
+ my $currinit = $pagedesc{$initdisp}.' ('.$pagedesc{$initcontrol}.')';
- unless ($ENV{'request.course.id'}) {
- $r->print('You are accessing an invalid course ');
+ unless ($cid) {
+ $r->print(''.$lt{'yacc'}.' ');
return;
}
- $r->print('Course Action Items ');
+ if ($refpage eq 'start') {
+ if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
+ &GDBM_READER(),0640)) {
+ my $furl=$bighash{'first_url'};
+ untie(%bighash);
+ $r->print(''.$lt{'gtfr'}.
+ ' ');
+ }
+ }
+ $r->print($lt{'pgse'}.' '.&mt('Currently: [_1]',''.$currinit.' ').
+ ' '.&mt('[_1] for just [_2]','Change ',
+ 'this course ').' '.&mt('or for all [_1].',
+ 'your courses ').' ');
+
+ if ($command eq 'reset') {
+ $result = &process_reset($cdom,$crs);
+ } elsif ($command eq 'update') {
+ $result = &process_update($uname,$udom,$threshold_titles);
+ } elsif ($command eq 'newinterval') {
+ $result = &store_interval_setting($uname,$udom,$cid,$interval_titles);
+ } elsif ($command eq 'newdiscconf') {
+ $result = &store_discussion_setting($uname,$udom,$cid);
+ }
-## UNREAD COURSE DISCUSSION POSTS ##
- $r->print(<<"END");
-
-
-
-
- Unread course discussion posts:
-
-
-
-
-END
+ my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);
- if (@newdiscussions > 0) {
-# @newdiscussions = sort { &cmp_title($a,$b) } @newdiscussions;
- my $rowNum = 0;
- foreach my $ressymb (@newdiscussions) {
- my $forum_title = $unread{$ressymb}{'title'};
- my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ressymb);
- my $feedurl = &Apache::lonnet::clutter($url);
-# backward compatibility (bulletin boards used to be 'wrapped')
- if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
- $feedurl=~s|^/adm/wrapper||;
- }
- my $unreadnum = keys %{$unread{$ressymb}};
- $unreadnum = $unreadnum - 2;
- if ($unreadnum > 0) {
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
- }
- $r->print(''.$forum_title.': '.$unreadnum.' ');
- $rowNum ++;
- }
- }
- } else {
- $r->print(' No unread posts in course discussions ');
+ unless ($store_result eq 'ok') {
+ &Apache::lonnet::logthis('Error storing whatsnew settings: '.
+ $store_result.' for '.'user '.$uname.':'.$udom.' in course '.$cid);
+ $result .= &mt('Unable to store visibility settings due to [_1]',
+ $store_result);
}
- $r->print('
');
-## UNGRADED ITEMS ##
- $r->print(<
-
-
-
- Problems requiring handgrading:
-
-
-
-END
+ if ($result) {
+ $r->print($result.' ');
+ }
+ $r->rflush();
- if (@tograde > 0) {
- $r->print('Problem Name Number ungraded ');
- my $rowNum = 0;
- foreach my $res (@tograde) {
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
+
+ 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';
+ }
+
+ my %headings = &Apache::lonlocal::texthash(
+ coursediscussion => 'Unread course discussion posts',
+ handgrading => 'Problems requiring handgrading',
+ haserrors => 'Problems with errors',
+ versionchanges => 'Resources in course with version changes '.$interval,
+ coursenormalmail => 'New course messages',
+ coursecritmail => 'New critical messages in course',
+ );
+
+ if ($$checkallowed{'abovethreshold'}) {
+ &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
+ }
+
+ $headings{'abovethreshold'} = &mt('Problems with av. attempts').' ≥ '.$threshold{'av_attempts'}.' '.&mt('or deg. difficulty').' ≥ '.$threshold{'degdiff'}.' '.&mt('and total number of students with submissions').' ≥ '.$threshold{'numstudents'};
+
+ my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail');
+
+ foreach my $key (keys(%{$checkallowed})) {
+ if ($key =~ /_section$/) { next; }
+ $show{$key} = 0;
+ if ($$checkallowed{$key}) {
+ unless ($display_settings{$cid.':'.$key} eq 'hide') {
+ $show{$key} = 1;
}
-
- $r->print(''.$ungraded{$res}{title}.' '.$ungraded{$res}{count}.' ');
- $rowNum ++;
}
- } else {
- $r->print(' No problems require handgrading ');
}
- $r->print('
');
- $r->print(' ');
-## MESSAGES ##
- $r->print(<
-
-
-
-
- New course messages
-
-
-
-
-END
- if ($msgcount > 0) {
- my $rowNum = 0;
- my $mailcount = 1;
- foreach my $msg (@newmsgs) {
- if ($rowNum %2 == 1) {
- $rowColor = $rowColor1;
- } else {
- $rowColor = $rowColor2;
+ foreach my $item (@actionorder) {
+ unless ($item eq 'coursenormalmail' || $item eq 'coursecritmail') {
+ if ($show{$item}) {
+ $needitems = 1;
+ last;
}
- $r->print(''.$mailcount.'. '.$msg->{'shortsub'}.' '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' '.$msg->{'sendtime'}.' ');
- $rowNum ++;
- $mailcount ++;
}
- } else {
- $r->print('No new course messages ');
}
- $r->print('
');
+ if ($needitems) {
+ &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\%changed,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2,\%threshold,$cdom,$crs,\%res_title,\%show,$starttime,$countunread);
+ }
+ if ($show{'coursenormalmail'}) {
+ &getnormalmail(\@newmsgs);
+ }
+ if ($show{'coursecritmail'}) {
+ &getcritmail(\@critmsgs);
+ }
- $r->print(<
-
-
-
-
- New critical messages in course
-
-
-
-END
+ $r->print(qq|$lt{'hial'}
+ $lt{'shal'}
+ ');
+
+ my $displayed = 0;
+ my $totalboxes = 0;
+ foreach my $key (keys(%{$checkallowed})) {
+ if ($key =~ /_section$/) { next; }
+ if ($key eq 'whatsnew' ) { next; } # whatsnew check creates no box
+ if ($$checkallowed{$key}) {
+ $totalboxes ++;
+ }
+ }
+ my $halfway = int($totalboxes/2) + $totalboxes%2;
+ foreach my $actionitem (@actionorder) {
+ if ($$checkallowed{$actionitem}) {
+ if ($displayed == $halfway) {
+ $r->print(' ');
}
- $r->print(' '.$mailcount.'. '.$msg->{'shortsub'}.' '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' '.$msg->{'sendtime'}.' ');
- $rowNum ++;
- $mailcount ++;
+ &display_launcher($r,$actionitem,$refpage,$checkallowed,$tabbg,$rowColor1,$rowColor2,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,$interval,$countunread);
+ $displayed ++;
}
- } else {
- $r->print('No unread critical messages in course ');
}
-
- $r->print('
');
+ $r->print('
+
+
+
+
+
+
+ ');
+}
-## BOMBS ##
- $r->print(<
+#-------------------------------
+# display_threshold_config
+#
+# Display the threshold setting screen
+#
+#-------------------------------
+
+sub display_threshold_config {
+ my ($r,$refpage,$tabbg,$threshold_titles,$cdom,$crs) = @_;
+ my $uname = $env{'user.name'};
+ my $udom = $env{'user.dom'};
+ my $cid = $env{'request.course.id'};
+ my %threshold = ();
+ my $rowColor1 = "#ffffff";
+ my $rowColor2 = "#eeeeee";
+ my $rowColor;
+
+ my @thresholditems = ("av_attempts","degdiff","numstudents");
+ foreach my $item (@thresholditems) {
+ $threshold{$item} = '';
+ }
+ my %threshold_titles = &Apache::lonlocal::texthash(
+ av_attempts => 'Average number of attempts',
+ degdiff => 'Degree of difficulty',
+ numstudents => 'Total number of students with submissions',
+ );
+ &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
+
+ $r->print(''.
+ ' '."\n".
+ ' '.
+ "\n");
+ $r->print(''.$lt{'reso'}.' '.$lt{'part'}.' '.$lt{'nust'}.' '.$lt{'avat'}.' '.$lt{'dedi'}.' '.$lt{'lare'}.' '.$lt{'reco'}.' ');
+ foreach my $res (@{$warnings}) {
+ if ($warningnum %2 == 1) {
+ $rowColor = $rowColor1;
+ } else {
+ $rowColor = $rowColor2;
+ }
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
+ my $linkurl=&Apache::lonnet::clutter($url);
+ my $rowspan;
+ if ($$triggered{$res}{numparts} > 1) {
+ $rowspan = 'rowspan="'.$$triggered{$res}{numparts}.'"';
+ }
+ $linkurl .= '?symb='.&Apache::lonnet::escape($res);
+ $r->print(''.$$triggered{$res}{title}.' '.$$triggered{$res}{text});
+ $warningnum ++;
+ }
+ $r->print(' ');
+ } else {
+ $r->print(''.$lt{'nopr'}.' ');
+ }
+}
+
+sub display_versionchanges {
+ my ($r,$changed,$res_title,$rowColor1,$rowColor2,$interval) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ 'reso' => 'Resource',
+ 'revd' => 'Last revised',
+ 'newv' => 'New version',
+ 'veru' => 'Version used',
+ 'noup' => 'No updated versions',
+ );
+ my $rowColor;
+ if (keys(%{$changed}) > 0) {
+ $r->print(''.$lt{'reso'}.' '.$lt{'revd'}.' '.$lt{'newv'}.' '.$lt{'veru'}.' ');
+
+
+ my @changes = sort { &cmp_title($a,$b,$res_title) } keys(%{$changed});
+ my $changenum = 0;
+ foreach my $item (@changes) {
+ if ($changenum %2 == 1) {
+ $rowColor = $rowColor1;
+ } else {
+ $rowColor = $rowColor2;
+ }
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($item);
+ my $linkurl=&Apache::lonnet::clutter($url);
+ $linkurl .= '?symb='.&Apache::lonnet::escape($item);
+
+ $r->print(''.$$res_title{$item}.' '.$$changed{$item}{'revdate'}.' '.$$changed{$item}{'current'}.' '.$$changed{$item}{'version'}.' ');
+ $changenum ++;
+ }
+ } else {
+ $r->print(''.$lt{'noup'}.' '.$interval.' ');
+ }
+ return;
+}
+
+sub display_coursediscussion {
+ my ($r,$newdiscussions,$unread,$countunread,$res_title,$rowColor1,
+ $rowColor2) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ 'loca' => 'Location',
+ 'type' => 'Type',
+ 'numn' => 'Number of new posts',
+ 'noun' => 'No unread posts in course discussions',
+ 'tmlp' => 'Time of last post',
+ );
+ my $rowColor;
+ if (@{$newdiscussions} > 0) {
+ $r->print(''.$lt{'loca'}.
+ ' '.$lt{'type'}.
+ ' ');
+ if ($countunread eq 'on') {
+ $r->print(''.$lt{'tmlp'}.' '.
+ ''.$lt{'numn'}.
+ ' ');
+ } else {
+ $r->print(''.$lt{'tmlp'}.
+ ' ');
+ }
+ $r->print(" \n");
+ @{$newdiscussions} = sort { &cmp_title($a,$b,$res_title) }
+ @{$newdiscussions};
+ my $rowNum = 0;
+ foreach my $ressymb (@{$newdiscussions}) {
+ my $forum_title = $$unread{$ressymb}{'title'};
+ my $type = 'Resource';
+ my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
+ if ($feedurl =~ /bulletinboard/) {
+ $type = 'Bulletin Board';
+ }
+ if ($rowNum %2 == 1) {
+ $rowColor = $rowColor1;
+ } else {
+ $rowColor = $rowColor2;
+ }
+ my $lastpost = &Apache::lonnavmaps::timeToHumanString(
+ $$unread{$ressymb}{'lastpost'});
+ $r->print(''.$forum_title.' '.$type.' ');
+ if ($countunread eq 'on') {
+ my $unreadnum = $$unread{$ressymb}{'unreadcount'};
+ $r->print(''.$lastpost.' '.
+ '',$unreadnum.' ');
+ } else {
+ $r->print(''.$lastpost.' ');
+ }
+ $r->print(" \n");
+ $rowNum ++;
+ }
+ } else {
+ $r->print(' '.
+ $lt{'noun'}.' ');
+ }
+}
+
+sub display_coursenormalmail {
+ my ($r,$msgcount,$newmsgs,$rowColor1,$rowColor2) = @_;
+ my $rowColor;
+ if ($msgcount > 0) {
+ $r->print(''.&mt('Number').' '.&mt('Subject').' '.&mt('Sender').' '.&mt('Date/Time').' ');
+ my $rowNum = 0;
+ my $mailcount = 1;
+ foreach my $msg (@{$newmsgs}) {
+ if ($rowNum %2 == 1) {
+ $rowColor = $rowColor1;
+ } else {
+ $rowColor = $rowColor2;
+ }
+ $r->print(''.$mailcount.'. '.$msg->{'shortsub'}.' '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' '.$msg->{'sendtime'}.' ');
+ $rowNum ++;
+ $mailcount ++;
+ }
+ } else {
+ $r->print(''.&mt('No new course messages').' ');
+ }
+}
+
+sub display_coursecritmail {
+ my ($r,$critmsgcount,$critmsgs,$rowColor1,$rowColor2) = @_;
+ my $rowColor;
+ if ($critmsgcount > 0) {
+ $r->print(''.&mt('Number').' '.&mt('Subject').' '.&mt('Sender').' '.&mt('Date/Time').' ');
+ my $rowNum = 0;
+ my $mailcount = 1;
+ foreach my $msg (@{$critmsgs}) {
+ if ($rowNum %2 == 1) {
+ $rowColor = $rowColor1;
+ } else {
+ $rowColor = $rowColor2;
+ }
+ $r->print(''.$mailcount.'. '.$msg->{'shortsub'}.' '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' '.$msg->{'sendtime'}.' ');
+ $rowNum ++;
+ $mailcount ++;
+ }
+ } else {
+ $r->print(''.&mt('No unread critical messages in course').' ');
+ }
}
sub cmp_title {
- my ($atitle,$btitle) = (lc($_[0]->compTitle),lc($_[1]->compTitle));
+ my ($a,$b,$res_title) = @_;
+ my ($atitle,$btitle) = (lc($$res_title{$a}),lc($$res_title{$b}));
$atitle=~s/^\s*//;
$btitle=~s/^\s*//;
return $atitle cmp $btitle;
}
+sub get_display_settings {
+ my ($uname,$udom,$cid) = @_;
+ my %settings = &Apache::lonnet::dump('nohist_whatsnew',$udom,$uname,$cid);
+ my ($tmp) = keys(%settings);
+ if ($tmp=~ /^(con_lost|error|no_such_host)/i) {
+ %settings = ();
+ unless ($tmp =~ /^error: 2 /) {
+ &Apache::lonnet::logthis('Error retrieving whatsnew settings: '.
+ $tmp.' for '.$uname.':'.$udom.' for course: '.$cid);
+ }
+ }
+ return %settings;
+}
+
+sub store_display_settings {
+ my ($uname,$udom,$cid,$checkallowed) = @_;
+ my %whatsnew_settings;
+ my $result;
+ foreach my $key (keys(%{$checkallowed})) {
+ if ($key =~ /_section$/) { next; }
+ if (exists($env{'form.display_'.$key})) {
+ unless ($env{'form.display_'.$key} eq '') {
+ $whatsnew_settings{$cid.':'.$key} = $env{'form.display_'.$key};
+ }
+ }
+ }
+ if (keys(%whatsnew_settings)) {
+ $result = &Apache::lonnet::put('nohist_whatsnew',\%whatsnew_settings,
+ $udom,$uname);
+ } else {
+ $result = 'ok';
+ }
+ return $result;
+}
+
+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 $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'}}.' ');
+
+ } else {
+ &Apache::lonnet::logthis('Error storing whatsnew interval setting'.
+ ' '.$outcome.' for '.$uname.':'.$udom.' in course '.$cid);
+ $result = &mt('Unable to set interval to [_1] due to [_2].',
+ ''.$$interval_titles{$env{'form.interval'}}.' ',
+ ''.$outcome.' . ');
+ }
+ }
+ return $result;
+}
+
+sub store_discussion_setting {
+ my ($uname,$udom,$cid) = @_;
+ my %discussion_settings;
+ my $result;
+ if (defined($env{'form.countunread'})) {
+ $discussion_settings{$cid.':countunread'} = $env{'form.countunread'};
+ my $outcome = &Apache::lonnet::put('nohist_whatsnew',
+ \%discussion_settings,$udom,$uname);
+ if ($outcome eq 'ok') {
+ $result = &mt('Count unread posts in discussions display set to [_1]',
+ ''.$env{'form.countunread'}.' ');
+
+ } else {
+ &Apache::lonnet::logthis('Error storing whatsnew countunread setting'.
+ ' '.$outcome.' for '.$uname.':'.$udom.' in course '.$cid);
+ $result = &mt('Unable to set "number unread posts display" to [_1]'.
+ ' due to [_2].',
+ ''.$env{'form.countunread'}.' ',
+ ''.$outcome.' . ');
+ }
+ }
+ return $result;
+}
+
+sub store_courseinit_setting {
+ my ($uname,$udom,$cid,$initpage) = @_;
+ my %courseinit_settings;
+ my $page_control;
+ my $result;
+ if (defined($env{'form.courseinit_control'})) {
+ if ($env{'form.courseinit_control'} eq 'userpref') {
+ $courseinit_settings{$cid.':courseinit'} = '';
+ $page_control = 'global preferences';
+ } else {
+ if (defined($env{'form.courseinit_page'})) {
+ $courseinit_settings{$cid.':courseinit'} =
+ $env{'form.courseinit_page'};
+ $page_control = 'course specific setting';
+ }
+ }
+ if ($page_control) {
+ my $outcome = &Apache::lonnet::put('nohist_whatsnew',
+ \%courseinit_settings,$udom,$uname);
+ if ($outcome eq 'ok') {
+ if ($page_control eq 'global preferences') {
+ $result = &mt('Page displayed after role selection in course now set by [_1]',"user's global preferences .");
+ } else {
+ $result = &mt('Page displayed after role selection in this course set to [_1]',''.$$initpage{$env{'form.courseinit_page'}}.' .');
+ }
+ } else {
+ &Apache::lonnet::logthis('Error storing whatsnew courseinit '.
+ 'setting: '.$outcome.' for '.$uname.
+ ':'.$udom.' in course '.$cid);
+ if ($page_control eq 'global preferences') {
+ $result = &mt('Unable to set control of page display to [_1]'.
+ ' due to [_2].',
+ ''.$page_control.' ',
+ ''.$outcome.' . ');
+ } else {
+ $result = &mt('Unable to set page display, after role selection, for this course to [_1] due to [_2].',
+ ''.$$initpage{$env{'form.courseinit_page'}}.' ',
+ ''.$outcome.' . ');
+ }
+ }
+ }
+ }
+ return $result;
+}
+
+sub start_box {
+ my ($r,$tabbg,$show,$heading,$caller,$refpage) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ chth => 'Change thresholds?',
+ chin => 'Change interval?',
+ chop => 'Change options?',
+ );
+ my $showhide;
+ if ($$show{$caller}) {
+ $showhide = 'Hide ';
+
+ } else {
+ $showhide = 'Show ';
+ }
+
+ $r->print('
+
+
+
+
+
+
+
+
+ '.$$heading{$caller}.'
+ '.$showhide.'
+
+
+
+ ');
+ if (($caller eq 'abovethreshold') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+ '.$lt{'chth'}.'
+ ');
+ }
+ } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {
+ if ($$show{$caller}) {
+ $r->print('
+
+ '.$lt{'chin'}.'
+ ');
+ }
+ } elsif ($caller eq 'coursediscussion') {
+ if ($$show{$caller}) {
+ $r->print('
+
+ '.$lt{'chop'}.'
+ ');
+ }
+ }
+ $r->print('
+
+
+
+');
+ return;
+}
+
+sub end_box {
+ my ($r) = shift;
+ $r->print('
+
+
+
+
+
+
+
');
+ return;
+}
+
+1;