--- loncom/interface/lonmsgdisplay.pm 2006/12/07 21:06:57 1.48
+++ loncom/interface/lonmsgdisplay.pm 2008/06/06 17:46:15 1.87
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.48 2006/12/07 21:06:57 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.87 2008/06/06 17:46:15 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,12 +33,13 @@ package Apache::lonmsgdisplay;
=head1 NAME
-Apache::lonmsg: supports internal messaging
+Apache::lonmsgdisplay: supports internal messaging
=head1 SYNOPSIS
-lonmsg provides routines for sending messages, receiving messages, and
-a handler to allow users to read, send, and delete messages.
+lonmsgdisplay provides a handler to allow users to read, send,
+and delete messages, and to create and delete message folders,
+and to move messages between folders.
=head1 OVERVIEW
@@ -74,8 +75,8 @@ email program, so they have full access
interface, or other features they may wish to use in response to the
student's query.
-=item * B: LON-CAPA can block display of e-mails that are
-sent to a student during an online exam. A course coordinator or
+=item * B: LON-CAPA can block selected communication
+features for students during an online exam. A course coordinator or
instructor can set an open and close date/time for scheduled online
exams in a course. If a user uses the LON-CAPA internal messaging
system to display e-mails during the scheduled blocking event,
@@ -93,25 +94,6 @@ addresses on their B screen, but g
are much more useful than traditional email can be made to be, even
with HTML support.
-Right now, this document will cover just how to send a message, since
-it is likely you will not need to programmatically read messages,
-since lonmsg already implements that functionality.
-
-The routines used to package messages and unpackage messages are not
-only used by lonmsg when creating/extracting messages for LON-CAPA's
-internal messaging system, but also by lonnotify.pm which is available
-for use by Domain Coordinators to broadcast standard e-mail to specified
-users in their domain. The XML packaging used in the two cases is very
-similar. The differences are the use of $uname and
-$udom in stored internal messages, compared
-with $email in stored
-Domain Coordinator e-mail for the storage of information about
-recipients of the message/e-mail.
-
-=head1 FUNCTIONS
-
-=over 4
-
=cut
use strict;
@@ -119,6 +101,7 @@ use Apache::lonnet;
use HTML::TokeParser();
use Apache::Constants qw(:common);
use Apache::loncommon();
+use Apache::lonhtmlcommon();
use Apache::lontexconvert();
use HTML::Entities();
use Apache::lonlocal;
@@ -132,17 +115,25 @@ use LONCAPA;
# Querystring component with sorting type
my $sqs;
my $startdis;
-my $interdis;
# ============================================================ List all folders
sub folderlist {
- my $folder=shift;
+ my ($folder,$msgstatus) = @_;
my %lt = &Apache::lonlocal::texthash(
actn => 'Action',
fold => 'Folder',
show => 'Show',
+ status => 'Message Status',
go => 'Go',
+ nnff => 'New Name for Folder',
+ newn => 'New Name',
+ thfm => 'The folder may not be renamed',
+ fmnb => 'folder may not be renamed as it is a folder provided by the system.',
+ asth => 'as this name is already in use for a system-provided or user-defined folder.',
+ the => 'The',
+ tnfm => 'The new folder may not be named',
+
);
my %actions = &Apache::lonlocal::texthash(
@@ -152,6 +143,10 @@ sub folderlist {
);
$actions{'select_form_order'} = ['view','rename','delete'];
+ my %statushash = &get_msgstatus_types();
+
+ $statushash{'select_form_order'} = ['','new','read','replied','forwarded'];
+
my %permfolders = &get_permanent_folders();
my $permlist = join("','",sort(keys(%permfolders)));
my ($permlistkeys,$permlistvals);
@@ -165,6 +160,7 @@ sub folderlist {
my %userfolders;
foreach my $key (keys(%gotfolders)) {
+ $key =~ s/(['"])/\$1/g; #' stupid emacs
$userfolders{$key} = $key;
}
my @userorder = sort(keys(%userfolders));
@@ -172,7 +168,7 @@ sub folderlist {
my $folderlist = join("','",@userorder);
$folderlist .= "','".$permlistvals;
- $formhash{'select_form_order'} = ['','critical','new',@userorder,'sent','trash'];
+ $formhash{'select_form_order'} = ['','critical',@userorder,'sent','trash'];
my $output = qq||;
+ my %show = ('select_form_order' => [10,20,50,100,200],
+ map {$_=>$_} (10,20,50,100,200));
+
+
$output .= '
':'');
+ ($folder=~/^critical/?'':'');
return $output;
}
@@ -261,25 +261,43 @@ sub get_permanent_folders {
my %permfolders =
&Apache::lonlocal::texthash('' => 'INBOX',
'trash' => 'TRASH',
- 'new' => 'New Messages Only',
'critical' => 'Critical',
'sent' => 'Sent Messages',
);
return %permfolders;
}
+sub get_msgstatus_types {
+ my %statushash = &Apache::lonlocal::texthash(
+ '' => 'Any',
+ new => 'Unread',
+ read => 'Read',
+ replied => 'Replied to',
+ forwarded => 'Forwarded',
+ );
+ return %statushash;
+}
+
sub scrollbuttons {
- my ($start,$maxdis,$first,$finish,$total)=@_;
+ my ($start,$maxdis,$first,$finish,$total,$msgstatus)=@_;
unless ($total>0) { return ''; }
$start++; $maxdis++;$first++;$finish++;
+
+ my %statushash = &get_msgstatus_types();
+ my $status;
+ if ($msgstatus eq '') {
+ $status = &mt('All');
+ } else {
+ $status = $statushash{$msgstatus};
+ }
return
- &mt('Page').': '.
+ ''.&mt('Page').': '.
''.
''.
' of '.$maxdis.
''.
' '.
- &mt('Showing messages [_1] through [_2] of [_3]',$first,$finish,$total).'';
+ &mt('[_1] messages: showing messages [_2] through [_3] of [_4].',$status,$first,$finish,$total).'';
}
# =============================================================== Status Change
@@ -346,18 +364,18 @@ sub deletefolder {
my ($folder)=@_;
my %permfolders = &get_permanent_folders();
if (defined($permfolders{$folder})) {
- return &mt('The folder [_1] may not be deleted',$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.',
+ 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.').
+ 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.');
}
@@ -372,6 +390,9 @@ sub renamefolder {
if ($env{'form.renamed'} eq '') {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname);
}
+ if (defined($permfolders{$folder})) {
+ return &mt('The folder "[_1]" may not be renamed as it is a folder provided by the system.',$folder);
+ }
if (defined($permfolders{$newname})) {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname);
}
@@ -492,22 +513,34 @@ sub discourse {
$result .= ''."\n";
- $result .= &Apache::lonselstudent::render_student_list($current_members,
- "compemail",
- "current",
- \%defaultUsers,
- 1,"selectedusers",1);
-
- $result .= &Apache::lonselstudent::render_student_list($expired_members,
- "compemail",
- "expired",
- \%defaultUsers,
- 1, "selectedusers",0);
- $result .= &Apache::lonselstudent::render_student_list($future_members,
- "compemail",
- "future",
- \%defaultUsers,
- 1, "selectedusers", 0);
+ my $tmptext;
+ if ($tmptext = &Apache::lonselstudent::render_student_list($current_members,
+ "compemail",
+ "current",
+ \%defaultUsers,
+ 1,"selectedusers",1)
+ ) {
+ $result .= '
'.
-&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
- ' '.
- ''.
- '';
+ '
';
+ my ($rec_button,$reprec_button);
+ $rec_button = &mt('Move to Inbox');
+ if (!$content{'noreplies'}) {
+ $reprec_button = &mt('Move to Inbox/Compose reply');
+ }
+ if ($content{'sendback'}) {
+ $rec_button = &mt('Confirm Receipt');
+ if (!$content{'noreplies'}) {
+ $reprec_button = &mt('Confirm Receipt and Reply');
+ }
+ $result .= &mt('You have to confirm that you have received this message before you can view other pages. After confirmation, this message will be moved to your regular inbox');
+ } else {
+ $result .= &mt('Access to other pages will be prevented until you have moved the message to your inbox.');
+ }
+ $result .= '
'.
+ '';
+ if (!$content{'noreplies'}) {
+ $result .= '';
+ }
}
# Check to see if there were any messages.
if ($result eq '') {
@@ -736,10 +784,9 @@ $content{'sendername'}.':'.
}
sub sortedmessages {
- my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_;
+ my ($blocked,$startblock,$endblock,$numblocked,$folder,$msgstatus) = @_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);
-
#unpack the varibles and repack into temp for sorting
my @temp;
my %descriptions;
@@ -754,9 +801,10 @@ sub sortedmessages {
foreach my $msgid (@messages) {
my $esc_msgid=&escape($msgid);
- my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=
+ my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,$processid,$symb,$error) =
&Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,
\%status_cache);
+ next if ($msgstatus ne '' && $msgstatus ne $status);
my $description = &get_course_desc($fromcid,\%descriptions);
my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
$esc_msgid,$description);
@@ -852,148 +900,108 @@ sub get_course_desc {
}
}
-# ======================================================== Display new messages
-
-
-sub disnew {
- my $r=shift;
- my %lt=&Apache::lonlocal::texthash(
- 'nm' => 'New Messages',
- 'su' => 'Subject',
- 'co' => 'Course',
- 'da' => 'Date',
- 'us' => 'Username',
- 'op' => 'Open',
- 'do' => 'Domain'
- );
- my @msgids = sort(&Apache::lonnet::getkeys('nohist_email'));
- my @newmsgs;
- my %setters = ();
- my %blocked = ();
- my $numblocked = 0;
- # Check for blocking of display because of scheduled online exams.
- my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
- my %status_cache =
- &Apache::lonnet::get('email_status',\@msgids);
- my %descriptions;
- foreach my $id (@msgids) {
- my $msgid=&escape($id);
- my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
- &Apache::lonmsg::unpackmsgid($msgid,undef,undef,\%status_cache);
- if (defined($sendtime) && $sendtime!~/error/) {
- my $description = &get_course_desc($fromcid,\%descriptions);
- my $numsendtime = $sendtime;
- $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
- if ($status eq 'new') {
- if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) {
- $blocked{$id} = 'ON';
- $numblocked ++;
- } else {
- push(@newmsgs, {
- msgid => $msgid,
- sendtime => $sendtime,
- shortsub => $shortsubj,
- from => $fromname,
- fromdom => $fromdom,
- course => $description,
- });
- }
- }
- }
- }
- if ($#newmsgs >= 0) {
- $r->print(<$lt{'nm'}
-
-
$lt{'da'}
$lt{'us'}
$lt{'do'}
$lt{'su'}
$lt{'co'}
-TABLEHEAD
- foreach my $msg (@newmsgs) {
- $r->print(<<"ENDLINK");
-
-ENDLINK
- foreach my $item ('sendtime','from','fromdom','shortsub','course') {
- $r->print("
$msg->{$item}
");
- }
- $r->print("
");
- }
- $r->print('
');
- } elsif ($numblocked == 0) {
- $r->print("
".&mt('You have no unread messages')."
");
- }
- if ($numblocked > 0) {
- my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
- my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
- $r->print('
'.&mt('You have [quant,_1,blocked unread message,blocked unread messages].',$numblocked).'
'."\n".
- &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).' '."\n".
- &Apache::loncommon::build_block_table($startblock,$endblock,
- \%setters));
- }
-}
-
-
# ======================================================== Display all messages
sub disall {
- my ($r,$folder)=@_;
- $r->print(&folderlist($folder));
- if ($folder eq 'new') {
- &disnew($r);
- } elsif ($folder eq 'critical') {
+ my ($r,$folder,$msgstatus)=@_;
+ my %saveable = ('msgstatus' => 'scalar',
+ 'sortedby' => 'scalar',
+ 'interdis' => 'scalar',
+ );
+ &Apache::loncommon::store_settings('user','mail',\%saveable);
+ &Apache::loncommon::restore_settings('user','mail',\%saveable);
+ $folder ||= $env{'form.folder'};
+ $msgstatus ||= $env{'form.msgstatus'};
+ $env{'form.interdis'} ||= 20;
+
+ $r->print(&folderlist($folder,$msgstatus));
+ if ($folder eq 'critical') {
&discrit($r);
} else {
- &disfolder($r,$folder);
+ &disfolder($r,$folder,$msgstatus);
}
}
# ============================================================ Display a folder
sub disfolder {
- my ($r,$folder)=@_;
+ my ($r,$folder,$msgstatus)=@_;
+ my %statushash = &get_msgstatus_types();
my %blocked = ();
my %setters = ();
my $numblocked = 0;
my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
+ my %lt = &Apache::lonlocal::texthash(
+ sede => 'Select a destination folder to which the messages will be moved.',
+ nome => 'No messages have been selected to apply ths action to.',
+ chec => 'Check the checkbox for at least one message.',
+ );
+ my $jscript = &Apache::loncommon::check_uncheck_jscript();
$r->print(<
- function checkall() {
- for (i=0; i 0) {
+ for (var i=0; i
ENDDISHEADER
+
my $fsqs='&folder='.$folder;
- my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
+ my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);
my $totalnumber=$#temp+1;
- unless ($totalnumber>0) {
- $r->print('
'.&mt('Empty Folder').'
');
+ if ($totalnumber < 1) {
+ if ($msgstatus eq '') {
+ $r->print('
'.&mt('You have not replied to any messages in this folder.').'
');
+ } else {
+ $r->print('
'.&mt('There are no '.lc($statushash{$msgstatus}).' messages in this folder.').'
');
+ }
+ if ($numblocked > 0) {
+ $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
+ \%setters));
+ }
return;
}
- unless ($interdis) {
- $interdis=20;
- }
+ my $interdis = $env{'form.interdis'};
my $number=int($totalnumber/$interdis);
+ if ($totalnumber%$interdis == 0) {
+ $number--;
+ }
+
if (($startdis<0) || ($startdis>$number)) { $startdis=$number; }
my $firstdis=$interdis*$startdis;
if ($firstdis>$#temp) { $firstdis=$#temp-$interdis+1; }
my $lastdis=$firstdis+$interdis-1;
if ($lastdis>$#temp) { $lastdis=$#temp; }
- $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));
+ $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber,$msgstatus));
$r->print('');
+ $r->print('');
if ($numblocked > 0) {
- my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
- my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
- $r->print('
'.
- &mt('[_1,quant,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));
- $r->print(&Apache::loncommon::build_block_table($startblock,$endblock,
- \%setters));
+ $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
+ \%setters));
}
}
+sub blocked_in_folder {
+ my ($numblocked,$startblock,$endblock,$setters) = @_;
+ my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
+ my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
+ my $output = '
'.
+ &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock);
+ $output .= &Apache::loncommon::build_block_table($startblock,$endblock,
+ $setters);
+ return $output;
+}
+
# ============================================================== Compose output
sub compout {
- my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_;
+ my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode,
+ $multiforward)=@_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
my ($cdom,$cnum,$group,$refarg);
if (exists($env{'form.group'})) {
@@ -1137,6 +1199,20 @@ sub compout {
} elsif ($replycrit) {
$r->print('
'.&mt('Replying to a Critical Message').'
');
$replying=$replycrit;
+ } elsif ($multiforward) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/email?folder=".&escape($folder),
+ text=>"Display All Messages"});
+ &printheader($r,'/adm/email?compose=multiforward',
+ 'Forwarding Multiple Messages');
+ if ($multiforward > 1) {
+ $r->print(&mt('Each of the [quant,_1,message] you checked'
+ .' will be forwarded to the recipient(s) you select below.',$multiforward)
+ .' ');
+ } else {
+ $r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').' ');
+ }
+
} else {
&printheader($r,'/adm/email?compose=upload',
'Distribute from Uploaded File');
@@ -1146,14 +1222,30 @@ sub compout {
my $dissub='';
my $dismsg='';
my $disbase='';
+ my $attachrow;
my $func=&mt('Send New');
- my %lt=&Apache::lonlocal::texthash('us' => 'Username',
- 'do' => 'Domain',
- 'ad' => 'Additional Recipients',
- 'sb' => 'Subject',
- 'ca' => 'Cancel',
- 'ma' => 'Mail');
-
+ my %lt=&Apache::lonlocal::texthash('us' => 'Username',
+ 'do' => 'Domain',
+ 'ad' => 'Additional Recipients',
+ 'rt' => 'Reply to',
+ 'ar' => 'Allow replies',
+ 'sb' => 'Subject',
+ 'ca' => 'Cancel',
+ 'ma' => 'Mail',
+ 'msg' => 'Messages',
+ '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',
+ );
+ my %attachmax = (
+ text => '(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'})) {
@@ -1167,7 +1259,19 @@ sub compout {
&mt('Send copy to permanent email address (if known)').''.
'';
- }
+ }
+ if ($broadcast ne 'group') {
+ if (&Apache::lonnet::allowed('dff',$env{'request.course.id'}) ||
+ &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+
+ $dispcrit.='';
+ }
+ }
+
my %message;
my %content;
my $defdom=$env{'user.domain'};
@@ -1200,12 +1304,18 @@ sub compout {
if ($content{'baseurl'}) {
$disbase='';
if ($env{'user.adv'}) {
- $disbase.='
-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') {
@@ -1327,19 +1511,60 @@ sub recipient_input_row {
&Apache::loncommon::selectstudent_link('compemail','recuname',
'recdomain');
my $output = <<"ENDREC";
-
$lt{'us'}:
$selectlink
-
$lt{'do'}:
-
$domform
+
$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";
+
';
+ return $output;
+}
+
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;
}
@@ -1365,10 +1590,10 @@ sub disfacetoface {
my ($r,$user,$domain)=@_;
my $target=$env{'form.grade_target'};
unless ($env{'request.course.id'}) { return; }
- if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
- $r->print('Not allowed');
+ $r->print(&mt('Not allowed'));
return;
}
my %records=&Apache::lonnet::dump('nohist_email',
@@ -1395,7 +1620,20 @@ sub disfacetoface {
''.&mt('Subject').': '.$content{'subject'}.' '.
$content{'message'};
}
- }
+ }
+ } elsif ($content{'subject'}=~/^Archive/) {
+ $result.='
'.&mt('Archived Message').'
';
+ if (defined($content{'coursemsgid'})) {
+ my $crsmsgid = &escape($content{'coursemsgid'});
+ my $archive_message = &general_message($crsmsgid);
+ $content{'message'} = ''.&mt('Subject').': '.$content{'message'}.' '.$archive_message;
+ } else {
+ %content=&Apache::lonmsg::unpackagemsg($content{'message'});
+ $content{'message'} =
+ ''.&mt('Subject').': '.$content{'subject'}.' '.&mt('Critical Message').'';
if (defined($content{'coursemsgid'})) {
@@ -1447,10 +1685,10 @@ sub general_message {
sub facetoface {
my ($r,$stage)=@_;
- if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
- && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ if (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
'/'.$env{'request.course.sec'})) {
- $r->print('Not allowed');
+ $r->print(&mt('Not allowed'));
return;
}
my $crstype = &Apache::loncommon::course_type();
@@ -1458,7 +1696,7 @@ sub facetoface {
: 'faculty and staff';
&printheader($r,
'/adm/email?recordftf=query',
- "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
+ "User Notes, Face-to-Face, Critical Messages, Broadcast Messages, Archived Messages");
# from query string
if ($env{'form.recname'}) { $env{'form.recuname'}=$env{'form.recname'}; }
@@ -1473,7 +1711,7 @@ sub facetoface {
('stdselect','recuname','recdomain');
my %lt=&Apache::lonlocal::texthash('user' => 'Username',
'dom' => 'Domain',
- 'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in $crstype",
+ 'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, Broadcast Messages and Archived Messages in $crstype",
'subm' => 'Retrieve discussion and message records',
'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
'post' => 'Post this Record');
@@ -1537,7 +1775,8 @@ sub examblock {
'cbds' => 'Communication blocking during scheduled exams',
'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.",
'mecb' => 'Modify existing communication blocking periods',
- 'ncbc' => 'No communication blocks currently stored'
+ 'ncbc' => 'No communication blocks currently saved',
+ 'stor' => 'Save',
);
my %ltext = &Apache::lonlocal::texthash(
@@ -1576,7 +1815,7 @@ sub examblock {
$r->print(<<"END");
-
+
$end_page
END
@@ -1587,10 +1826,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 = ();
@@ -1647,13 +1882,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 {
@@ -1823,7 +2058,7 @@ sub blocktype_text {
# ----------------------------------------------------------- Display a message
sub displaymessage {
- my ($r,$msgid,$folder)=@_;
+ my ($r,$msgid,$folder,$msgstatus)=@_;
my $suffix=&Apache::lonmsg::foldersuffix($folder);
my %blocked = ();
my %setters = ();
@@ -1832,17 +2067,18 @@ sub displaymessage {
# info to generate "next" and "previous" buttons and check if message is blocked
my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
- my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
+ my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);
if ( $blocked{$msgid} eq 'ON' ) {
&printheader($r,'/adm/email',&mt('Display a Message'));
$r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));
&build_block_table($r,$startblock,$endblock,\%setters);
return;
}
- &statuschange($msgid,'read',$folder);
+ if ($msgstatus eq '') {
+ &statuschange($msgid,'read',$folder);
+ }
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
my %content=&Apache::lonmsg::unpackagemsg($message{$msgid});
-
my $counter=0;
$r->print('
');
my $escmsgid=&escape($msgid);
@@ -1853,22 +2089,39 @@ sub displaymessage {
$counter++;
}
$r->print('
');
+
+ my $see_anonymous;
+ my $from_student = 0;
+ if ($env{'request.course.id'} eq $content{'courseid'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $username = $content{'sendername'}.':'.$content{'senderdomain'};
+ my %classlist_entry =
+ &Apache::lonnet::get('classlist',[$username],$cdom,$cnum);
+ if (exists($classlist_entry{$username})) {
+ $from_student = 1;
+ $see_anonymous = &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
+ }
+ }
+
+
my $number_of_messages = scalar(@messages); #subtract 1 for last index
# start output
&printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
# Functions
- $r->print('
'.
+ &mt('Could not forward [quant,_1,message].',$count).
+ ' ');
+ foreach my $key (keys(%forwardfail)) {
+ $r->print(&mt('Could not deliver forwarded message.').' '.
+ &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').