--- loncom/interface/lonmsgdisplay.pm 2006/12/24 22:13:19 1.59 +++ loncom/interface/lonmsgdisplay.pm 2009/06/11 16:48:33 1.126 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.59 2006/12/24 22:13:19 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.126 2009/06/11 16:48:33 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,12 +33,13 @@ package Apache::lonmsgdisplay; =head1 NAME -Apache::lonmsg: supports internal messaging +Apache::lonmsgdisplay: supports internal messaging =head1 SYNOPSIS -lonmsg provides routines for sending messages, receiving messages, and -a handler to allow users to read, send, and delete messages. +lonmsgdisplay provides a handler to allow users to read, send, +and delete messages, and to create and delete message folders, +and to move messages between folders. =head1 OVERVIEW @@ -93,25 +94,6 @@ addresses on their B screen, but g are much more useful than traditional email can be made to be, even with HTML support. -Right now, this document will cover just how to send a message, since -it is likely you will not need to programmatically read messages, -since lonmsg already implements that functionality. - -The routines used to package messages and unpackage messages are not -only used by lonmsg when creating/extracting messages for LON-CAPA's -internal messaging system, but also by lonnotify.pm which is available -for use by Domain Coordinators to broadcast standard e-mail to specified -users in their domain. The XML packaging used in the two cases is very -similar. The differences are the use of $uname and -$udom in stored internal messages, compared -with $email in stored -Domain Coordinator e-mail for the storage of information about -recipients of the message/e-mail. - -=head1 FUNCTIONS - -=over 4 - =cut use strict; @@ -119,6 +101,7 @@ use Apache::lonnet; use HTML::TokeParser(); use Apache::Constants qw(:common); use Apache::loncommon(); +use Apache::lonhtmlcommon(); use Apache::lontexconvert(); use HTML::Entities(); use Apache::lonlocal; @@ -153,6 +136,9 @@ sub folderlist { ); + # set se lastvisit for the new mail check in the toplevel menu + &Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time}); + my %actions = &Apache::lonlocal::texthash( view => 'View Folder', rename => 'Rename Folder', @@ -260,9 +246,9 @@ function folder_choice(targetform,caller      '. - '

-
'.&mt('New Folder').'
'. + '
'.&mt('Name').'
'. '
@@ -370,7 +356,7 @@ sub makefolder { } } else { $outcome = - &mt('Error - could not obtain lock on email folders record.'); + &mt('Error - could not obtain lock on message folders record.'); } return ($outcome,$warning); } @@ -407,6 +393,9 @@ sub renamefolder { if ($env{'form.renamed'} eq '') { return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname); } + if (defined($permfolders{$folder})) { + return &mt('The folder "[_1]" may not be renamed as it is a folder provided by the system.',$folder); + } if (defined($permfolders{$newname})) { return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname); } @@ -516,7 +505,8 @@ sub movemsg { # ======================================================= Display a course list sub discourse { - my $result; + my ($statushash) = @_; + my ($result,$active,$previous,$future); my ($course_personnel, $current_members, $expired_members, @@ -525,51 +515,89 @@ sub discourse { unshift @$current_members, (@$course_personnel); my %defaultUsers; - $result .= ''."\n"; + my $tmptext; + if ($tmptext = &Apache::lonselstudent::render_student_list($current_members, + "activeusers", + "current", + \%defaultUsers, + 1,"selectedusers",1,'email') + ) { + $result .= '
' + .&mt('Bcc: course members with current access') + .'' + .'
'; + $result .= $tmptext.'

'; + if (ref($statushash) eq 'HASH') { + $statushash->{'active'} = 1; + } + } + if ($tmptext = &Apache::lonselstudent::render_student_list($expired_members, + "previoususers", + "expired", + \%defaultUsers, + 1, "selectedusers",0,'email') + ) { + $result .= '
' + .&mt('Bcc: course members with expired access') + .'' + .'
'; + $result .= $tmptext.'

'; + if (ref($statushash) eq 'HASH') { + $statushash->{'previous'} = 1; + } - $result .= &Apache::lonselstudent::render_student_list($current_members, - "compemail", - "current", - \%defaultUsers, - 1,"selectedusers",1); - - $result .= &Apache::lonselstudent::render_student_list($expired_members, - "compemail", - "expired", - \%defaultUsers, - 1, "selectedusers",0); - $result .= &Apache::lonselstudent::render_student_list($future_members, - "compemail", - "future", - \%defaultUsers, - 1, "selectedusers", 0); + } + if ($tmptext = &Apache::lonselstudent::render_student_list($future_members, + "futureusers", + "future", + \%defaultUsers, + 1, "selectedusers",0,'email') + ) { + $result .= '
' + .&mt('Bcc: course members with future access') + .'' + .'
'; + $result .= $tmptext.'
'; + if (ref($statushash) eq 'HASH') { + $statushash->{'future'} = 1; + } + + } return $result; } sub disgroup { - my ($cdom,$cnum,$group,$viewgrps,$editgrps) = @_; - my $result; + my ($r,$cdom,$cnum,$group,$access_status) = @_; + my $hasfloat; # Needs to be in a course if (!($env{'request.course.fn'})) { - $result = &mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.'); - return $result; + $r->print(''.&mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.').''); + return; } if ($cdom eq '' || $cnum eq '') { - $result = &mt('Error: could not determine domain or number of course'); - return $result; + $r->print(''.&mt('Error: could not determine domain or number of course').''); + return; } my ($memberinfo,$numitems) = &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]); my @statustypes = ('active'); + my $viewgrps = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + my $editgrps = &Apache::lonnet::allowed('mdg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); if ($viewgrps || $editgrps) { push(@statustypes,('future','previous')); } if (keys(%{$memberinfo}) == 0) { - $result = &mt('As this group has no members, there are no '. - 'recipients to select.'); - return $result; + $r->print(''. + &mt('As this group has no members, there are no recipients to select'). + ''); + return; } else { - $result = &mt('Select message recipients from the group members listed below.
'); + $hasfloat = 1; + unless($env{'environment.wysiwygeditor'} eq 'on') { + $r->print('
'); + } my %Sortby = ( active => {}, previous => {}, @@ -579,9 +607,9 @@ sub disgroup { 'name' => 'Name', 'usnm' => 'Username', 'doma' => 'Domain', - 'active' => 'Active Members', - 'previous' => 'Former Members', - 'future' => 'Future Members', + 'active' => 'Broadcast to Active Members', + 'previous' => 'Broadcast (Bcc) to Former Members', + 'future' => 'Broadcast (Bcc) to Future Members', ); foreach my $user (sort(keys(%{$memberinfo}))) { my $status = $$memberinfo{$user}{status}; @@ -595,71 +623,76 @@ sub disgroup { push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user); } } - $result .= &group_check_uncheck(); - $result .= ''. - ''; + $r->print(&group_check_uncheck()); foreach my $status (@statustypes) { if (ref($numitems) eq 'HASH') { if ((defined($$numitems{$status})) && ($$numitems{$status})) { - $result.='". - "". - "". - &Apache::loncommon::end_data_table_header_row(); + my $formname = $status.'users'; + if (ref($access_status) eq 'HASH') { + $access_status->{$status} = $$numitems{$status}; + } + $r->print('
'. + ''.$lt{$status}.''. + '
'. + ''. + ''. + '  '. + ''. + ''); + if ($status eq 'active') { + $r->print((' 'x3).''); + } + $r->print('
'.&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + "
". + "". + "". + &Apache::loncommon::end_data_table_header_row()); foreach my $key (sort(keys(%{$Sortby{$status}}))) { foreach my $user (@{$Sortby{$status}{$key}}) { - $result .= - &Apache::loncommon::start_data_table_row(). - ''. + $$memberinfo{$user}{'fullname'}.''. ''. ''. - &Apache::loncommon::end_data_table_row(); + &Apache::loncommon::end_data_table_row()); } } - $result .= &Apache::loncommon::end_data_table(); + $r->print(&Apache::loncommon::end_data_table().''. + '
'); } } - $result .= ''; } - $result .= '
'. - '
'.$lt{$status}. - ''. - ''. - '  '. - ''. - '

'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(); - $result .= "
$lt{'name'}$lt{'usnm'}$lt{'doma'}$lt{'name'}$lt{'usnm'}$lt{'doma'}print(&Apache::loncommon::start_data_table_row(). + ''. - $$memberinfo{$user}{'fullname'}.''.$$memberinfo{$user}{'uname'}.''.$$memberinfo{$user}{'udom'}.'  
'; + unless($env{'environment.wysiwygeditor'} eq 'on') { + $r->print('
'); + } } - return $result; + return $hasfloat; } sub group_check_uncheck { my $output = qq| + +|; + } + } if ($forwarding) { %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]); %content=&Apache::lonmsg::unpackagemsg($message{$forwarding},$folder); $dispcrit.=''; - $func=&mt('Forward'); + $func1='Forward'; # do not translate here! $dissub=&mt('Forwarding').': '.$content{'subject'}; $dismsg=&mt('Forwarded message from').' '. @@ -1246,7 +1406,7 @@ sub compout { %content=&Apache::lonmsg::unpackagemsg($message{$replying},$folder); $dispcrit.=''; - $func=&mt('Send Reply to'); + $func1='Send Reply to'; # do not translate here! $dissub=&mt('Reply').': '.$content{'subject'}; $dismsg='> '.$content{'message'}; @@ -1256,56 +1416,140 @@ sub compout { if ($content{'baseurl'}) { $disbase=''; if ($env{'user.adv'}) { - $disbase.='