--- loncom/interface/lonmsgdisplay.pm 2006/04/23 03:00:34 1.6
+++ loncom/interface/lonmsgdisplay.pm 2011/12/28 14:28:47 1.158
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.6 2006/04/23 03:00:34 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.158 2011/12/28 14:28:47 raeburn 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,54 +101,217 @@ 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;
use Apache::loncommunicate;
use Apache::lonfeedback;
use Apache::lonrss();
+use Apache::lonselstudent();
+use lib '/home/httpd/lib/perl/';
+use LONCAPA qw(:DEFAULT :match);
# Querystring component with sorting type
-my $sqs;
-my $startdis;
-my $interdis;
+my $sqs='';
+my $startdis='';
# ============================================================ 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 {
+ # Don't translate here!
+ my %statushash = (
+ '' => '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++;
- return
- &mt('Page').': '.
- ' '.
- ' '.
- ' of '.$maxdis.
- ' '.
- ' '.
- &mt('Showing messages [_1] through [_2] of [_3]',$first,$finish,$total).'';
+
+ my %statushash = &get_msgstatus_types();
+ my $status;
+ if ($msgstatus eq '') {
+ $status = 'All'; # Don't translate here!
+ } else {
+ $status = $statushash{$msgstatus};
+ }
+ my $output = ''.&mt('Page:').' ';
+ if ($maxdis == 1) {
+ # No buttons if only one page is displayed
+ $output .= '1/1';
+ } else {
+ $output .=
+ ' '.
+ ' '.
+ ' / '.$maxdis.' '.
+ ' '.
+ ' ';
+ }
+ $output .=
+ ''
+ .''.&mt($status.' messages:').' '
+ .&mt('showing messages [_1] through [_2] of [_3].',
+ $first,$finish,$total)
+ .'
'
+ .'';
+
+ return $output;
}
# =============================================================== Status Change
@@ -184,21 +329,134 @@ sub statuschange {
&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
}
if ($newstatus eq 'deleted') {
- &movemsg(&Apache::lonnet::unescape($msgid),$folder,'trash');
- }
+ return &movemsg($msgid,$folder,'trash');
+ }
+ return ;
}
# ============================================================= 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 message 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 {
@@ -206,140 +464,420 @@ sub movemsg {
if ($srcfolder eq 'new') { $srcfolder=''; }
my $srcsuffix=&Apache::lonmsg::foldersuffix($srcfolder);
my $trgsuffix=&Apache::lonmsg::foldersuffix($trgfolder);
+ if ($srcsuffix eq $trgsuffix) {
+ return (0,&mt('Message not moved, Attempted to move message to the same folder as it already is in.'));
+ }
# Copy message
my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
- &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
+ if (!exists($message{$msgid}) || $message{$msgid} eq '') {
+ if (&Apache::lonnet::error(%message)) {
+ return (0,&mt('Message not moved, A network error occurred.'));
+ } else {
+ return (0,&mt('Message not moved as the message is no longer in the source folder.'));
+ }
+ }
+
+ my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix,
+ {$msgid => $message{$msgid}});
+ if (&Apache::lonnet::error($result)) {
+ return (0,&mt('Message not moved, A network error occurred.'));
+ }
# Copy status
unless ($trgfolder eq 'trash') {
- my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
- &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});
+ my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
+ # a non-existant status is the mark of an unread msg
+ if (&Apache::lonnet::error(%status)) {
+ return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
+ }
+ my $result=&Apache::lonnet::put('email_status'.$trgsuffix,
+ {$msgid => $status{$msgid}});
+ if (&Apache::lonnet::error($result)) {
+ return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
+ }
}
+
# Delete orginals
- &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
- &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
+ my $result_del_msg =
+ &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
+ my $result_del_stat =
+ &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
+ if (&Apache::lonnet::error($result_del_msg)) {
+ return (0,&mt('Message copied, but unable to delete the original from the source folder.'));
+ }
+ if (&Apache::lonnet::error($result_del_stat)) {
+ return (0,&mt('Message copied, but unable to delete the original status from the source folder.'));
+ }
+
+ return (1);
}
# ======================================================= Display a course list
sub discourse {
- my $r=shift;
- my $classlist = &Apache::loncoursedata::get_classlist();
- my $now=time;
- my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All',
- 'cfs' => 'Check Section/Group',
- 'cfn' => 'Uncheck All');
- $r->print(<
-
-
-
-
-
-
-ENDDISHEADER
- my %coursepersonnel=&Apache::lonnet::get_course_adv_roles();
- $r->print('
');
- my $sort = sub {
- my $aname=lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]);
- if (!$aname) { $aname=$a; }
- my $bname=lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]);
- if (!$bname) { $bname=$b; }
- return $aname cmp $bname;
- };
- foreach my $student (sort $sort (keys(%{$classlist}))) {
- my $info=$classlist->{$student};
- my ($sname,$sdom,$status,$fullname,$section) =
- (@{$info}[&Apache::loncoursedata::CL_SNAME(),
- &Apache::loncoursedata::CL_SDOM(),
- &Apache::loncoursedata::CL_STATUS(),
- &Apache::loncoursedata::CL_FULLNAME(),
- &Apache::loncoursedata::CL_SECTION()]);
- next if ($status ne 'Active');
- next if ($env{'request.course.sec'} &&
- $section ne $env{'request.course.sec'});
- my $key = 'send_to_&&&'.$section.'&&&_'.$student;
- if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }
- $r->print(''.
- qq{ }.(' 'x2).
- $fullname.' '.$sname.'@'.$sdom.' '.$section.
- ' ');
+ |;
+}
+
+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'};
}
- $r->print('
');
+ 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) {
+ my $brtitle;
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $brtitle = 'View community groups';
+ } else {
+ $brtitle = 'View course groups';
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursegroups",
+ text=>"Groups",
+ title=>$brtitle});
+ }
+ &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 Message"},);
+ if ($action eq 'sending') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({text=>"Messages being sent.",
+ title=>"E-mails sent"},);
+ }
+ my $groupheader = &Apache::loncommon::start_page('Group Message');
+ $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 message').' '.' '.
+ ''. &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);
+
+ my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");
+ $output .=" ".$blocktext;
+
+ 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) {
@@ -700,19 +1323,34 @@ sub compout {
'Broadcast Message');
} elsif ($forwarding) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/email?display=".&Apache::lonnet::escape($forwarding),
+ ({href=>"/adm/email?display=".&escape($forwarding),
text=>"Display Message"});
- &printheader($r,'/adm/email?forward='.&Apache::lonnet::escape($forwarding),
+ &printheader($r,'/adm/email?forward='.&escape($forwarding),
'Forwarding a Message');
} elsif ($replying) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/email?display=".&Apache::lonnet::escape($replying),
+ ({href=>"/adm/email?display=".&escape($replying),
text=>"Display Message"});
- &printheader($r,'/adm/email?replyto='.&Apache::lonnet::escape($replying),
+ &printheader($r,'/adm/email?replyto='.&escape($replying),
'Replying to a Message');
} 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[_1] [quant,_2,message] [_3]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');
@@ -722,43 +1360,142 @@ 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 $crstype = &Apache::loncommon::course_type();
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
+ my $rsstxt;
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $rsstxt = &mt('Include in community RSS newsfeed');
+ } else {
+ $rsstxt = &mt('Include in course RSS newsfeed');
+ }
$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 e-mail address (if known)').' '.
+' '.
+ $rsstxt.' ';
+ }
+ 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'})) {
+
+ my $rectxt;
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $rectxt = &mt("Include in community's 'User records' for recipient(s)");
+ } else {
+ $rectxt = &mt("Include in course's 'User records' for recipient(s)");
+ }
+
+ $dispcrit.=''.
+ ' '.
+ $rectxt.
+ ' ';
+ }
+ }
+
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) {
+ $hasfloat = &disgroup($r,$cdom,$cnum,$group,\%access_status);
+ }
+ }
+ 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').' '.
$content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'};
if ($content{'baseurl'}) {
- $disbase=' ';
+ $disbase=' ';
}
}
if ($replying) {
@@ -766,7 +1503,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'};
@@ -774,96 +1511,332 @@ sub compout {
$dismsg=~s/\f/\n/g;
$dismsg=~s/\n+/\n\> /g;
if ($content{'baseurl'}) {
- $disbase=' ';
+ $disbase=' ';
if ($env{'user.adv'}) {
- $disbase.=' '.&mt('Store message for re-use').
+ $disbase.=' '.&mt('Save message for re-use').
' '.
+ &escape($content{'baseurl'}).'" target="comments">'.
&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'}; }
- $r->print(
+ 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{'sendername'}.':'.
+ $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'}:
-
-$latexHelp
-
$dismsg
-
+ my $latexHelp = &Apache::loncommon::helpLatexCheatsheet(undef,undef,1);
+ my $textareaclass;
+ if (&Apache::lonhtmlcommon::htmlareabrowser()) {
+ $r->print(&Apache::lonhtmlcommon::htmlareaselectactive());
+ $textareaclass = 'class="LC_richDefaultOff"';
+ }
+ 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".
+' ');
+ 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
+
+
+$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
-$dismsg
+$lt{'gmt'}:
+$dismsg
-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);
+ 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
@@ -872,8 +1845,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;
}
@@ -882,13 +1855,13 @@ 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'});
$result.='Recorded by '.
- $content{'sendername'}.'@'.$content{'senderdomain'}."\n";
+ $content{'sendername'}.':'.$content{'senderdomain'}."\n";
$result.=
&Apache::lontexconvert::msgtexconverted($content{'message'})."\n";
}
@@ -896,31 +1869,35 @@ sub retrieve_instructor_comments {
}
sub disfacetoface {
- my ($r,$user,$domain)=@_;
- my $target=$env{'form.grade_target'};
+ my ($r,$user,$domain,$target)=@_;
+ if ($target eq '') {
+ $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',
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
- my $result='';
- foreach (sort keys %records) {
- my %content=&Apache::lonmsg::unpackagemsg($records{$_});
+ my $result='';
+ 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 (!&Apache::lonfeedback::contains_block_html($content{'message'})) {
+ &Apache::lonfeedback::newline_to_br(\$content{'message'});
+ }
if ($content{'subject'}=~/^Record/) {
$result.='
'.&mt('Record').' ';
} elsif ($content{'subject'}=~/^Broadcast/) {
$result .='
'.&mt('Broadcast Message').' ';
if ($content{'subject'}=~/^Broadcast\./) {
if (defined($content{'coursemsgid'})) {
- my $crsmsgid = &Apache::lonnet::escape($content{'coursemsgid'});
+ my $crsmsgid = &escape($content{'coursemsgid'});
my $broadcast_message = &general_message($crsmsgid);
$content{'message'} = '
'.&mt('Subject').': '.$content{'message'}.' '.$broadcast_message;
} else {
@@ -929,11 +1906,24 @@ 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'})) {
- my $crsmsgid=&Apache::lonnet::escape($content{'coursemsgid'});
+ my $crsmsgid=&escape($content{'coursemsgid'});
my $critical_message = &general_message($crsmsgid);
$content{'message'} = '
'.&mt('Subject').': '.$content{'message'}.' '.$critical_message;
} else {
@@ -946,7 +1936,7 @@ sub disfacetoface {
$result.=&mt('By').':
'.
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
-$content{'sendername'}.'@'.
+$content{'sendername'}.':'.
$content{'senderdomain'}.') '.$content{'time'}.
'
'.
&Apache::lontexconvert::msgtexconverted($content{'message'}).
@@ -954,14 +1944,17 @@ $content{'sendername'}.'@'.
}
# Check to see if there were any messages.
if ($result eq '') {
+ my $lctype = &mt(lc(&Apache::loncommon::course_type()));
if ($target ne 'tex') {
- $r->print("".&mt("No notes, face-to-face discussion records, critical messages, or broadcast messages in this course.")."
");
+ $r->print("".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."
");
} else {
- $r->print('\textbf{'.&mt("No notes, face-to-face discussion records, critical messages or broadcast messages in this course.").'}\\\\');
+ $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');
}
+ } elsif ($target ne 'tex') {
+ $r->print($result.' ');
} else {
- $r->print($result);
- }
+ $r->print(&Apache::lonxml::xmlparse($r, 'tex', $result));
+ }
}
sub general_message {
@@ -980,15 +1973,18 @@ 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();
+ my $leaders = ($crstype eq 'Community') ? 'coordinators and leaders'
+ : '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'}; }
@@ -1003,39 +1999,47 @@ 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 Course',
+ '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 course faculty and staff)',
+ 'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
'post' => 'Post this Record');
- $r->print(<<"ENDTREC");
-$lt{'head'}
-
-
-
-
-ENDTREC
+
+ $r->print(''.$lt{'head'}.' '
+ .''
+ .' '
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title($lt{'user'})
+ .' '
+ .' '.$stdbrws
+ .&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title($lt{'dom'})
+ .$domform
+ .&Apache::lonhtmlcommon::row_closure(1)
+ .&Apache::lonhtmlcommon::end_pick_box()
+ .' '
+ .' '
+ .' '
+ );
+
if (($stage ne 'query') &&
($env{'form.recdomain'}) && ($env{'form.recuname'})) {
chomp($env{'form.newrecord'});
if ($env{'form.newrecord'}) {
- my $recordtxt = $env{'form.newrecord'};
- &Apache::lonmsg::user_normal_msg_raw(
- $env{'course.'.$env{'request.course.id'}.'.num'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- &mt('Record').
- ' ['.$env{'form.recuname'}.':'.$env{'form.recdomain'}.']',
- $recordtxt);
- }
- $r->print(''.&Apache::loncommon::plainname($env{'form.recuname'},
- $env{'form.recdomain'}).' ');
+ &Apache::lonmsg::store_instructor_comment($env{'form.newrecord'},
+ $env{'form.recuname'},
+ $env{'form.recdomain'});
+ }
+ my $aboutmelink=&Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($env{'form.recuname'}
+ ,$env{'form.recdomain'})
+ ,$env{'form.recuname'},$env{'form.recdomain'});
+ $r->print(' '
+ .''
+ .&mt('Discussion and message records for [_1] ([_2])'
+ ,$aboutmelink
+ ,$env{'form.recuname'}.':'.$env{'form.recdomain'})
+ .''
+ );
&disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
$r->print(<
@@ -1058,24 +2062,34 @@ 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;
}
+ my $usertype;
+ my $crstype = &Apache::loncommon::course_type();
+ if ($crstype eq 'Community') {
+ $usertype = 'members';
+ } else {
+ $usertype = 'students';
+ }
+ my $lctype = lc($crstype);
my %lt=&Apache::lonlocal::texthash(
'comb' => 'Communication Blocking',
'cbds' => 'Communication blocking during scheduled exams',
- 'desc' => 'You can use communication blocking to prevent students enrolled in this course from displaying LON-CAPA messages sent by other students during an online exam. As blocking of communication could potentially interrupt legitimate communication between students 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.',
+ 'desc' => "You can use communication blocking to prevent $usertype enrolled in this $lctype 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 or community, 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'
@@ -1107,7 +2121,7 @@ sub examblock {
$r->print(<<"END");
-
+
$end_page
END
@@ -1118,10 +2132,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 = ();
@@ -1132,35 +2142,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) {
@@ -1173,13 +2188,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 {
@@ -1203,70 +2218,89 @@ sub get_blockdates {
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'}
);
- $$blockcount = keys %{$records};
-
- foreach (keys %{$records}) {
- if ($_ eq 'error: 2 tie(GDBM) Failed while attempting dump') {
- $$blockcount = 0;
- last;
+ $$blockcount = keys(%{$records});
+
+ if ((keys(%{$records}))[0] =~ /^error: 2 /) {
+ $records = {};
+ $$blockcount = 0;
+ }
+}
+
+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;
- my @bgcols = ("#eeeeee","#dddddd");
- my $function = &Apache::loncommon::get_users_function();
- my $color = &Apache::loncommon::designparm($function.'.tabbg',
- $env{'user.domain'});
+
my %lt = &Apache::lonlocal::texthash(
'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 (sort keys %{$records}) {
- my $iter = $parmcount%2;
+ foreach my $record (sort(keys(%{$records}))) {
my $onchange = 'onFocus="javascript:window.document.forms['.
"'blockform'].elements['modify_".$parmcount."'].".
'checked=true;"';
- my ($start,$end) = split/____/,$_;
+ my ($start,$end) = split(/____/,$record);
my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
- my ($setter,$title) = split/:/,$$records{$_};
- my ($setuname,$setudom) = split/@/,$setter;
- my $settername = &Apache::loncommon::plainname($setuname,$setudom);
+
+ my ($setuname,$setudom,$title,$blocks) =
+ &Apache::loncommon::parse_block_record($$records{$record});
+ $title = &HTML::Entities::encode($title,'"<>&');
+ 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
-
- $lt{'modi'}? $lt{'canc'}?
-
+
+
+END
+ foreach my $block (@{$typeorder}) {
+ my $blockstatus = '';
+ if ($blocks->{$block} eq 'on') {
+ $blockstatus = 'checked="checked"';
+ }
+ $r->print(' '.$types->{$block}.' ');
+ }
+ $r->print(<<"END");
+
+
+ $lt{'modi'}
+
+
+ $lt{'canc'}
+
END
- $parmcount ++;
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $parmcount++;
}
$r->print(<<"END");
-
-
-
-
-
-
@@ -1283,245 +2317,586 @@ sub display_addblocker_table {
'checked=true;"';
my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
- my $function = &Apache::loncommon::get_users_function();
- my $color = &Apache::loncommon::designparm($function.'.tabbg',
- $env{'user.domain'});
my %lt = &Apache::lonlocal::texthash(
'addb' => 'Add block',
'exam' => 'e.g., Exam 1',
'addn' => 'Add new communication blocking periods'
);
+ my ($typeorder,$types) = &blocktype_text();
$r->print(<<"END");
$lt{'addn'}
-
+
+ $lt{'addb'}
+
END
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $r->print(&Apache::loncommon::end_data_table());
return;
}
-sub blockcheck {
- my ($setters,$startblock,$endblock) = @_;
- # Retrieve active student roles and active course coordinator/instructor roles
- my @livecses = ();
- my @staffcses = ();
- $$startblock = 0;
- $$endblock = 0;
- foreach (keys %env) {
- if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {
- my $role = $1;
- my $cse = $2;
- $cse =~ s|/|_|;
- if ($env{$_} =~ m/^(\d*)\.(\d*)$/) {
- unless (($2 > 0 && $2 < time) || ($1 > time)) {
- if ($role eq 'st') {
- push @livecses, $cse;
- } else {
- unless (grep/^$cse$/,@staffcses) {
- push @staffcses, $cse;
- }
- }
- }
- }
- } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) {
- my $rolepriv = $env{'user.role..rolesdef_'.$3};
- }
- }
- # Retrieve blocking times and identity of blocker for active courses for students.
- if (@livecses > 0) {
- foreach my $cse (@livecses) {
- my ($cdom,$crs) = split/_/,$cse;
- if ( (grep/^$cse$/,@staffcses) && ($env{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {
- next;
- } else {
- %{$$setters{$cse}} = ();
- @{$$setters{$cse}{'staff'}} = ();
- @{$$setters{$cse}{'times'}} = ();
- my %records = &Apache::lonnet::dump('comm_block',$cdom,$crs);
- foreach (keys %records) {
- if ($_ =~ m/^(\d+)____(\d+)$/) {
- if ($1 <= time && $2 >= time) {
- my ($staff,$title) = split/:/,$records{$_};
- push @{$$setters{$cse}{'staff'}}, $staff;
- push @{$$setters{$cse}{'times'}}, $_;
- if ( ($$startblock == 0) || ($$startblock > $1) ) {
- $$startblock = $1;
- }
- if ( ($$endblock == 0) || ($$endblock < $2) ) {
- $$endblock = $2;
- }
- }
- }
- }
- }
- }
- }
-}
-
-sub build_block_table {
- my ($r,$startblock,$endblock,$setters) = @_;
- my $function = &Apache::loncommon::get_users_function();
- my $color = &Apache::loncommon::designparm($function.'.tabbg',
- $env{'user.domain'});
- my %lt = &Apache::lonlocal::texthash(
- 'cacb' => 'Currently active communication blocks',
- 'cour' => 'Course',
- 'dura' => 'Duration',
- 'blse' => 'Block set by'
- );
- $r->print(<<"END");
- $lt{'cacb'}:
-
-
-
-
-
-
-
-
- $lt{'cour'}
- $lt{'dura'}
- $lt{'blse'}
-
-END
- foreach (keys %{$setters}) {
- my %courseinfo=&Apache::lonnet::coursedescription($_);
- for (my $i=0; $i<@{$$setters{$_}{staff}}; $i++) {
- my ($uname,$udom) = split/\@/,$$setters{$_}{staff}[$i];
- my $fullname = &Apache::loncommon::plainname($uname,$udom);
- my ($openblock,$closeblock) = split/____/,$$setters{$_}{times}[$i];
- $openblock = &Apache::lonlocal::locallocaltime($openblock);
- $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
- $r->print(''.$courseinfo{'description'}.' '.
- ''.$openblock.' to '.$closeblock.' '.
- ''.$fullname.' ('.$uname.'@'.$udom.
- ') ');
- }
- }
- $r->print('
');
+sub blocktype_text {
+ my %types = &Apache::lonlocal::texthash(
+ 'com' => 'Messaging',
+ 'chat' => 'Chat Room',
+ 'boards' => 'Discussion',
+ 'port' => 'Portfolio',
+ 'groups' => 'Groups',
+ 'blogs' => 'Blogs',
+ );
+ 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);
+ #$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);
+ my($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");
+ $r->print(" ".$blocktext);
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=&Apache::lonnet::escape($msgid);
+ my $escmsgid=&escape($msgid);
foreach (@messages) {
if ($_->[5] eq $escmsgid){
last;
}
$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='.&Apache::lonnet::escape($msgid),'Display a Message','',$content{'baseurl'});
- my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
-# Functions
- $r->print(''.&mt('Functions').': '.
- ''.&mt('Reply').' '.
- ''.&mt('Forward').' '.
- ''.&mt('Mark Unread').' '.
- ''.&mt('Delete').' '.
- ''.&mt('Back to Folder Display').' ');
+ &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
+
+# Prepare available functions
+ my @functionlist;
+ if (!$content{'noreplies'}) {
+ push(@functionlist,''
+ .&mt('Reply')
+ .' ');
+ }
+ push(@functionlist,''
+ .&mt('Forward')
+ .' ');
+ push(@functionlist,''
+ .&mt('Mark Unread')
+ .' ');
+ push(@functionlist,''
+ .&mt('Delete')
+ .' ');
+ push(@functionlist,''
+ .&mt('Back to Folder Display')
+ .' ');
if ($counter > 0){
- $r->print(''.&mt('Previous').' ');
+ push(@functionlist,''
+ .&mt('Previous')
+ .' ');
}
if ($counter < $number_of_messages - 1){
- $r->print(''.&mt('Next').' ');
+ push(@functionlist,''
+ .&mt('Next')
+ .' ');
}
- $r->print('
');
+
+# Prepare available actions
+ my $symb;
+ if (defined($content{'symb'})) {
+ $symb = $content{'symb'};
+ } elsif (defined($content{'baseurl'})) {
+ $symb=&Apache::lonnet::symbread($content{'baseurl'});
+ }
+ my @actionlist;
if ($env{'user.adv'}) {
- $r->print(''.&mt('Currently available actions (will open extra window)').': ');
- my $symb=&Apache::lonnet::symbread($content{'baseurl'});
+
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').' ');
- }
+ push(@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').' ');
+ push(@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').' ');
+ push(@actionlist,&Apache::loncommon::pgrdlink(
+ &mt('Set/Change grades')
+ ,$content{'sendername'}
+ ,$content{'senderdomain'}
+ ,$symb
+ ,'check'));
}
- $r->print('
');
}
- my $tolist;
- my @recipients = ();
- for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
- $recipients[$i] = &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'recuser'}[$i],
+
+# Print functionlist and actionlist in page header
+ my $functions='';
+
+ # Functionlist
+ $functions.=&Apache::lonhtmlcommon::start_funclist();
+ foreach my $item (@functionlist) {
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
+ }
+ $functions .= &Apache::lonhtmlcommon::end_funclist();
+
+ # Actionlist
+ if (@actionlist) {
+ my $legendtext=&mt('Currently available actions (will open extra window)');
+ $functions.=&Apache::lonhtmlcommon::start_funclist($legendtext);
+ foreach my $item (@actionlist) {
+ $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
+ }
+ $functions.=&Apache::lonhtmlcommon::end_funclist();
+ }
+
+ $functions.='
';
+ $r->print(&Apache::loncommon::head_subbox($functions));
+
+
+ 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 $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);
+ }
+
+ if (((!$tolist) && (!$broadcast_link)) && 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'});
+ }
+ $r->print(''
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title(&mt('Subject'))
+ .$content{'subject'}
+ .&Apache::lonhtmlcommon::row_closure()
+ );
+ if ($folder eq 'sent') {
+ # To
+ if ($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 ($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'})) {
+ if (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') {
+ $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'} ne '') {
+ if ($content{'courseid'} =~ m{^$match_domain\_$match_courseid$}) {
+ my %courseinfo;
+ %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'},
+ {'one_time' => 1});
+ my $description = $courseinfo{'description'};
+ if ($description ne '') {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt($crstype))
+ .$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()
+ );
+
+ }
+ }
+ }
+ }
+
+ # 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);
+ }
+ }
+ }
+ }
+ }
}
- $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('Course').': '.$courseinfo{'description'}.
- ($content{'coursesec'}?' ('.&mt('Group/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;
+ 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;
+ $start_page =
+ &Apache::loncommon::start_page('Broadcast List', undef,
+ {only_body => 1,
+ js_ready => 1,});
+ $end_page = &Apache::loncommon::end_page({js_ready => 1,});
+ $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(<
+//
+
+
+ENDJS
+ $broadcast_link = 1;
+ }
+ }
+ return $broadcast_link;
}
# =========================================================== Show the citation
@@ -1534,7 +2909,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
@@ -1563,16 +2943,14 @@ sub displayresource {
sub header {
my ($r,$title,$baseurl)=@_;
-
my $extra = &Apache::loncommon::studentbrowser_javascript();
if ($baseurl) {
- $extra .= " ";
+ $extra .= " ";
}
- $r->print(&Apache::loncommon::start_page('Communication and Messages',
- $extra));
+ $r->print(&Apache::loncommon::start_page('Messages',
+ $extra));
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,($title?$title:'Communication and Messages')));
-
+ (($title?$title:'Send and display messages')));
}
# ---------------------------------------------------------------- Print header
@@ -1591,31 +2969,31 @@ 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=&Apache::lonnet::escape($env{'form.baseurl'}).'___'.time;
+ my $key=&escape($env{'form.baseurl'}).'___'.time;
&Apache::lonnet::put('nohist_stored_comments',{ $key => $cleanmsgtxt });
}
sub storedcommentlisting {
my ($r)=@_;
my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
- '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($env{'form.showcommentbaseurl'})));
- $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,
+ '^'.&escape(&escape($env{'form.showcommentbaseurl'})));
+ $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.'));
}
}
}
@@ -1626,20 +3004,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'};
@@ -1647,36 +3045,115 @@ sub sendoffmail {
%content=&Apache::lonmsg::unpackagemsg($message{$msgid},1);
&statuschange($msgid,'replied',$folder);
}
- my %toaddr=();
- undef %toaddr;
- if ($env{'form.sendmode'} eq 'group') {
- foreach (keys %env) {
- if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
- $toaddr{$1}='';
- }
- }
- } elsif ($env{'form.sendmode'} eq 'upload') {
- foreach (split(/[\n\r\f]+/,$env{'form.upfile'})) {
- my ($rec,$txt)=split(/\s*\:\s*/,$_);
+
+ my $mode = $env{'form.sendmode'};
+ my (%toaddr,$tos,$cc,$bcc,$broadcast);
+
+ 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) = ($line =~ /^([^:]+:[^:]+):(.*)$/);
if ($txt) {
- $rec=~s/\@/\:/;
+ $rec =~ s/^\s+//;
+ $rec =~ s/\s+$//;
$toaddr{$rec}.=$txt."\n";
+ $broadcast->{$rec} = '';
}
}
} else {
- $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ 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(/\@/,$_);
- $toaddr{$auname.':'.$audom}='';
+ 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}='';
+ 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;
- my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'});
+ my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'},
+ undef,1);
if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
(&Apache::lonnet::allowed('srm',$env{'request.course.id'})
|| &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
@@ -1687,107 +3164,175 @@ sub sendoffmail {
} else {
$savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
}
-
- foreach (keys %toaddr) {
- my ($recuname,$recdomain)=split(/\:/,$_);
+ 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{$_}) { $msgtxt.=' '.$toaddr{$_}; }
- 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.': ');
- $thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt,
- $env{'form.sendbck'},$env{'form.permanent'},
- \$sentmessage{$_});
+ if ($toaddr{$address}) {
+ $msgtxt.="\n".' '."\n".$toaddr{$address};
+ }
+ my @thismsg;
+ 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},
+ $nosentstore,$recipid);
} else {
- $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');
- $thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt,
- $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_});
- }
- if (($env{'request.course.id'}) && (($msgtype eq 'critical') ||
- ($env{'form.sendmode'} eq 'group'))) {
- $specialmsg_status{$recuname.':'.$recdomain} = $thismsg;
- if ($thismsg eq 'ok') {
- $numspecial ++;
- }
+ $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
+ @thismsg=
+ &Apache::lonmsg::user_normal_msg($recuname,$recdomain,
+ $msgsubj,$msgtxt,
+ $content{'citation'},
+ undef,$attachmenturl,
+ $env{'form.permanent'},
+ \$sentmessage{$address},
+ undef,undef,undef,
+ $nosentstore,$recipid);
+ }
+ $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
+ if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {
+ $numsent++;
+ push(@recusers,$recuname);
+ push(@recudoms,$recdomain);
}
- $r->print($thismsg.' ');
- $sendstatus.=' '.$thismsg;
+ $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.';
+ 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 {
- $subj_prefix = 'Broadcast.';
+ 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);
}
- my ($specialmsgid,$specialresult);
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $course_str = &Apache::lonnet::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);
- $specialmsgid = &Apache::lonnet::unescape($specialmsgid);
- }
- if ($specialresult eq 'ok') {
- my $record_sent;
- my @recusers = ();
- my @recudoms = ();
- my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
- split(/\:/,&Apache::lonnet::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*)*$/) {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Completed.'));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ 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');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not deliver message'),1);
+ $message .= ' '.&mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
}
}
} 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').'
');
+ &printheader($r,'','Messages cancelled.');
+ return 'cancelled';
}
+ return $sendstatus;
}
# ===================================================================== Handler
@@ -1807,8 +3352,9 @@ sub handler {
['display','replyto','forward','markread','markdel','markunread',
'sendreply','compose','sendmail','critical','recname','recdom',
'recordftf','sortedby','block','folder','startdis','interdis',
- 'showcommentbaseurl','dismode']);
- $sqs='&sortedby='.$env{'form.sortedby'};
+ 'showcommentbaseurl','dismode','group','subject','text','ref',
+ 'msgstatus']);
+ $sqs='&sortedby='.$env{'form.sortedby'};
# ------------------------------------------------------ They checked for email
unless ($env{'form.block'}) {
@@ -1820,7 +3366,7 @@ sub handler {
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/communicate",
- text=>"Communication/Messages",
+ text=>"Messages",
faq=>12,bug=>'Communication Tools',});
# ------------------------------------------------------------------ Get Folder
@@ -1829,7 +3375,7 @@ sub handler {
unless ($folder) {
$folder='';
} else {
- $sqs.='&folder='.&Apache::lonnet::escape($folder);
+ $sqs.='&folder='.&escape($folder);
}
# ------------------------------------------------------------ Get Display Mode
@@ -1837,19 +3383,17 @@ sub handler {
unless ($dismode) {
$dismode='';
} else {
- $sqs.='&dismode='.&Apache::lonnet::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;
}
@@ -1863,29 +3407,36 @@ sub handler {
$startdis++;
}
my $postedstartdis=$startdis+1;
- $sqs.='&startdis='.$postedstartdis;
+ $sqs.='&startdis='.$postedstartdis;
# --------------------------------------------------------------- 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');
- 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);
+ my $replying = 0;
+ 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;
+ }
}
}
- &discrit($r);
+ if (!$replying) {
+ &discrit($r);
+ }
} elsif ($env{'form.critical'}) {
&printheader($r,'','Displaying Critical Messages');
&discrit($r);
@@ -1893,39 +3444,120 @@ sub handler {
&compout($r,$env{'form.forward'},undef,undef,undef,$folder);
} elsif ($env{'form.markdel'}) {
&printheader($r,'','Deleted Message');
- &statuschange($env{'form.markdel'},'deleted',$folder);
+ my ($result,$msg) =
+ &statuschange($env{'form.markdel'},'deleted',$folder);
+ if (!$result) {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete the message.'),1);
+ $message .= ''.$msg.'
';
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ }
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
- } elsif ($env{'form.markedmove'}) {
- my $total=0;
- foreach (keys %env) {
- if ($_=~/^form\.delmark_(.*)$/) {
- &movemsg(&Apache::lonnet::unescape($1),$folder,
- $env{'form.movetofolder'});
- $total++;
+ &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');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] read',$total));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ # $r->print('');
+ &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');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] unread',$total));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ # $r->print('
');
+ &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 {
+ $failed++;
+ push(@failed_msg,$msg);
+ }
}
- }
- &printheader($r,'','Moved Messages');
- $r->print('Moved '.$total.' message(s)
');
+ my $message = '';
+ if ($failed) {
+ $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to move [quant,_1,message]',$failed),1);
+ $message .= '
'.
+ join("
\n",@failed_msg).
+ "
\n";
+ }
+ $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Moved [quant,_1,message]',$total));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ # $r->print('');
+ }
&Apache::loncommunicate::menu($r);
- &disall($r,($folder?$folder:$dismode));
- } elsif ($env{'form.markeddel'}) {
- my $total=0;
- foreach (keys %env) {
- if ($_=~/^form\.delmark_(.*)$/) {
- &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);
- $total++;
+ &disall($r,($folder?$folder:$dismode),$msgstatus);
+ } elsif ($env{'form.markedaction'} eq 'markeddel') {
+ my ($total,$failed,@failed_msg)=(0,0);
+ 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');
- $r->print('Deleted '.$total.' message(s)
');
+ my $message = '';
+ if ($failed) {
+ $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete [quant,_1,message]',$failed),1);
+ $message .= '
'.
+ join("
\n",@failed_msg).
+ "
\n";
+ }
+ $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Deleted [quant,_1,message]',$total));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ # $r->print('');
&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'}) {
@@ -1933,29 +3565,133 @@ 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);
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('[quant,_1,message] forwarded.',$count));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ }
+ if (keys(%forwardfail) > 0) {
+ my $count = keys(%forwardfail);
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);
+ foreach my $key (keys(%forwardfail)) {
+ $message .= ' '.&mt('Could not deliver forwarded message.').' '.
+ &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')';
+ }
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ }
+ &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');
}
- &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') {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" created.',$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ } else {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Creation failed.').' '.$makeresult.' '.$warning,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ $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') {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" deleted.',$folder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ $env{'form.folder'} = '';
+ } else {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Deletion failed.').' '.$delresult,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ $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') {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" renamed to "[_2]".',$folder,$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ } else {
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Renaming failed.').' '.$renresult,1);
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
+ $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;
@@ -1964,17 +3700,9 @@ sub handler {
=pod
-=back
-
=cut
1;
__END__
-
-
-
-
-
-
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.