--- loncom/interface/lonmsgdisplay.pm 2006/06/30 02:06:15 1.35.2.2
+++ loncom/interface/lonmsgdisplay.pm 2008/11/25 21:59:24 1.98
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.35.2.2 2006/06/30 02:06:15 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.98 2008/11/25 21:59:24 schafran 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
@@ -74,8 +75,8 @@ email program, so they have full access
interface, or other features they may wish to use in response to the
student's query.
-=item * B: LON-CAPA can block display of e-mails that are
-sent to a student during an online exam. A course coordinator or
+=item * B: LON-CAPA can block selected communication
+features for students during an online exam. A course coordinator or
instructor can set an open and close date/time for scheduled online
exams in a course. If a user uses the LON-CAPA internal messaging
system to display e-mails during the scheduled blocking event,
@@ -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;
@@ -132,44 +115,189 @@ use LONCAPA;
# Querystring component with sorting type
my $sqs;
my $startdis;
-my $interdis;
# ============================================================ List all folders
sub folderlist {
- my $folder=shift;
- my @allfolders=&Apache::lonnet::getkeys('email_folders');
- if ($allfolders[0]=~/^error:/) { @allfolders=(); }
- return '':'');
+ ' '.
+ ($folder=~/^critical/?'':'');
+ return $output;
+}
+
+sub get_permanent_folders {
+ my %permfolders =
+ &Apache::lonlocal::texthash('' => 'INBOX',
+ 'trash' => 'TRASH',
+ 'critical' => 'Critical',
+ 'sent' => 'Sent Messages',
+ );
+ return %permfolders;
+}
+
+sub get_msgstatus_types {
+ my %statushash = &Apache::lonlocal::texthash(
+ '' => 'Any',
+ new => 'Unread',
+ read => 'Read',
+ replied => 'Replied to',
+ forwarded => 'Forwarded',
+ );
+ return %statushash;
}
sub scrollbuttons {
- my ($start,$maxdis,$first,$finish,$total)=@_;
+ my ($start,$maxdis,$first,$finish,$total,$msgstatus)=@_;
unless ($total>0) { return ''; }
$start++; $maxdis++;$first++;$finish++;
+
+ my %statushash = &get_msgstatus_types();
+ my $status;
+ if ($msgstatus eq '') {
+ $status = &mt('All');
+ } else {
+ $status = $statushash{$msgstatus};
+ }
return
- &mt('Page').': '.
+ ''.&mt('Page').' : '.
' '.
' '.
' of '.$maxdis.
' '.
' '.
- &mt('Showing messages [_1] through [_2] of [_3]',$first,$finish,$total).'';
+ &mt('[_1] messages : showing messages [_2] through [_3] of [_4].',$status,$first,$finish,$total).'';
}
# =============================================================== Status Change
@@ -195,14 +323,126 @@ sub statuschange {
# ============================================================= Make new folder
sub makefolder {
- my ($newfolder)=@_;
- if (($newfolder eq 'sent')
- || ($newfolder eq 'critical')
- || ($newfolder eq 'trash')
- || ($newfolder eq 'new')) { return; }
- &Apache::lonnet::put('email_folders',{$newfolder => time});
+ my ($newfolder) = @_;
+ my %permfolders = &get_permanent_folders();
+ my %userfolders = &Apache::lonmsg::get_user_folders();
+ my ($outcome,$warning);
+ if (defined($userfolders{$newfolder})) {
+ return &mt('The folder name: "[_1]" is already in use for an existing folder.',$newfolder);
+ }
+ foreach my $perm (keys(%permfolders)) {
+ if ($permfolders{$perm} eq $newfolder) {
+ return &mt('The folder name: "[_1]" is already used for one of the folders automatically generated by the system.',$newfolder);
+ }
+ }
+ if (&get_msgfolder_lock() eq 'ok') {
+ my %counter_hash = &Apache::lonnet::get('email_folders',["\0".'idcount']);
+ my $lastcount = $counter_hash{"\0".'idcount'};
+ my $folder_id = $lastcount + 1;
+ while (defined($userfolders{$folder_id})) {
+ $folder_id ++;
+ }
+ my %folderinfo = ( id => $folder_id,
+ created => time, );
+ $outcome =
+ &Apache::lonnet::put('email_folders',{$newfolder => \%folderinfo,
+ "\0".'idcount' => $folder_id});
+ my $releaseresult = &release_msgfolder_lock();
+ if ($releaseresult ne 'ok') {
+ $warning = $releaseresult;
+ }
+ } else {
+ $outcome =
+ &mt('Error - could not obtain lock on email folders record.');
+ }
+ return ($outcome,$warning);
+}
+
+# ============================================================= Delete folder
+
+sub deletefolder {
+ my ($folder)=@_;
+ my %permfolders = &get_permanent_folders();
+ if (defined($permfolders{$folder})) {
+ return &mt('The folder "[_1]" may not be deleted',$folder);
+ }
+ my %userfolders = &Apache::lonmsg::get_user_folders();
+ if (!defined($userfolders{$folder})) {
+ return &mt('The folder "[_1]" does not exist so deletion is not required.',
+ $folder);
+ }
+ # check folder is empty;
+ my $suffix=&Apache::lonmsg::foldersuffix($folder);
+ my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);
+ if (@messages > 0) {
+ return &mt('The folder "[_1]" contains messages so it may not be deleted.',$folder).
+ ' '.
+ &mt('Delete or move the messages to a different folder first.');
+ }
+ my $delresult = &Apache::lonnet::del('email_folders',[$folder]);
+ return $delresult;
+}
+
+sub renamefolder {
+ my ($folder) = @_;
+ my $newname = $env{'form.renamed'};
+ my %permfolders = &get_permanent_folders();
+ 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);
+ }
+ my %userfolders = &Apache::lonmsg::get_user_folders();
+ if (defined($userfolders{$newname})) {
+ return &mt('The folder "[_1]" may not be renamed to "[_2]" because the new name you requested is already being used for an existing folder.',$folder,$newname);
+ }
+ if (!defined($userfolders{$folder})) {
+ return &mt('The folder "[_1]" could not be renamed to "[_2]" because the folder does not exist.',$folder,$newname);
+ }
+ my %folderinfo;
+ if (ref($userfolders{$folder}) eq 'HASH') {
+ %folderinfo = %{$userfolders{$folder}};
+ } else {
+ %folderinfo = ( id => $folder,
+ created => $userfolders{$folder},);
+ }
+ my $outcome =
+ &Apache::lonnet::put('email_folders',{$newname => \%folderinfo});
+ if ($outcome eq 'ok') {
+ $outcome = &Apache::lonnet::del('email_folders',[$folder]);
+ }
+ return $outcome;
+}
+
+sub get_msgfolder_lock {
+ # get lock for mail folder counter.
+ my $lockhash = { "\0".'lock_counter' => time, };
+ my $tries = 0;
+ my $gotlock = &Apache::lonnet::newput('email_folders',$lockhash);
+ while (($gotlock ne 'ok') && $tries <3) {
+ $tries ++;
+ sleep(1);
+ $gotlock = &Apache::lonnet::newput('email_folders',$lockhash);
+ }
+ return $gotlock;
+}
+
+sub release_msgfolder_lock {
+ # remove lock
+ my @del_lock = ("\0".'lock_counter');
+ my $dellockoutcome=&Apache::lonnet::del('email_folders',\@del_lock);
+ if ($dellockoutcome ne 'ok') {
+ return (' '.&mt('Warning: failed to release lock for counter').' ');
+ } else {
+ return 'ok';
+ }
}
+
# ======================================================== Move between folders
sub movemsg {
@@ -262,7 +502,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,
@@ -270,57 +511,301 @@ sub discourse {
&Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});
unshift @$current_members, (@$course_personnel);
my %defaultUsers;
+
+ 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').' ';
+ 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').' ';
+ if (ref($statushash) eq 'HASH') {
+ $statushash->{'previous'} = 1;
+ }
+
+ }
+ if ($tmptext = &Apache::lonselstudent::render_student_list($future_members,
+ "futureusers",
+ "future",
+ \%defaultUsers,
+ 1, "selectedusers",0,'email')
+ ) {
+ $result .= ''.&mt('Bcc: course members with future access').' ';
+ if (ref($statushash) eq 'HASH') {
+ $statushash->{'future'} = 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);
+ }
+ return $result;
+}
+
+sub disgroup {
+ my ($cdom,$cnum,$group,$access_status) = @_;
+ my $result;
+ # 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
+e-mail to a group in the course.');
+ return $result;
+ }
+ if ($cdom eq '' || $cnum eq '') {
+ $result = &mt('Error: could not determine domain or number of course');
+ return $result;
+ }
+ 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;
+ } else {
+ my %Sortby = (
+ active => {},
+ previous => {},
+ future => {},
+ );
+ my %lt = &Apache::lonlocal::texthash(
+ 'name' => 'Name',
+ 'usnm' => 'Username',
+ 'doma' => 'Domain',
+ '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};
+ if ($env{'form.'.$status.'.sortby'} eq 'fullname') {
+ push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
+ } elsif ($env{'form.'.$status.'.sortby'} eq 'username') {
+ push(@{$Sortby{$status}{$$memberinfo{$user}{uname}}},$user);
+ } elsif ($env{'form.'.$status.'.sortby'} eq 'domain') {
+ push(@{$Sortby{$status}{$$memberinfo{$user}{udom}}},$user);
+ } else {
+ push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
+ }
+ }
+ $result .= &group_check_uncheck();
+ foreach my $status (@statustypes) {
+ if (ref($numitems) eq 'HASH') {
+ if ((defined($$numitems{$status})) && ($$numitems{$status})) {
+ my $formname = $status.'users';
+ if (ref($access_status) eq 'HASH') {
+ $access_status->{$status} = $$numitems{$status};
+ }
+ $result.=''.$lt{$status}.
+ ' ';
+ }
+ }
+ }
+ }
return $result;
}
+sub group_check_uncheck {
+ my $output = qq|
+
+ |;
+}
+
+sub groupmail_header {
+ my ($action,$group,$cdom,$cnum) = @_;
+ my ($description,$refarg);
+ if (!$cdom || !$cnum) {
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ }
+ if (exists($env{'form.ref'})) {
+ $refarg = 'ref='.$env{'form.ref'};
+ }
+ if (!$group) {
+ $group = $env{'form.group'};
+ }
+ if ($group eq '') {
+ return '';
+ } else {
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
+ if (defined($curr_groups{$group})) {
+ my %groupinfo =
+ &Apache::longroup::get_group_settings($curr_groups{$group});
+ $description = &unescape($groupinfo{'description'});
+ }
+ }
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ if ($refarg) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursegroups",
+ text=>"Groups",
+ title=>"View course groups"});
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg",
+ text=>"Group: $description",
+ title=>"Go to group's home page"},
+ {href=>"/adm/email?compose=group&group=".
+ "$env{'form.group'}&$refarg",
+ text=>"Send a Message in a Group",
+ title=>"Compose Group E-mail"},);
+ if ($action eq 'sending') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({text=>"E-mails being sent.",
+ title=>"E-mails sent"},);
+ }
+ my $groupheader = &Apache::loncommon::start_page('Group Email');
+ $groupheader .= &Apache::lonhtmlcommon::breadcrumbs
+ ('Group - '.$env{'form.group'}.' Email');
+ return $groupheader;
+}
+
+sub groupmail_sent {
+ my ($group,$cdom,$cnum) = @_;
+ my $refarg;
+ if (exists($env{'form.ref'})) {
+ $refarg = 'ref='.$env{'form.ref'};
+ }
+ my $output .= ''.
+ &mt('Send another group email').' '.' '.
+ ''. &mt('Return to group page').' ';
+ return $output;
+}
+
# ==================================================== Display Critical Message
sub discrit {
my $r=shift;
- my $header = ''.&mt('Critical Messages').' '.
- '');
if ($numblocked > 0) {
- my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
- my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
- $r->print(' '.
- $numblocked.' '.&mt('message(s) is/are not viewable because display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams.'));
- &build_block_table($r,$startblock,$endblock,\%setters);
+ $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
+ \%setters));
}
}
+sub blocked_in_folder {
+ my ($numblocked,$startblock,$endblock,$setters) = @_;
+ my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
+ my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
+ my $output = ' '.
+ &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock);
+ $output .= &Apache::loncommon::build_block_table($startblock,$endblock,
+ $setters);
+ return $output;
+}
+
# ============================================================== Compose output
sub compout {
- my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_;
+ my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode,
+ $multiforward)=@_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
-
- if ($broadcast eq 'individual') {
+ my ($cdom,$cnum,$group,$refarg);
+ if (exists($env{'form.group'})) {
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $group = $env{'form.group'};
+ my $action = 'composing';
+ $r->print(&groupmail_header($action,$group,$cdom,$cnum));
+ } elsif ($broadcast eq 'individual') {
&printheader($r,'/adm/email?compose=individual',
'Send a Message');
} elsif ($broadcast) {
@@ -731,6 +1230,20 @@ sub compout {
} elsif ($replycrit) {
$r->print(''.&mt('Replying to a Critical Message').' ');
$replying=$replycrit;
+ } elsif ($multiforward) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/email?folder=".&escape($folder),
+ text=>"Display All Messages"});
+ &printheader($r,'/adm/email?compose=multiforward',
+ 'Forwarding Multiple Messages');
+ if ($multiforward > 1) {
+ $r->print(&mt('Each of the [quant,_1,message] you checked'
+ .' will be forwarded to the recipient(s) you select below.',$multiforward)
+ .' ');
+ } else {
+ $r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').' ');
+ }
+
} else {
&printheader($r,'/adm/email?compose=upload',
'Distribute from Uploaded File');
@@ -740,37 +1253,123 @@ sub compout {
my $dissub='';
my $dismsg='';
my $disbase='';
- my $func=&mt('Send New');
- my %lt=&Apache::lonlocal::texthash('us' => 'Username',
- 'do' => 'Domain',
- 'ad' => 'Additional Recipients',
- 'sb' => 'Subject',
- 'ca' => 'Cancel',
- 'ma' => 'Mail');
-
+ my $attachrow;
+ my $func1='Send'; # do not translate here!
+ my %func2=( # do not translate here!
+ 'ma' => 'Message',
+ 'msg' => 'Messages',
+ );
+ my %lt=&Apache::lonlocal::texthash('us' => 'Username',
+ 'do' => 'Domain',
+ 'ad' => 'Additional Recipients',
+ 'rt' => 'Reply to',
+ 'ar' => 'Allow replies',
+ 'sb' => 'Subject',
+ 'ca' => 'Cancel',
+ 'gen' => 'Generate messages from a file',
+ 'gmt' => 'General message text',
+ 'tff' => 'The file format for the uploaded portion of the message is',
+ 'uas' => 'Upload and Send',
+ 'atta' => 'Attachment',
+ 'to' => 'To:',
+ );
+ my %attachmax = (
+ text => &mt('(128 KB max size)'),
+ num => 131072,
+ );
+ if (!$forwarding && !$multiforward) {
+ $attachrow = ''.$lt{'atta'}.' '.$attachmax{'text'}.': ';
+ }
if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
$dispcrit=
- ' '.&mt('Send as critical message').' ' . $crithelp .
- '
'.
- ' '.&mt('Send as critical message').' ' .
- &mt('and return receipt') . ' ' . $crithelp .
- '
'.
-&mt('Send copy to permanent email address (if known)').'
'.
-' '.
- &mt('Include in course RSS newsfeed').'
';
- }
+ ' '.&mt('Send as critical message').'. '.$crithelp.' '.&mt('Require return receipt?').' '.&mt('Yes').' '.&mt('No').' '.
+ ' '.
+&mt('Send copy to permanent email address (if known)').' '.
+' '.
+ &mt('Include in course RSS newsfeed').' ';
+ }
+ if ($broadcast ne 'group') {
+ if (&Apache::lonnet::allowed('dff',$env{'request.course.id'}) ||
+ &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+
+ $dispcrit.=''.
+ ' '.
+ &mt("Include in course's 'User records' for recipient(s)").
+ ' ';
+ }
+ }
+
my %message;
my %content;
+ my ($hasfloat,$broadcast_js,$sendmode,$can_grp_broadcast);
my $defdom=$env{'user.domain'};
+ if ($broadcast eq 'group') {
+ my %access_status = (
+ active => 0,
+ previous => 0,
+ future => 0,
+ );
+
+ if ($group eq '') {
+ my $studentsel = &discourse(\%access_status);
+ if ($studentsel) {
+ $r->print(''.$studentsel.'
');
+ $hasfloat = 1;
+ }
+ } else {
+ $can_grp_broadcast = &check_group_priv($group);
+ if ($can_grp_broadcast) {
+ $r->print(''.
+ &disgroup($cdom,$cnum,$group,\%access_status).
+ '
');
+ $hasfloat = 1;
+ }
+ }
+ if ($hasfloat) {
+ $sendmode = ' '."\n";
+ $broadcast_js = 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').' '.
@@ -784,7 +1383,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'};
@@ -794,101 +1393,324 @@ sub compout {
if ($content{'baseurl'}) {
$disbase=' ';
if ($env{'user.adv'}) {
- $disbase.=' '.&mt('Store message for re-use').
+ $disbase.=' '.&mt('Save message for re-use').
' '.
&mt('Show re-usable messages').' ';
}
}
+ my $jscript = &Apache::loncommon::check_uncheck_jscript();
+ $r->print(<<"ENDREPSCRIPT");
+
+ENDREPSCRIPT
}
my $citation=&displayresource(%content);
+ my $onsubmit;
if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }
if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }
if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }
+ if ($hasfloat) {
+ $r->print($broadcast_js.'');
+ $onsubmit = ' onsubmit="javascript:courseRecipients();" ';
+ }
$r->print(
'
'."\n".
+ ' enctype="multipart/form-data"'.$onsubmit.'>'."\n".
' '."\n".
'');
- unless (($broadcast eq 'group') || ($broadcast eq 'upload')) {
+ if (($broadcast eq 'group') && ($group ne '') && (!$can_grp_broadcast)) {
+ $r->print(&recipient_input_row($cdom,%lt));
+ }
+ if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
if ($replying) {
- $r->print(''.&mt('Replying to').' '.
- &Apache::loncommon::aboutmewrapper(
+ if ($content{'noreplies'}) {
+ $r->print(' '.&mt('This message was designated by the sender not to allow replies.').'
');
+ return;
+ }
+ $r->print('
'.&mt('Replying to').' ');
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(&Apache::loncommon::plainname($replytoname,
+ $replytodom).' ('.$replytoname.':'.
+ $replytodom.')');
+ $r->print(' '.
+ '');
+
+ } else {
+ $r->print(&mt('The sender did not designate a reply to address for this message.').'');
+ return;
+ }
+ } else {
+ $r->print(&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
$content{'sendername'}.':'.
- $content{'senderdomain'}.')'.
- '
'.
- '
'.
- '');
+ $content{'senderdomain'}.')');
+ $r->print('
'.
+ '
');
+ }
+ if ($content{'recipid'}) {
+ my %recips;
+ &retrieve_recips('replying',\%content,\%recips);
+ if (ref($recips{'to'}) eq 'ARRAY') {
+ if (@{$recips{'to'}} > 0) {
+ my $replyall;
+ if (@{$recips{'to'}} > 1) {
+ $replyall = qq|
+
+
+
+
+
+|;
+ }
+ my $tolist = join(' ',@{$recips{'to'}});
+ $r->print('
'.&mt('[_1]Send reply[_2] to other recipients','',' ').': '.$replyall.' '.$tolist.'
');
+ }
+ }
+ if (ref($recips{'cc'}) eq 'ARRAY') {
+ if (@{$recips{'cc'}} > 0) {
+ my $replyall;
+ if (@{$recips{'cc'}} > 1) {
+ $replyall = qq|
+
+
+
+
+
+|;
+ }
+ my $cclist = join(' ',@{$recips{'cc'}});
+ $r->print('
'.&mt('[_1]Cc[_2] to other copied recipients','',' ').': '.$replyall.' '.$cclist.'
');
+ }
+ }
+ if ($content{'group'} ne '') {
+ if (&check_group_priv($content{'group'})) {
+ if (ref($recips{'group_cc_broadcast'}) eq 'ARRAY') {
+ if (@{$recips{'group_cc_broadcast'}} > 0) {
+ my $replyall;
+ if (@{$recips{'group_cc_broadcast'}} > 1) {
+ $replyall = qq|
+
+
+
+
+
+|;
+ }
+ my $groupcclist = join(' ',@{$recips{'group_cc_broadcast'}});
+ $r->print('
'.&mt('[_1]Cc[_2] to other copied group members','',' ').': '.$replyall.' '.$groupcclist.'
');
+ }
+ }
+ }
+ }
+ }
} else {
- my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain');
- my $selectlink=&Apache::loncommon::selectstudent_link
- ('compemail','recuname','recdomain');
- $r->print(<<"ENDREC");
-
$lt{'us'}: $selectlink
-
$lt{'do'}:
-$domform
-ENDREC
+ $r->print(&recipient_input_row($defdom,%lt));
}
}
- my $latexHelp = Apache::loncommon::helpLatexCheatsheet();
- if ($broadcast ne 'upload') {
- $r->print(<<"ENDCOMP");
-
$lt{'ad'}username\@domain,username\@domain, ...
-
-
-
$lt{'sb'}:
-
+ my $latexHelp = &Apache::loncommon::helpLatexCheatsheet();
+ my $wysiwyglink=&Apache::lonhtmlcommon::htmlareaselectactive('message').'
';
+ my $subj_size;
+ if ($multiforward) {
+ $r->print(&additional_rec_row(\%lt));
+ $r->print('
'.
+ &mt('Unless you choose otherwise:').''.
+ &mt("The subject in each forwarded message will be 'Forwarding:' followed by the original subject.").' '.
+ &mt("The message itself will begin with a first line: 'Forwarded message from' followed by the original sender's name.").' ');
+ $func1='Forward'; # do not translate here!
+ $dissub = &mt('Forwarding').': ';
+ $subj_size = '10';
+ my $extra = '<'.&mt('original subject').'> '.
+ '
'.&mt('Yes').'
'.&mt('No');
+ $dismsg = &mt('Forwarded message from ').' ';
+ my $sender = &mt("sender's name");
+ $r->print(&msg_subject_row($dissub,\%lt,$subj_size,$extra));
+ $r->print('
'.&mt('Message begins with:').' '.$sender.' '.&mt('Yes').' '.&mt('No').'
+
+
+'."\n".
+$latexHelp." \n".
+&mt("Any new text to display before the text of the original messages:").' '."\n".
+' '.
+$wysiwyglink);
+ my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msg (@to_forward) {
+ $r->print(' ');
+ }
+ $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'msg'}),
+ \%lt));
+ } elsif ($broadcast ne 'upload') {
+ $subj_size = '50';
+ $r->print(&additional_rec_row(\%lt));
+ if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+ $r->print(&reply_to_row(\%lt));
+ }
+ $r->print(&msg_subject_row($dissub,\%lt,$subj_size));
+ $r->print(<<"ENDCOMP");
+$attachrow
+
$latexHelp
$dismsg
-
+$wysiwyglink
+$sendmode
$dispcrit
$disbase
-
-
-
-
-$citation
ENDCOMP
+ $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'ma'}),
+ \%lt,$hasfloat,$group));
+ $r->print($citation);
+ if (exists($env{'form.ref'})) {
+ $r->print('
');
+ }
+ if (exists($env{'form.group'})) {
+ $r->print('
');
+ }
} else { # $broadcast is 'upload'
- $r->print(<
print(<
-Generate messages from a file
+$lt{'gen'}
Subject:
-General message text
+
$lt{'gmt'}:
$dismsg
-
+$wysiwyglink
-The file format for the uploaded portion of the message is:
-
-username1\@domain1: text
-username2\@domain2: text
-username3\@domain1: text
-
+$lt{'tff'}:
+ENDBLOCK
+ $r->print('
+'."\n".
+&mt('username1:domain1: text')."\n".
+&mt('username2:domain2: text')."\n".
+&mt('username3:domain1: text')."\n".
+'
-The messages will be assembled from all lines with the respective
-username\@domain , and appended to the general message text.
+'.&mt('The messages will be assembled from all lines with the respective'."\n".'username:domain , and appended to the general message text.'));
+ $r->print(<
$dispcrit
-
+
ENDUPLOAD
}
- if ($broadcast eq 'group') {
- &discourse($r);
- my $studentsel = &discourse();
- $r->print($studentsel);
- }
if ($env{'form.displayedcrit'}) {
$r->print(' ');
}
- $r->print(''.
- &Apache::lonfeedback::generate_preview_button('compemail','message').
- &Apache::lonhtmlcommon::htmlareaselectactive('message'));
+ $r->print('');
+ if ($hasfloat) {
+ $r->print(' ');
+ }
+ $r->print(&generate_preview_form);
+}
+
+sub check_group_priv {
+ my ($group) = @_;
+ my $cid = $env{'request.course.id'};
+ my $sec = $env{'request.course.sec'};
+ return if !$cid;
+ my $can_broadcast = &Apache::lonnet::allowed('sgb',$cid.'/'.$group);
+ my $viewgrps = &Apache::lonnet::allowed('vcg',$cid.($sec?'/'.$sec:''));
+ my $editgrps = &Apache::lonnet::allowed('mdg',$cid.($sec?'/'.$sec:''));
+ if ($viewgrps || $editgrps || $can_broadcast) {
+ return 1;
+ }
+ return;
+}
+
+sub recipient_input_row {
+ my ($dom,%lt) = @_;
+ my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain');
+ my $selectlink=
+ &Apache::loncommon::selectstudent_link('compemail','recuname',
+ 'recdomain');
+ my $output = <<"ENDREC";
+$lt{'to'} $lt{'us'}: $lt{'do'}: $domform $selectlink
+ENDREC
+ return $output;
+}
+
+sub reply_to_row {
+ my ($lt) = @_;
+ my $radioyes = &mt('Yes');
+ my $radiono = &mt('No');
+ my $output = <<"ENDREP";
+$lt->{'ar'} : $radioyes $radiono $lt->{'rt'}:
+ENDREP
+ return $output;
+}
+
+sub additional_rec_row {
+ my ($lt) = @_;
+ my $cc = &mt('Cc:');
+ my $bcc = &mt('Bcc:');
+ my $exmpl = &mt('username:domain,username:domain,...');
+ my $output = <<"ENDADD";
+$lt->{'ad'} ($exmpl) :
+ENDADD
+ return $output;
+}
+
+sub submit_button_row {
+ my ($folder,$dismode,$sendtext,$lt,$is_crsform,$group) = @_;
+ my $pre=&mt("Show Preview and Check Spelling");
+ my $value=&mt('Send');
+ my $prevbutton = ' ';
+ my $output = qq|
+
+ |;
+ if ($is_crsform) {
+ $output .= ' '."\n";
+ if ($group ne '') {
+ $output .= ' '."\n";
+ }
+ }
+ $output .= qq|
+
+|;
+ return $output;
+}
+
+sub msg_subject_row {
+ my ($dissub,$lt,$subj_size,$extra) = @_;
+ my $output = ''.$lt->{'sb'}.' : '.$extra.
+ ' ';
+ return $output;
+}
+
+sub generate_preview_form {
+ my $prevbutton = (<
+
+
+
+ENDPREVIEW
}
# ---------------------------------------------------- Display all face to face
@@ -897,8 +1719,8 @@ sub retrieve_instructor_comments {
my ($user,$domain)=@_;
my $target=$env{'form.grade_target'};
if (! $env{'request.course.id'}) { return; }
- if (! &Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (! &Apache::lonnet::allowed('dff',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
return;
}
@@ -907,8 +1729,8 @@ sub retrieve_instructor_comments {
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
my $result='';
- foreach (sort(keys(%records))) {
- my %content=&Apache::lonmsg::unpackagemsg($records{$_});
+ foreach my $key (sort(keys(%records))) {
+ my %content=&Apache::lonmsg::unpackagemsg($records{$key});
next if ($content{'senderdomain'} eq '');
next if ($content{'subject'} !~ /^Record/);
# &Apache::lonfeedback::newline_to_br(\$content{'message'});
@@ -924,10 +1746,10 @@ sub disfacetoface {
my ($r,$user,$domain)=@_;
my $target=$env{'form.grade_target'};
unless ($env{'request.course.id'}) { return; }
- if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
- $r->print('Not allowed');
+ $r->print(&mt('Not allowed'));
return;
}
my %records=&Apache::lonnet::dump('nohist_email',
@@ -935,8 +1757,8 @@ sub disfacetoface {
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
my $result='';
- foreach (sort keys %records) {
- my %content=&Apache::lonmsg::unpackagemsg($records{$_});
+ foreach my $key (sort(keys(%records))) {
+ my %content=&Apache::lonmsg::unpackagemsg($records{$key});
next if ($content{'senderdomain'} eq '');
&Apache::lonfeedback::newline_to_br(\$content{'message'});
if ($content{'subject'}=~/^Record/) {
@@ -954,7 +1776,20 @@ sub disfacetoface {
''.&mt('Subject').': '.$content{'subject'}.' '.
$content{'message'};
}
- }
+ }
+ } elsif ($content{'subject'}=~/^Archive/) {
+ $result.=''.&mt('Archived Message').' ';
+ if (defined($content{'coursemsgid'})) {
+ my $crsmsgid = &escape($content{'coursemsgid'});
+ my $archive_message = &general_message($crsmsgid);
+ $content{'message'} = ''.&mt('Subject').': '.$content{'message'}.' '.$archive_message;
+ } else {
+ %content=&Apache::lonmsg::unpackagemsg($content{'message'});
+ $content{'message'} =
+ ''.&mt('Subject').': '.$content{'subject'}.' '.&mt('Critical Message').'';
if (defined($content{'coursemsgid'})) {
@@ -1006,10 +1841,10 @@ sub general_message {
sub facetoface {
my ($r,$stage)=@_;
- if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
- $r->print('Not allowed');
+ $r->print(&mt('Not allowed'));
return;
}
my $crstype = &Apache::loncommon::course_type();
@@ -1017,7 +1852,7 @@ sub facetoface {
: 'faculty and staff';
&printheader($r,
'/adm/email?recordftf=query',
- "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
+ "User Notes, Face-to-Face, Critical Messages, Broadcast Messages, Archived Messages");
# from query string
if ($env{'form.recname'}) { $env{'form.recuname'}=$env{'form.recname'}; }
@@ -1032,7 +1867,7 @@ sub facetoface {
('stdselect','recuname','recdomain');
my %lt=&Apache::lonlocal::texthash('user' => 'Username',
'dom' => 'Domain',
- 'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in $crstype",
+ 'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, Broadcast Messages and Archived Messages in $crstype",
'subm' => 'Retrieve discussion and message records',
'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
'post' => 'Post this Record');
@@ -1083,8 +1918,8 @@ ENDBFORM
sub examblock {
my ($r,$action) = @_;
unless ($env{'request.course.id'}) { return;}
- if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (!&Apache::lonnet::allowed('dcm',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
$r->print('Not allowed');
return;
@@ -1096,13 +1931,15 @@ sub examblock {
'cbds' => 'Communication blocking during scheduled exams',
'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.",
'mecb' => 'Modify existing communication blocking periods',
- 'ncbc' => 'No communication blocks currently stored'
+ 'ncbc' => 'No communication blocks currently saved',
+ 'stor' => 'Save',
);
my %ltext = &Apache::lonlocal::texthash(
'dura' => 'Duration',
'setb' => 'Set by',
'even' => 'Event',
+ 'blck' => 'Blocked?',
'actn' => 'Action',
'star' => 'Start',
'endd' => 'End'
@@ -1134,7 +1971,7 @@ sub examblock {
$r->print(<<"END");
-
+
$end_page
END
@@ -1145,10 +1982,6 @@ sub blockstore {
my $r = shift;
my %lt=&Apache::lonlocal::texthash(
'tfcm' => 'The following changes were made',
- 'cbps' => 'communication blocking period(s)',
- 'werm' => 'was/were removed',
- 'wemo' => 'was/were modified',
- 'wead' => 'was/were added',
'ncwm' => 'No changes were made.'
);
my %adds = ();
@@ -1159,35 +1992,40 @@ sub blockstore {
my $addtotal = 0;
my %blocking = ();
$r->print(''.$lt{'head'}.' ');
- foreach (keys %env) {
- if ($_ =~ m/^form\.modify_(\w+)$/) {
+ foreach my $envkey (keys(%env)) {
+ if ($envkey =~ m/^form\.modify_(\d+)$/) {
$adds{$1} = $1;
$removals{$1} = $1;
$modtotal ++;
- } elsif ($_ =~ m/^form\.cancel_(\d+)$/) {
+ } elsif ($envkey =~ m/^form\.cancel_(\d+)$/) {
$cancels{$1} = $1;
unless ( defined($removals{$1}) ) {
$removals{$1} = $1;
$canceltotal ++;
}
- } elsif ($_ =~ m/^form\.add_(\d+)$/) {
+ } elsif ($envkey =~ m/^form\.add_(\d+)$/) {
$adds{$1} = $1;
$addtotal ++;
- }
+ }
}
- foreach (keys %removals) {
- my $hashkey = $env{'form.key_'.$_};
+ foreach my $key (keys(%removals)) {
+ my $hashkey = $env{'form.key_'.$key};
&Apache::lonnet::del('comm_block',["$hashkey"],
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'}
);
}
- foreach (keys %adds) {
- unless ( defined($cancels{$_}) ) {
- my ($newstart,$newend) = &get_dates_from_form($_);
+ foreach my $key (keys(%adds)) {
+ unless ( defined($cancels{$key}) ) {
+ my ($newstart,$newend) = &get_dates_from_form($key);
my $newkey = $newstart.'____'.$newend;
- $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$_};
+ my $blocktypes = &get_block_choices($key);
+ $blocking{$newkey} = {
+ setter => $env{'user.name'}.':'.$env{'user.domain'},
+ event => &escape($env{'form.title_'.$key}),
+ blocks => $blocktypes,
+ };
}
}
if ($addtotal + $modtotal > 0) {
@@ -1200,13 +2038,13 @@ sub blockstore {
if ($chgestotal > 0) {
$r->print($lt{'tfcm'}.'');
if ($canceltotal > 0) {
- $r->print(''.$canceltotal.' '.$lt{'cbps'},' '.$lt{'werm'}.' ');
+ $r->print(''.&mt('[quant,_1,communication blocking period was,communication blocking periods were] removed.',$canceltotal).' ');
}
if ($modtotal > 0) {
- $r->print(''.$modtotal.' '.$lt{'cbps'},' '.$lt{'wemo'}.' ');
+ $r->print(''.&mt('[quant,_1,communication blocking period was,communication blocking periods were] modified.',$modtotal).' ');
}
if ($addtotal > 0) {
- $r->print(''.$addtotal.' '.$lt{'cbps'},' '.$lt{'wead'}.' ');
+ $r->print(''.&mt('[quant,_1,communication blocking period was,communication blocking periods were] added.',$addtotal).' ');
}
$r->print(' ');
} else {
@@ -1238,6 +2076,20 @@ sub get_blockdates {
}
}
+sub get_block_choices {
+ my $item = shift;
+ my $blocklist;
+ my ($typeorder,$types) = &blocktype_text();
+ foreach my $type (@{$typeorder}) {
+ if ($env{'form.'.$type.'_'.$item}) {
+ $blocklist->{$type} = 'on';
+ } else {
+ $blocklist->{$type} = 'off';
+ }
+ }
+ return $blocklist;
+}
+
sub display_blocker_status {
my ($r,$records,$ltext) = @_;
my $parmcount = 0;
@@ -1246,13 +2098,15 @@ sub display_blocker_status {
'modi' => 'Modify',
'canc' => 'Cancel',
);
+ my ($typeorder,$types) = &blocktype_text();
$r->print(&Apache::loncommon::start_data_table());
$r->print(<<"END");
- $$ltext{'dura'}
- $$ltext{'setb'}
- $$ltext{'even'}
- $$ltext{'actn'}?
+ $ltext->{'dura'}
+ $ltext->{'setb'}
+ $ltext->{'even'}
+ $ltext->{'blck'}
+ $ltext->{'actn'}?
END
foreach my $record (sort(keys(%{$records}))) {
@@ -1263,15 +2117,29 @@ END
my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
- my ($setuname,$setudom,$title) =
- &parse_block_record($$records{$record});
+ my ($setuname,$setudom,$title,$blocks) =
+ &Apache::loncommon::parse_block_record($$records{$record});
$title = &HTML::Entities::encode($title,'"<>&');
- my $settername = &Apache::loncommon::plainname($setuname,$setudom);
+ my $settername =
+ &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($setuname,$setudom),
+ $setuname,$setudom);
$r->print(&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
- $$ltext{'star'}: $startform $$ltext{'endd'}: $endform
+ $ltext->{'star'}: $startform $ltext->{'endd'}: $endform
$settername
+
+END
+ foreach my $block (@{$typeorder}) {
+ my $blockstatus = '';
+ if ($blocks->{$block} eq 'on') {
+ $blockstatus = 'checked="true"';
+ }
+ $r->print(' '.$types->{$block}.' ');
+ }
+ $r->print(<<"END");
+
$lt{'modi'}? $lt{'canc'}?
END
$r->print(&Apache::loncommon::end_data_table_row());
@@ -1285,19 +2153,6 @@ END
return $parmcount;
}
-sub parse_block_record {
- my ($record) = @_;
- my ($setuname,$setudom,$title);
- my @data = split(/:/,$record,3);
- if (scalar(@data) eq 2) {
- $title = $data[1];
- ($setuname,$setudom) = split(/@/,$data[0]);
- } else {
- ($setuname,$setudom,$title) = @data;
- }
- return ($setuname,$setudom,$title);
-}
-
sub display_addblocker_table {
my ($r,$parmcount,$ltext) = @_;
my $start = time;
@@ -1312,21 +2167,30 @@ sub display_addblocker_table {
'exam' => 'e.g., Exam 1',
'addn' => 'Add new communication blocking periods'
);
+ my ($typeorder,$types) = &blocktype_text();
$r->print(<<"END");
$lt{'addn'}
END
$r->print(&Apache::loncommon::start_data_table());
$r->print(<<"END");
- $$ltext{'dura'}
- $$ltext{'even'} $lt{'exam'}
- $$ltext{'actn'}?
+ $ltext->{'dura'}
+ $ltext->{'even'} $lt{'exam'}
+ $ltext->{'blck'}
+ $ltext->{'actn'}?
END
- $r->print(&Apache::loncommon::start_data_table_row());
+ $r->print(&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
- $$ltext{'star'}: $startform $$ltext{'endd'}: $endform
+ $ltext->{'star'}: $startform $ltext->{'endd'}: $endform
+
+END
+ foreach my $block (@{$typeorder}) {
+ $r->print(' '.$types->{$block}.' ');
+ }
+ $r->print(<<"END");
+
$lt{'addb'}?
END
$r->print(&Apache::loncommon::end_data_table_row());
@@ -1334,115 +2198,44 @@ END
return;
}
-sub blockcheck {
- my ($setters,$startblock,$endblock) = @_;
- # Retrieve active student roles and active course coordinator/instructor roles
- my %live_courses =
- map { $_ => 1} &Apache::loncommon::findallcourses();
- # FIXME should really probe for apriv, but ::allowed can only probe the
- # currently active role
- my %staff_of =
- map { $_ => 1} &Apache::loncommon::findallcourses(['cc','in']);
-
- # Retrieve blocking times and identity of blocker for active courses
- # for students.
- return if (!%live_courses);
-
- foreach my $course (keys(%live_courses)) {
- my $cdom = $env{'course.'.$course.'.domain'};
- my $cnum = $env{'course.'.$course.'.num'};
-
- # if they are a staff member and are currently not playing student
- next if ( $staff_of{$course}
- && ($env{'request.role'} !~ m{^st\./$cdom/$cnum}));
-
- $setters->{$course} = {};
- $setters->{$course}{'staff'} = [];
- $setters->{$course}{'times'} = [];
- my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
- foreach my $record (keys %records) {
- my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);
- if ($start <= time && $end >= time) {
- my ($staff_name,$staff_dom,$title) =
- &parse_block_record($records{$record});
- push(@{$$setters{$course}{'staff'}}, [$staff_name,$staff_dom]);
- push(@{$$setters{$course}{'times'}}, [$start,$end]);
- if ( ($$startblock == 0) || ($$startblock > $1) ) {
- $$startblock = $1;
- }
- if ( ($$endblock == 0) || ($$endblock < $2) ) {
- $$endblock = $2;
- }
- }
- }
- }
-}
-
-sub build_block_table {
- my ($r,$startblock,$endblock,$setters) = @_;
- my %lt = &Apache::lonlocal::texthash(
- 'cacb' => 'Currently active communication blocks',
- 'cour' => 'Course',
- 'dura' => 'Duration',
- 'blse' => 'Block set by'
+sub blocktype_text {
+ my %types = &Apache::lonlocal::texthash(
+ 'com' => 'Messaging',
+ 'chat' => 'Chat',
+ 'boards' => 'Discussion',
+ 'port' => 'Portfolio',
+ 'groups' => 'Groups',
+ 'blogs' => 'Blogs',
);
- $r->print(<<"END");
- $lt{'cacb'}:
-END
- $r->print(&Apache::loncommon::start_data_table());
- $r->print(<<"END");
-
- $lt{'cour'}
- $lt{'dura'}
- $lt{'blse'}
-
-END
- foreach my $course (keys(%{$setters})) {
- my %courseinfo=&Apache::lonnet::coursedescription($course);
- for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) {
- my ($uname,$udom) = @{$$setters{$course}{staff}[$i]};
- my $fullname = &Apache::loncommon::plainname($uname,$udom);
- my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};
- $openblock = &Apache::lonlocal::locallocaltime($openblock);
- $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
- $r->print(&Apache::loncommon::start_data_table_row().
- ''.$courseinfo{'description'}.' '.
- ''.$openblock.' to '.$closeblock.' '.
- ''.$fullname.' ('.$uname.':'.$udom.
- ') '.
- &Apache::loncommon::end_data_table_row());
- }
- }
- $r->print(&Apache::loncommon::end_data_table());
+ my $typeorder = ['com','chat','boards','port','groups','blogs'];
+ return ($typeorder,\%types);
}
# ----------------------------------------------------------- Display a message
sub displaymessage {
- my ($r,$msgid,$folder)=@_;
+ my ($r,$msgid,$folder,$msgstatus)=@_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
my %blocked = ();
my %setters = ();
- my $startblock = 0;
- my $endblock = 0;
my $numblocked = 0;
my $crstype = &Apache::loncommon::course_type();
# info to generate "next" and "previous" buttons and check if message is blocked
- &blockcheck(\%setters,\$startblock,\$endblock);
- my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
+ my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
+ my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);
if ( $blocked{$msgid} eq 'ON' ) {
&printheader($r,'/adm/email',&mt('Display a Message'));
$r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));
&build_block_table($r,$startblock,$endblock,\%setters);
return;
}
- &statuschange($msgid,'read',$folder);
+ if ($msgstatus eq '') {
+ &statuschange($msgid,'read',$folder);
+ }
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
my %content=&Apache::lonmsg::unpackagemsg($message{$msgid});
-
my $counter=0;
- $r->print('');
my $escmsgid=&escape($msgid);
foreach (@messages) {
if ($_->[5] eq $escmsgid){
@@ -1450,23 +2243,39 @@ sub displaymessage {
}
$counter++;
}
- $r->print(' ');
+
+ my $see_anonymous;
+ my $from_student = 0;
+ if ($env{'request.course.id'} eq $content{'courseid'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $username = $content{'sendername'}.':'.$content{'senderdomain'};
+ my %classlist_entry =
+ &Apache::lonnet::get('classlist',[$username],$cdom,$cnum);
+ if (exists($classlist_entry{$username})) {
+ $from_student = 1;
+ $see_anonymous = &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
+ }
+ }
+
+
my $number_of_messages = scalar(@messages); #subtract 1 for last index
# start output
&printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
# Functions
- $r->print('');
+ my $symb;
+ if (defined($content{'symb'})) {
+ $symb = $content{'symb'};
+ } elsif (defined($content{'baseurl'})) {
+ $symb=&Apache::lonnet::symbread($content{'baseurl'});
+ }
if ($env{'user.adv'}) {
- $r->print(''.&mt('Currently available actions (will open extra window)').': ');
- my $symb=&Apache::lonnet::symbread($content{'baseurl'});
+ my $actionlist='';
if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
- $r->print(''.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').' ');
- }
+ $actionlist.=''
+ .&Apache::loncommon::track_student_link(
+ &mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check')
+ .' ';
+ }
if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) {
- $r->print(''.&Apache::loncommon::pprmlink(&mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check').' ');
+ $actionlist.=''
+ .&Apache::loncommon::pprmlink(
+ &mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check')
+ .' ';
}
if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) {
- $r->print(''.&Apache::loncommon::pgrdlink(&mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check').' ');
- }
- $r->print('
');
+ $actionlist.=''
+ .&Apache::loncommon::pgrdlink(
+ &mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check')
+ .' ';
+ }
+ if ($actionlist) {
+ $r->print(''
+ .''
+ .&mt('Currently available actions (will open extra window):')
+ .' '
+ .$actionlist
+ .'
');
+ }
+ }
+ my ($tonum,$tolist,$cclist,$bcclist,$groupcclist,%recipients);
+ if ($content{'recipid'}) {
+ $tonum = &retrieve_recips('display',\%content,\%recipients);
+ if (ref($recipients{'cc'}) eq 'ARRAY') {
+ $cclist = join(', ',@{$recipients{'cc'}});
+ }
+ if (ref($recipients{'to'}) eq 'ARRAY') {
+ $tolist = join(', ',@{$recipients{'to'}});
+ }
+ if (ref($recipients{'bcc'}) eq 'ARRAY') {
+ $bcclist = join(', ',@{$recipients{'bcc'}});
+ }
}
- my $tolist;
- my @recipients = ();
- for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
- $recipients[$i] = &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'recuser'}[$i],
+ if (!$tolist && ref($content{'recuser'}) eq 'ARRAY') {
+ my @recipients;
+ for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
+ $recipients[$i] = &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($content{'recuser'}[$i],
$content{'recdomain'}[$i]),
- $content{'recuser'}[$i],$content{'recdomain'}[$i]).
- ' ('.$content{'recuser'}[$i].' at '.$content{'recdomain'}[$i].') ';
+ $content{'recuser'}[$i],$content{'recdomain'}[$i]).
+ ' ('.$content{'recuser'}[$i].':'.$content{'recdomain'}[$i].') ';
+ }
+ $tolist = join(', ',@recipients);
+ }
+ my ($restitle,$baseurl,$refers_to);
+ if (defined($content{'resource_title'})) {
+ $restitle = $content{'resource_title'};
+ } else {
+ if (defined($content{'baseurl'})) {
+ $restitle = &Apache::lonnet::gettitle($content{'baseurl'});
+ }
+ }
+ if (defined($content{'baseurl'})) {
+ $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
+ }
+ if ($from_student && $see_anonymous ) {
+ $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
+ }
+
+ my $broadcast_link;
+ if (($content{'courseid'}) && ($content{'recipid'} &&
+ (ref($recipients{'course_broadcast'}) eq 'ARRAY') ||
+ (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') ||
+ (ref($recipients{'group_bcc_broadcast'}) eq 'ARRAY'))) {
+ $broadcast_link = &recipients_link($r,\%content,\%recipients);
+ }
+
+ # Display LON-CAPA Message (Start)
+ # Subject
+ $r->print(' '
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title(&mt('Subject'))
+ .$content{'subject'}
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ if ($folder eq 'sent') {
+ # To
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('To'))
+ .$tolist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ if ($cclist) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))
+ .$cclist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ if ($bcclist) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Bcc'))
+ .$bcclist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ if (($content{'courseid'}) && ($content{'recipid'})) {
+ my %broadcast_types =
+ &Apache::lonlocal::texthash (
+ course_broadcast => 'Broadcast to',
+ group_cc_broadcast => 'Cc to group',
+ group_bcc_broadcast => 'Bcc to group',
+ );
+ foreach my $type (sort(keys(%broadcast_types))) {
+ if (ref($recipients{$type}) eq 'ARRAY') {
+ my $num = @{$recipients{$type}};
+ my $broadcastlist = join(', ',@{$recipients{$type}});
+ if ($broadcastlist && $broadcast_link) {
+ if ($type eq 'group_cc_broadcast') {
+ $groupcclist = $broadcastlist;
+ }
+ $r->print(&Apache::lonhtmlcommon::row_title(
+ $broadcast_types{$type})
+ .&mt('[quant,_1,recipient]',$num)
+ .' ['
+ .&mt('Show').'] '
+ .&Apache::lonhtmlcommon::row_closure());
+ }
+ }
+ }
+ }
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Reply To'))
+ .$replytoname.':'.$replytodom
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ }
+ } else {
+ # From, Reply
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('From'))
+ .&Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
+ $content{'sendername'},$content{'senderdomain'})
+ );
+ if ($content{'noreplies'}) {
+ $r->print(' ('.&mt('No replies to sender').')'
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ } else {
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(&mt('Reply To'))
+ .$replytoname.':'.$replytodom
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ } else {
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ }
+ } else {
+ $r->print(' ('.$content{'sendername'}.':'.$content{'senderdomain'}.') '
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ if ($tonum && $tolist) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('To'))
+ .$tolist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ if ($cclist) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))
+ .$cclist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ if ($content{'group'} ne '') {
+ if (&check_group_priv($content{'group'})) {
+ $groupcclist = join(', ',@{$recipients{'group_cc_broadcast'}});
+ if ($groupcclist) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group Cc'))
+ .$groupcclist
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ }
+ }
+ }
+ }
+
+ # Course
+ if ($content{'courseid'}) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt($crstype))
+ .$courseinfo{'description'}
+ );
+ if ($content{'coursesec'}) {
+ $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
+ }
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ }
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Time'))
+ .$content{'time'}
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+
+ # Refers to
+ if ($baseurl) {
+ if (defined($content{'courseid'}) && defined($env{'request.course.id'})) {
+ if ($content{'courseid'} eq $env{'request.course.id'}) {
+ my $symblink;
+ my $showsymb = &Apache::lonenc::check_decrypt($symb);
+ my $showurl = &Apache::lonenc::check_decrypt($baseurl);
+ my $encrypturl = &Apache::lonnet::EXT('resource.0.encrypturl',
+ $showsymb,$env{'user.domain'},$env{'user.name'});
+ if ($symb) {
+ if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) {
+ $showsymb = &Apache::lonenc::check_encrypt($symb);
+ }
+ $symblink = '?symb='.$showsymb;
+ }
+ if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) {
+ $showurl = $baseurl;
+ }
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to'))
+ .''.$restitle.' '
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ $refers_to = 1;
+ }
+ }
+ if (!$refers_to) {
+ if ($baseurl =~ m-^/enc/-) {
+ if (defined($content{'courseid'})) {
+ if (!$env{'request.course.id'}) {
+ my $unencurl =
+ &Apache::lonenc::unencrypted($baseurl,
+ $content{'courseid'});
+ if ($unencurl ne '') {
+ if (&Apache::lonnet::allowed('bre',$unencurl)) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to'))
+ .''.$restitle.' '
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ }
+ }
+ }
+ }
+ } else {
+ if (&Apache::lonnet::allowed('bre',$baseurl)) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to'))
+ .''.$restitle.' '
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+
+ }
+ }
+ }
}
- $tolist = join(', ',@recipients);
- $r->print(''.&mt('Subject').': '.$content{'subject'}.
- ($folder ne 'sent'?''.&mt('From').': '.
- &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
- $content{'sendername'},$content{'senderdomain'}).' ('.
- $content{'sendername'}.' at '.
- $content{'senderdomain'}.') ':''.&mt('To').': '.
- $tolist).
- ($content{'courseid'}?''.&mt($crstype).': '.$courseinfo{'description'}.
- ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
- ''.&mt('Time').': '.$content{'time'}.
- ($content{'baseurl'}?''.&mt('Refers to').': '.
- $content{'baseurl'}.' ('.&Apache::lonnet::gettitle($content{'baseurl'}).') ':'').
- '
'.
- &Apache::lontexconvert::msgtexconverted($content{'message'},1).
- ' '.&displayresource(%content).'
');
- return;
+
+ # Message
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message'))
+ .''
+ .&Apache::lontexconvert::msgtexconverted($content{'message'},1)
+ .' '
+ );
+ if (&displayresource(%content)) {
+ $r->print(&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(&mt('Resource Details'))
+ .&displayresource(%content)
+ );
+ }
+ $r->print(&Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::end_pick_box());
+ # Display LON-CAPA Message (End)
+ return;
+}
+
+sub retrieve_recips {
+ my ($context,$content,$recips)= @_;
+ my $tonum = 0;
+ if (ref($content) eq 'HASH') {
+ my %reciphash =
+ &Apache::lonnet::get('nohist_emailrecip',[$content->{'recipid'}],
+ $content->{'senderdomain'},$content->{'sendername'});
+ my $recipinfo = $reciphash{$content->{'recipid'}};
+ if (ref($recipinfo) eq 'HASH') {
+ foreach my $type ('to','cc','course_broadcast','group_cc_broadcast','group_bcc_broadcast') {
+ if (ref($recipinfo->{$type}) eq 'HASH') {
+ if ($type eq 'to') {
+ $tonum = keys(%{$recipinfo->{$type}});
+ }
+ foreach my $user (sort(keys(%{$recipinfo->{$type}}))) {
+ my ($uname,$udom) = split(/:/,$user);
+ next if (($context eq 'replying') && ($uname eq $env{'user.name'})
+ && ($udom eq $env{'user.domain'}));
+ my $showuser ='';
+ if ($context eq 'replying') {
+ if (($type eq 'to') || ($type eq 'cc')) {
+ $showuser = ' ';
+ } elsif ($type eq 'group_cc_broadcast') {
+ $showuser = ' ';
+ }
+ }
+ $showuser .= &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($uname,
+ $udom),$uname,$udom);
+ if ($context eq 'replying') {
+ $showuser .=' ';
+ }
+ $showuser .= ' ';
+ if (ref($recips) eq 'HASH') {
+ push(@{$recips->{$type}},$showuser);
+ }
+ }
+ }
+ }
+ }
+ }
+ return $tonum;
+}
+
+sub recipients_link {
+ my ($r,$content,$recipients) = @_;
+ my ($broadcast_link,$show);
+ if ((ref($content) eq 'HASH') && (ref($recipients) eq 'HASH')) {
+ if (ref($recipients->{'course_broadcast'}) eq 'ARRAY') {
+ if (@{$recipients->{'course_broadcast'}} > 0) {
+ $show = 'course';
+ }
+ } elsif (ref($recipients->{'group_cc_broadcast'}) eq 'ARRAY') {
+ if (@{$recipients->{'group_cc_broadcast'}} > 0) {
+ $show = 'group_cc';
+ }
+ } elsif (ref($recipients->{'group_bcc_broadcast'}) eq 'ARRAY') {
+ if (@{$recipients->{'group_bcc_broadcast'}} > 0) {
+ $show = 'group_bcc';
+ }
+ }
+ if ($show) {
+ my ($nothing,$height,$width,$start_page,$end_page,$body);
+ $nothing=&Apache::lonhtmlcommon::javascript_nothing();
+ $height = 400;
+ $width = 600;
+ my $start_page =
+ &Apache::loncommon::start_page('Broadcast List', undef,
+ {only_body => 1,
+ js_ready => 1,});
+ my $end_page = &Apache::loncommon::end_page({js_ready => 1,});
+ my $body = ''.&mt("Recipients of broadcast message").' '.
+ &Apache::loncommon::start_data_table();
+ my $cell = 0;
+ $body .= &Apache::loncommon::start_data_table_row();
+ foreach my $item (@{$recipients->{$show.'_broadcast'}}) {
+ $item =~ s/'/\\'/g;
+ if (!($cell%2) && $cell > 0) {
+ $body .= &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::start_data_table_row();
+ }
+ $cell ++;
+ $body .= ''.$cell.' '.$item.' ';
+ }
+ if ($cell%2) {
+ $body .= ' ';
+ }
+ $body .= &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table();
+ $body =~ s{}{<\\/}g;
+ $body =~ s{\n}{}g;
+ $r->print(<
+function showBroadcastList() {
+ var caller = this;
+ var newWindow = null;
+ try {
+ newWindow = window.open($nothing,"broadcast","HEIGHT=$height,WIDTH=$width,resizable=yes,scrollbars=yes" );
+ }
+ catch(error) {
+ writeWin(caller);
+ return;
+ }
+ if (newWindow) {
+ caller = newWindow;
+ }
+ writeWin(caller);
+ return;
+}
+
+function writeWin(caller) {
+ caller.document.writeln('$start_page $body $end_page');
+ caller.document.close();
+ caller.focus();
+}
+
+
+
+ENDJS
+ $broadcast_link = 1;
+ }
+ }
+ return $broadcast_link;
}
# =========================================================== Show the citation
@@ -1530,7 +2704,12 @@ sub displayresource {
#
if (($env{'request.course.id'} eq $content{'courseid'})
&& (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) {
- my $symb=&Apache::lonnet::symbread($content{'baseurl'});
+ my $symb;
+ if (defined($content{'symb'})) {
+ $symb = $content{'symb'};
+ } else {
+ $symb=&Apache::lonnet::symbread($content{'baseurl'});
+ }
# Could not get a symb, give up
unless ($symb) { return $content{'citation'}; }
# Have a symb, can render
@@ -1562,13 +2741,12 @@ sub header {
my $extra = &Apache::loncommon::studentbrowser_javascript();
if ($baseurl) {
- $extra .= " ";
+ $extra .= " ";
}
$r->print(&Apache::loncommon::start_page('Communication and Messages',
- $extra));
+ $extra));
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (($title?$title:'Communication and Messages')));
-
+ (($title?$title:'Communication and Messages')));
}
# ---------------------------------------------------------------- Print header
@@ -1587,9 +2765,9 @@ sub storecomment {
my ($r)=@_;
my $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});
my $cleanmsgtxt='';
- foreach (split(/[\n\r]/,$msgtxt)) {
- unless ($_=~/^\s*(\>|\>\;)/) {
- $cleanmsgtxt.=$_."\n";
+ foreach my $line (split(/[\n\r]/,$msgtxt)) {
+ unless ($line=~/^\s*(\>|\>\;)/) {
+ $cleanmsgtxt.=$line."\n";
}
}
my $key=&escape($env{'form.baseurl'}).'___'.time;
@@ -1600,18 +2778,18 @@ sub storedcommentlisting {
my ($r)=@_;
my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
'^'.&escape(&escape($env{'form.showcommentbaseurl'})));
- $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,
+ $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,
{'onlybody' => 1}));
if ((keys %msgs)[0]=~/^error\:/) {
- $r->print(&mt('No stored comments yet.'));
+ $r->print(&mt('No saved comments yet.'));
} else {
my $found=0;
- foreach (sort keys %msgs) {
- $r->print("\n".$msgs{$_}." ");
+ foreach my $key (sort(keys(%msgs))) {
+ $r->print("\n".$msgs{$key}." ");
$found=1;
}
unless ($found) {
- $r->print(&mt('No stored comments yet for this resource.'));
+ $r->print(&mt('No saved comments yet for this resource.'));
}
}
}
@@ -1622,20 +2800,40 @@ sub sendoffmail {
my ($r,$folder)=@_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
my $sendstatus='';
- my %specialmsg_status;
- my $numspecial = 0;
+ my %msg_status;
+ my $numsent = 0;
+ my $nosentstore = 1;
+ my $attachmenturl;
+ my $now = time;
+ my ($cdom,$cnum,$group);
+ if (exists($env{'form.group'})) {
+ $group = $env{'form.group'};
+ }
+ if (exists($env{'request.course.id'})) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ }
if ($env{'form.send'}) {
- &printheader($r,'','Messages being sent.');
+ if (!$env{'form.multiforward'}) {
+ if ($group eq '') {
+ &printheader($r,'','Messages being sent.');
+ } else {
+ $r->print(&groupmail_header('sending',$group));
+ }
+ }
$r->rflush();
my %content=();
undef %content;
if ($env{'form.forwid'}) {
my $msgid=$env{'form.forwid'};
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
- %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1);
+ %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1,1);
&statuschange($msgid,'forwarded',$folder);
- $env{'form.message'}.="\n\n-- Forwarded message --\n\n".
- $content{'message'};
+ if ($content{'attachmenturl'} ne '') {
+ $attachmenturl = $content{'attachmenturl'};
+ }
+ $env{'form.message'} .= "\n\n-- Forwarded message --\n\n".
+ $content{'message'};
}
if ($env{'form.replyid'}) {
my $msgid=$env{'form.replyid'};
@@ -1644,49 +2842,109 @@ sub sendoffmail {
&statuschange($msgid,'replied',$folder);
}
- my @to =
- &Apache::loncommon::get_env_multiple('form.selectedusers.forminput');
my $mode = $env{'form.sendmode'};
+ my (%toaddr,$tos,$cc,$bcc,$broadcast);
- my %toaddr;
- if (@to) {
- foreach my $dest (@to) {
- my ($user,$domain) = split(/:/, $dest);
- if (($user ne '') && ($domain ne '')) {
- my $address = $user.":".$domain; # How the code below expects it.
- $toaddr{$address} = '';
- }
- }
- }
-
- if ($env{'form.sendmode'} eq 'group') {
- foreach my $address (keys(%env)) {
- if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
- $toaddr{$1}='';
- }
- }
- } elsif ($env{'form.sendmode'} eq 'upload') {
+ if ($mode eq 'group') {
+ if (defined($env{'form.courserecips'})) {
+ my $courseusers = $env{'form.courserecips'};
+ $courseusers =~ s/^_\&\&\&_//;
+ my @to = split('_&&&_',$courseusers);
+ foreach my $dest (@to) {
+ my ($user,$domain) = split(/:/, $dest);
+ if (($user ne '') && ($domain ne '')) {
+ my $rec = $user.":".$domain;
+ $toaddr{$rec} = '';
+ $broadcast->{$rec} = '';
+ }
+ }
+ }
+ } elsif ($mode eq 'upload') {
+ $nosentstore = 0;
foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
- my ($rec,$txt)=split(/\s*\:\s*/,$line);
+ my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/);
if ($txt) {
- $rec=~s/\@/\:/;
+ $rec =~ s/^\s+//;
+ $rec =~ s/\s+$//;
$toaddr{$rec}.=$txt."\n";
+ $broadcast->{$rec} = '';
}
}
} else {
if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
$toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
}
}
- if ($env{'form.additionalrec'}) {
- foreach (split(/\,/,$env{'form.additionalrec'})) {
- my ($auname,$audom)=split(/\@/,$_);
+ if ($env{'form.additionalrec_to'}) {
+ foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ $tos->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ if ($env{'form.replying_to'}) {
+ my @toreplies =
+ &Apache::loncommon::get_env_multiple('form.replying_to');
+ foreach my $rec (@toreplies) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ $tos->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ if ($env{'form.additionalrec_cc'}) {
+ foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {
+ my ($auname,$audom)=split(/:/,$rec);
if (($auname ne "") && ($audom ne "")) {
- $toaddr{$auname.':'.$audom}='';
+ $toaddr{$auname.':'.$audom}='';
+ if (!defined($tos->{$auname.':'.$audom})) {
+ $cc->{$auname.':'.$audom}='';
+ }
}
}
}
-
+ if ($env{'form.replying_cc'}) {
+ my @ccreplies =
+ &Apache::loncommon::get_env_multiple('form.replying_cc');
+ foreach my $rec (@ccreplies) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ if (!defined($tos->{$auname.':'.$audom})) {
+ $cc->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ }
+ if ($env{'form.replying_groupcc'}) {
+ my @groupreplies =
+ &Apache::loncommon::get_env_multiple('form.replying_groupcc');
+ foreach my $rec (@groupreplies) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ if (!defined($tos->{$auname.':'.$audom})) {
+ $broadcast->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ }
+ if ($env{'form.additionalrec_bcc'}) {
+ foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ if ((!defined($tos->{$auname.':'.$audom})) &&
+ (!defined($cc->{$auname.':'.$audom}))) {
+ $bcc->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ }
my $savemsg;
my $msgtype;
my %sentmessage;
@@ -1702,118 +2960,169 @@ sub sendoffmail {
} else {
$savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
}
-
+ my %reciphash = (
+ to => $tos,
+ cc => $cc,
+ bcc => $bcc,
+ );
+ if ($mode eq 'group') {
+ if ($group eq '') {
+ $reciphash{'course_broadcast'} = $broadcast;
+ } else {
+ if ($env{'form.groupmail'} eq 'cc') {
+ $reciphash{'group_cc_broadcast'} = $broadcast;
+ } else {
+ $reciphash{'group_bcc_broadcast'} = $broadcast;
+ }
+ }
+ }
+ my ($recipid,$recipstatus) =
+ &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},
+ $env{'user.domain'},\%reciphash);
+ if ($recipstatus ne 'ok') {
+ &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});
+ }
+ if ($env{'form.attachment'}) {
+ if (length($env{'form.attachment'})<131072) {
+ $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now);
+ } else {
+ $r->print(''.&mt('Attachment not included - exceeded permitted length').'
');
+ }
+ } elsif ($env{'form.multiforward'}) {
+ if ($env{'form.attachmenturl'} ne '') {
+ $attachmenturl = $env{'form.attachmenturl'};
+ }
+ }
+ my @recusers;
+ my @recudoms;
foreach my $address (sort(keys(%toaddr))) {
my ($recuname,$recdomain)=split(/\:/,$address);
my $msgtxt = $savemsg;
- if ($toaddr{$address}) { $msgtxt.=' '.$toaddr{$address}; }
+ if ($toaddr{$address}) {
+ $msgtxt.=' '.$toaddr{$address};
+ }
my @thismsg;
- if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
- (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
- '/'.$env{'request.course.sec'}))) {
- $r->print(&mt('Sending critical message').' '.$recuname.':'.$recdomain.': ');
+ if ($msgtype eq 'critical') {
+ $r->print(&mt('Sending critical message').' '.
+ $recuname.':'.$recdomain.': ');
@thismsg=
&Apache::lonmsg::user_crit_msg($recuname,$recdomain,
$msgsubj,$msgtxt,
$env{'form.sendbck'},
$env{'form.permanent'},
- \$sentmessage{$address});
+ \$sentmessage{$address},
+ $nosentstore,$recipid);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
&Apache::lonmsg::user_normal_msg($recuname,$recdomain,
$msgsubj,$msgtxt,
$content{'citation'},
- undef,undef,
+ undef,$attachmenturl,
$env{'form.permanent'},
- \$sentmessage{$address});
+ \$sentmessage{$address},
+ undef,undef,undef,
+ $nosentstore,$recipid);
}
- if (($env{'request.course.id'}) && (($msgtype eq 'critical') ||
- ($env{'form.sendmode'} eq 'group'))) {
- $specialmsg_status{$recuname.':'.$recdomain} =
- join(' ',@thismsg);
- foreach my $result (@thismsg) {
- if ($result eq 'ok') {
- $numspecial++;
- }
- }
+ $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
+ if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {
+ $numsent++;
+ push(@recusers,$recuname);
+ push(@recudoms,$recdomain);
}
$sendstatus.=' '.join(' ',@thismsg);
}
- if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')
- || ($msgtype eq 'critical'))) {
- my $subj_prefix;
- if ($msgtype eq 'critical') {
- $subj_prefix = 'Critical.';
- } else {
- $subj_prefix = 'Broadcast.';
- }
- my ($specialmsgid,$specialresult);
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $course_str = &escape('['.$cnum.':'.$cdom.']');
-
- if ($numspecial) {
- $specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.
- ' '.$course_str,$savemsg,undef,undef,undef,
- undef,undef,\$specialmsgid);
+ my $subj_prefix;
+ if ($numsent > 0) {
+ if (($env{'request.course.id'}) &&
+ (($mode eq 'group') ||
+ ($env{'form.courserecord'}) ||
+ ($msgtype eq 'critical')) ||
+ ($env{'form.replyid'} &&
+ (($content{'courseid'} ne '') &&
+ ($mode eq 'group')))) {
+ if ($msgtype eq 'critical') {
+ $subj_prefix = 'Critical.';
+ } elsif ($mode eq 'group') {
+ $subj_prefix = 'Broadcast.';
+ } else {
+ $subj_prefix = 'Archive';
+ }
+ my ($specialmsgid,$specialresult);
+ my $course_str;
+ if ($env{'form.replyid'}) {
+ if ($content{'courseid'} ne '') {
+ my %crsdesc =
+ &Apache::lonnet::coursedescription($content{'courseid'},
+ {'one_time' => 1});
+ $course_str = &escape('['.$crsdesc{'num'}.':'.$crsdesc{'domain'}.']');
+ }
+ } elsif ($env{'request.course.id'}) {
+ $course_str = &escape('['.$cnum.':'.$cdom.']');
+ }
+ $specialresult =
+ &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,
+ $subj_prefix.' '.$course_str,$savemsg,undef,undef,
+ $attachmenturl,undef,undef,\$specialmsgid,undef,undef,undef,
+ undef,undef,1);
$specialmsgid = &unescape($specialmsgid);
+ if ($specialresult eq 'ok') {
+ my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
+ split(/\:/,&unescape($specialmsgid));
+
+ foreach my $recipient (sort(keys(%toaddr))) {
+ if ($msg_status{$recipient} =~ /\s*(ok|con_delayed)\s*/) {
+ my $usersubj = $subj_prefix.'['.$recipient.']';
+ my $usermsgid =
+ &Apache::lonmsg::buildmsgid($stamp,$usersubj,
+ $msgname,$msgdom,
+ $msgcount,$context,
+ $pid);
+ &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,
+ $subj_prefix.' ['.$recipient.']',$msgsubj,
+ undef,undef,$attachmenturl,undef,$usermsgid,undef,
+ undef,$specialmsgid,undef,undef,undef,1);
+ }
+ }
+ if (($mode ne 'upload') && (@recusers > 0)) {
+ &Apache::lonmsg::process_sent_mail($msgsubj,
+ $subj_prefix,$numsent,$stamp,$msgname,$msgdom,
+ $msgcount,$context,$pid,$savemsg,\@recusers,
+ \@recudoms,undef,$attachmenturl,'','','','',$recipid);
+ }
+ } else {
+ &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
+ }
+ } else {
+ my $stamp = time;
+ my $msgcount = &Apache::lonmsg::get_uniq();
+ my $context = &Apache::lonmsg::get_course_context();
+ &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix,
+ $numsent,$stamp,$env{'user.name'},
+ $env{'user.domain'},$msgcount,$context,
+ $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl,
+ '','','','',$recipid);
}
- if ($specialresult eq 'ok') {
- my $record_sent;
- my @recusers;
- my @recudoms;
- my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
- split(/\:/,&unescape($specialmsgid));
-
- foreach my $recipient (sort(keys(%toaddr))) {
- if ($specialmsg_status{$recipient} eq 'ok') {
- my $usersubj = $subj_prefix.'['.$recipient.']';
- my $usermsgid =
- &Apache::lonmsg::buildmsgid($stamp,$usersubj,
- $msgname,$msgdom,
- $msgcount,$context,
- $pid);
- &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.
- ' ['.$recipient.']',$msgsubj,undef,
- undef,undef,undef,$usermsgid,undef,undef,$specialmsgid);
- my ($uname,$udom) = split(/:/,$recipient);
- push(@recusers,$uname);
- push(@recudoms,$udom);
- }
- }
- if (@recusers) {
- my $specialmessage;
- my $sentsubj =
- $subj_prefix.' ('.$numspecial.' sent) '.$msgsubj;
- $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"');
- my $sentmsgid =
- &Apache::lonmsg::buildmsgid($stamp,$sentsubj,$msgname,
- $msgdom,$msgcount,$context,
- $pid);
- ($specialmsgid,$specialmessage) = &Apache::lonmsg::packagemsg($msgsubj,$savemsg,
- undef,undef,undef,\@recusers,\@recudoms,$sentmsgid);
- $record_sent = &Apache::lonmsg::store_sent_mail($specialmsgid,$specialmessage);
+ }
+ if (!$env{'form.multiforward'}) {
+ if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
+ $r->print(''.&mt('Completed.').
+ ' ');
+ if ($env{'form.displayedcrit'}) {
+ &discrit($r);
}
+ if ($group ne '') {
+ $r->print(&groupmail_sent($group,$cdom,$cnum));
+ } else {
+ &Apache::loncommunicate::menu($r);
+ }
} else {
- &Apache::lonnet::logthis('Failed to create record of critical message or broadcast in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
+ $r->print(''.&mt('Could not deliver message').' '.
+ &mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus).'
');
}
}
- } else {
- &printheader($r,'','No messages sent.');
- }
- if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
- $r->print(''.&mt('Completed.').' ');
- if ($env{'form.displayedcrit'}) {
- &discrit($r);
- } else {
- &Apache::loncommunicate::menu($r);
- }
- } else {
- $r->print(''.&mt('Could not deliver message').' '.
- &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'
');
}
+ return $sendstatus;
}
# ===================================================================== Handler
@@ -1833,7 +3142,8 @@ sub handler {
['display','replyto','forward','markread','markdel','markunread',
'sendreply','compose','sendmail','critical','recname','recdom',
'recordftf','sortedby','block','folder','startdis','interdis',
- 'showcommentbaseurl','dismode','group','subject','text']);
+ 'showcommentbaseurl','dismode','group','subject','text','ref',
+ 'msgstatus']);
$sqs='&sortedby='.$env{'form.sortedby'};
# ------------------------------------------------------ They checked for email
@@ -1863,19 +3173,17 @@ sub handler {
unless ($dismode) {
$dismode='';
} else {
- $sqs.='&dismode='.&escape($dismode);
+ $sqs.='&dismode='.&escape($dismode);
}
# --------------------------------------------------------------------- Display
-
+ my $msgstatus = $env{'form.msgstatus'};
$startdis=$env{'form.startdis'};
- $startdis--;
+ if ($startdis ne '') {
+ $startdis--;
+ }
unless ($startdis) { $startdis=0; }
- $interdis=$env{'form.interdis'};
- unless ($interdis) { $interdis=20; }
- $sqs.='&interdis='.$interdis;
-
if ($env{'form.firstview'}) {
$startdis=0;
}
@@ -1894,23 +3202,26 @@ sub handler {
# --------------------------------------------------------------- Render Output
if ($env{'form.display'}) {
- &displaymessage($r,$env{'form.display'},$folder);
+ &displaymessage($r,$env{'form.display'},$folder,$msgstatus);
} elsif ($env{'form.replyto'}) {
&compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode);
} elsif ($env{'form.confirm'}) {
&printheader($r,'','Confirmed Receipt');
my $replying = 0;
- foreach (keys %env) {
- if ($_=~/^form\.rec\_(.*)$/) {
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($1).' ');
- }
- if ($_=~/^form\.reprec\_(.*)$/) {
- my $msgid=$1;
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($msgid).' ');
- &compout($r,'','','',$msgid);
- $replying = 1;
+ foreach my $envkey (keys(%env)) {
+ if ($envkey=~/^form\.(rep)?rec\_(.*)$/) {
+ my $repchk = $1;
+ my $msgid = $2;
+ $r->print(''.&mt('Confirming Receipt').': ');
+ my $result = &Apache::lonmsg::user_crit_received($msgid);
+ if ($result =~ /trans:\s+ok/) {
+ &statuschange($msgid,'read');
+ }
+ $r->print($result.' ');
+ if ($repchk eq 'rep') {
+ &compout($r,'','','',$msgid);
+ $replying = 1;
+ }
}
}
if (!$replying) {
@@ -1931,47 +3242,82 @@ sub handler {
''.$msg."
\n");
}
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
- } elsif ($env{'form.markedmove'}) {
- my ($total,$failed,@failed_msg)=(0,0);
- foreach my $key (keys(%env)) {
- if ($key=~/^form\.delmark_(.*)$/) {
- my ($result,$msg) =
- &movemsg(&unescape($1),$folder,
- $env{'form.movetofolder'});
- if ($result) {
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
+ } elsif ($env{'form.markedaction'} eq 'markedforward') {
+ my $total = 0;
+ my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msgid (@to_forward) {
+ &statuschange(&unescape($msgid),'forwarded',$folder);
+ $total ++;
+ }
+ if ($total > 0) {
+ &compout($r,undef,undef,undef,undef,$folder,$dismode,$total);
+ }
+ } elsif ($env{'form.markedaction'} eq 'markedread') {
+ my $total = 0;
+ my @to_markread = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msgid (@to_markread) {
+ &statuschange(&unescape($msgid),'read',$folder);
+ $total ++;
+ }
+ &printheader($r,'','Marked Messages Read');
+ $r->print(&mt('Marked [_1] message(s) read',$total).'');
+ &Apache::loncommunicate::menu($r);
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
+ } elsif ($env{'form.markedaction'} eq 'markedunread') {
+ my $total = 0;
+ my @to_markunread = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msgid (@to_markunread) {
+ &statuschange(&unescape($msgid),'new',$folder);
+ $total ++;
+ }
+ &printheader($r,'','Marked Messages Unread');
+ $r->print(&mt('Marked [_1] message(s) unread',$total).'
');
+ &Apache::loncommunicate::menu($r);
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
+ } elsif ($env{'form.markedaction'} eq 'markedmove') {
+ my $destfolder = $env{'form.movetofolder'};
+ my %gotfolders = &Apache::lonmsg::get_user_folders();
+ &printheader($r,'','Moved Messages');
+ if (!defined($gotfolders{$destfolder})) {
+ $r->print(&mt('Destination folder [_1] is not a valid folder',
+ $destfolder));
+ } else {
+ my ($total,$failed,@failed_msg)=(0,0);
+ my @to_move = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msgid (@to_move) {
+ my ($result,$msg) = &movemsg(&unescape($msgid),$folder,
+ $env{'form.movetofolder'});
+ if ($result) {
$total++;
- } else {
+ } else {
$failed++;
push(@failed_msg,$msg);
- }
+ }
}
- }
- &printheader($r,'','Moved Messages');
- if ($failed) {
- $r->print('
+ if ($failed) {
+ $r->print('
'.&mt('Failed to move [_1] message(s)',$failed).
'
');
- $r->print(''.
- join("
\n",@failed_msg).
- "
\n");
- }
- $r->print(&mt('Moved [_1] message(s)',$total).'');
+ $r->print('
'.
+ join("
\n",@failed_msg).
+ "
\n");
+ }
+ $r->print(&mt('Moved [_1] message(s)',$total).'');
+ }
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
- } elsif ($env{'form.markeddel'}) {
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
+ } elsif ($env{'form.markedaction'} eq 'markeddel') {
my ($total,$failed,@failed_msg)=(0,0);
- foreach my $key (keys(%env)) {
- if ($key=~/^form\.delmark_(.*)$/) {
- my ($result,$msg) =
- &statuschange(&unescape($1),'deleted',
- $folder);
- if ($result) {
- $total++;
- } else {
- $failed++;
- push(@failed_msg,$msg);
- }
+ my @to_delete = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $msgid (@to_delete) {
+ my ($result,$msg) = &statuschange(&unescape($msgid),'deleted',
+ $folder);
+ if ($result) {
+ $total++;
+ } else {
+ $failed++;
+ push(@failed_msg,$msg);
}
}
&printheader($r,'','Deleted Messages');
@@ -1985,12 +3331,12 @@ sub handler {
}
$r->print(&mt('Deleted [_1] message(s)',$total).'
');
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
} elsif ($env{'form.markunread'}) {
&printheader($r,'','Marked Message as Unread');
&statuschange($env{'form.markunread'},'new');
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
} elsif ($env{'form.compose'}) {
&compout($r,'','',$env{'form.compose'});
} elsif ($env{'form.recordftf'}) {
@@ -1998,31 +3344,122 @@ sub handler {
} elsif ($env{'form.block'}) {
&examblock($r,$env{'form.block'});
} elsif ($env{'form.sendmail'}) {
- &sendoffmail($r,$folder);
+ if ($env{'form.multiforward'}) {
+ &printheader($r,'','Messages being sent.');
+ my $fixed_subj = $env{'form.subject'};
+ my $suffix=&Apache::lonmsg::foldersuffix($folder);
+ my (%sendresult,%forwardok,%forwardfail,$fwdcount);
+ my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark');
+ foreach my $item (@to_forward) {
+ my $msgid=&unescape($item);
+ my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
+ my %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1,1);
+ if ($env{'form.showorigsubj'}) {
+ $env{'form.subject'} = $fixed_subj.$content{'subject'};
+ } else {
+ $env{'form.subject'} = '';
+ }
+ my $uname = $content{'sendername'};
+ my $udom = $content{'senderdomain'};
+ &statuschange($msgid,'forwarded',$folder);
+ if ($env{'form.showorigsender'}) {
+ $env{'form.message'} = $env{'form.msgheader'}.' '.
+ &Apache::loncommon::plainname($uname,$udom).' ('.
+ $uname.':'.$udom.')';
+ }
+ $env{'form.message'}.="\n\n-- Forwarded message --\n\n".
+ $content{'message'};
+ $env{'form.attachmenturl'} = $content{'attachmenturl'};
+ $env{'form.multiforwid'} = $item;
+ $fwdcount ++;
+ $r->print($fwdcount.': ');
+ $sendresult{$msgid} = &sendoffmail($r,$folder);
+ $r->print(' ');
+ }
+ foreach my $key (keys(%sendresult)) {
+ if ($sendresult{$key} =~/^(\s*(?:ok|con_delayed)\s*)*$/) {
+ $forwardok{$key} = $sendresult{$key};
+ } else {
+ $forwardfail{$key} = $sendresult{$key};
+ }
+ }
+ if (keys(%forwardok) > 0) {
+ my $count = keys(%forwardok);
+ $r->print(''.
+ &mt('[quant,_1,message] forwarded.',$count).
+ ' ');
+ }
+ if (keys(%forwardfail) > 0) {
+ my $count = keys(%forwardfail);
+ $r->print('
'.
+ &mt('Could not forward [quant,_1,message].',$count).
+ ' ');
+ foreach my $key (keys(%forwardfail)) {
+ $r->print(&mt('Could not deliver forwarded message.').' '.
+ &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.'). ');
+ }
+ }
+ &Apache::loncommunicate::menu($r);
+ } else {
+ &sendoffmail($r,$folder);
+ }
if ($env{'form.storebasecomment'}) {
&storecomment($r);
- }
+ }
if (($env{'form.rsspost'}) && ($env{'request.course.id'})) {
- &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},
+ &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},
$env{'course.'.$env{'request.course.id'}.'.domain'},
'Course_Announcements',
$env{'form.subject'},
$env{'form.message'},'/adm/communicate','public');
}
- if (!$env{'form.displayedcrit'}) {
- &disall($r,($folder?$folder:$dismode));
+ if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) {
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
}
} elsif ($env{'form.newfolder'}) {
&printheader($r,'','New Folder');
- &makefolder($env{'form.newfolder'});
- &Apache::loncommunicate::menu($r);
- &disall($r,$env{'form.newfolder'});
+ my $showfolder = $env{'form.newfolder'};
+ my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});
+ if ($makeresult eq 'ok') {
+ $r->print(&mt('Mail folder "[_1]" created.',$showfolder).' ');
+ } else {
+ $r->print(&mt('Creation failed.').' '.$makeresult.' '.
+ $warning);
+ $showfolder = $folder;
+ }
+ &Apache::loncommunicate::menu($r);
+ &disall($r,$showfolder,$msgstatus);
} elsif ($env{'form.showcommentbaseurl'}) {
&storedcommentlisting($r);
+ } elsif ($env{'form.folderaction'} eq 'delete') {
+ &printheader($r,'','Deleted Folder');
+ my $showfolder = '';
+ my $delresult = &deletefolder($folder);
+ if ($delresult eq 'ok') {
+ $r->print(&mt('Mail folder "[_1]" deleted.',$folder).' ');
+ $env{'form.folder'} = '';
+ } else {
+ $r->print(&mt('Deletion failed.').' '.$delresult.' ');
+ $showfolder = $folder;
+ }
+ &Apache::loncommunicate::menu($r);
+ &disall($r,$showfolder,$msgstatus);
+ } elsif ($env{'form.folderaction'} eq 'rename') {
+ &printheader($r,'','Renamed Folder');
+ my $showfolder = $env{'form.renamed'};
+ my $renresult = &renamefolder($folder);
+ if ($renresult eq 'ok') {
+ $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).' ');
+ } else {
+ $r->print(&mt('Renaming failed.').' '.$renresult.' ');
+ $showfolder = $folder;
+ }
+ &Apache::loncommunicate::menu($r);
+ &disall($r,$showfolder,$msgstatus);
} else {
&printheader($r,'','Display All Messages');
- &Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
+ &Apache::loncommunicate::menu($r);
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
}
$r->print(&Apache::loncommon::end_page());
return OK;
@@ -2031,17 +3468,9 @@ sub handler {
=pod
-=back
-
=cut
1;
__END__
-
-
-
-
-
-