'. - &mt('Send another group email').''.' '. + &mt('Send another group message').''.' '. ''. &mt('Return to group page').''; return $output; @@ -737,13 +829,23 @@ sub discrit { .'
' - .''); + $r->print(''); if ($numblocked > 0) { $r->print(&blocked_in_folder($numblocked,$startblock,$endblock, - \%setters)); + $by_ip,$clientip,$blockdom,\%setters)); } } sub blocked_in_folder { - my ($numblocked,$startblock,$endblock,$setters) = @_; - my $beginblock = &Apache::lonlocal::locallocaltime($startblock); - my $finishblock = &Apache::lonlocal::locallocaltime($endblock); - my $output = '
'. + my ($numblocked,$startblock,$endblock,$by_ip,$clientip,$blockdom,$setters) = @_; + my $output; + if ($by_ip) { + $output = '
'. + &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages is blocked for your current IP address: [_2].',$numblocked,$clientip).'
'. + &mt('Note: communication is being blocked for certain IP address(es).'); + } else { + my $beginblock = &Apache::lonlocal::locallocaltime($startblock); + my $finishblock = &Apache::lonlocal::locallocaltime($endblock); + $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); + } + #$output .= &Apache::loncommon::build_block_table($startblock,$endblock, + # $setters); + my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com",$clientip); + $output .="
".$blocktext; + return $output; } @@ -1186,6 +1349,26 @@ sub blocked_in_folder { sub compout { my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode, $multiforward)=@_; + my $clientip = &Apache::lonnet::get_requestor_ip($r); + my %setters; + my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) = + &Apache::loncommon::blockcheck(\%setters,'com',$clientip); + if ($by_ip) { + my $showdom = &Apache::lonnet::domain($blockdom); + if ($showdom eq '') { + $showdom = $blockdom; + } + $r->print(&Apache::loncommon::start_page('Messages')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Send and display messages')); + $r->print('
'. + &mt('Sending of LON-CAPA messages is blocked for your current IP address: [_1].',$clientip).'
'. + '- '. + &mt('Note: communication is being blocked for certain IP address(es).'). + '
- '. + &mt('This restriction was set by an administrator in the [_1] LON-CAPA domain.',$showdom). + '
'); } else { $r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').'
'); @@ -1239,7 +1423,11 @@ sub compout { my $dismsg=''; my $disbase=''; my $attachrow; - my $func=&mt('Send New'); + 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', @@ -1247,56 +1435,130 @@ sub compout { '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', + 'to' => 'To:', + 'msgb' => 'Message body', ); my %attachmax = ( - text => '(128 KB max size)', - num => 131072, + text => &mt('(1 MB max size)'), + num => 1048576, ); if (!$forwarding && !$multiforward) { - $attachrow = '
'.$lt{'atta'}.' '.$attachmax{'text'}.': '; + $attachrow = '
' . $crithelp . - '
'. - '' . $crithelp . - '
'. -''; + ''.$crithelp.' '.&mt('Require return receipt?').''. + '
'. +'
'; } 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.=''; + $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('
'.&mt('This message was designated by the sender not to allow replies.').' |
'.&mt('[_1]Send reply[_2] to other recipients','','').': '.$replyall.' | '.$tolist.' |
'.$replyall.'
'.&mt('[_1]Cc[_2] to other copied recipients','','').': '.$replyall.' | '.$cclist.' |
'.&mt('[_1]Cc[_2] to other copied group members','','').': '.$replyall.' | '.$groupcclist.' |
- '. - &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.").'
'. -$latexHelp. -&mt("Any new text to display before the text of the original messages:").'
-
'); +
'."\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,$func.' '.$lt{'msg'}, + $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'msg'}), \%lt)); } elsif ($broadcast ne 'upload') { $subj_size = '50'; @@ -1451,19 +1755,20 @@ $latexHelp. $r->print(&reply_to_row(\%lt)); } $r->print(&msg_subject_row($dissub,\%lt,$subj_size)); + my $labeltext = &HTML::Entities::encode($lt{'msgb'}); $r->print(<<"ENDCOMP"); - |
+$latexHelp
+
+$sendmode $dispcrit $disbase ENDCOMP - $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'ma'}, - \%lt)); + $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'ma'}), + \%lt,$hasfloat,$group)); $r->print($citation); if (exists($env{'form.ref'})) { $r->print('
$lt{'gen'}
-Subject:
+
$lt{'gmt'}:
-
+
$lt{'tff'}: ENDBLOCK @@ -1495,7 +1800,7 @@ ENDBLOCK '
-'.&mt('The messages will be assembled from all lines with the respective'."\n".'username:domain, and appended to the general message text.'));
+'.&mt('The messages will be assembled from all lines with the respective [_1][_2]username:domain[_3], and appended to the general message text.','
@@ -1504,22 +1809,30 @@ $dispcrit
','',''));
$r->print(<
($exmpl) -
-$bcc
+|; + if ($is_crsform) { + $output .= ''."\n"; + if ($group ne '') { + $output .= ''."\n"; + } + } + $output .= qq| +
+ + + | $prevbutton |
'.&mt('Record').'
'; } elsif ($content{'subject'}=~/^Broadcast/) { @@ -1646,8 +1986,7 @@ sub disfacetoface { } else { %content=&Apache::lonmsg::unpackagemsg($content{'message'}); $content{'message'} = - ''.&mt('Subject').': '.$content{'subject'}.''.&mt('Subject').': '.$content{'subject'}.'
'. $content{'message'}; } } else { @@ -1668,20 +2007,22 @@ sub disfacetoface { &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. $content{'sendername'}.':'. $content{'senderdomain'}.') '.$content{'time'}. - '
'. + ''. &Apache::lontexconvert::msgtexconverted($content{'message'}). ''; } # Check to see if there were any messages. if ($result eq '') { - my $lctype = lc(&Apache::loncommon::course_type()); + 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 [_1].',$lctype)."
"); + $r->print("".&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.')."
"); } else { - $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\'); + $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.').'}\\\\'); } + } elsif ($target eq 'tex') { + $r->print(&Apache::lonxml::xmlparse($r,$target,$result)); } else { - $r->print($result); + $r->print(''.$result.''); } } @@ -1708,8 +2049,8 @@ sub facetoface { return; } my $crstype = &Apache::loncommon::course_type(); - my $leaders = ($crstype eq 'Group') ? 'coordinators and leaders' - : 'faculty and staff'; + 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, Archived Messages"); @@ -1731,21 +2072,24 @@ sub facetoface { 'subm' => 'Retrieve discussion and message records', 'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')', 'post' => 'Post this Record'); - $r->print(<<"ENDTREC"); -$lt{'head'}
-
$lt{'user'}: | - | -$stdbrws - | -
$lt{'dom'}: | -$domform |
'.$lt{'head'}.'
' + .'' + .'' + .'
'.&Apache::loncommon::plainname($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(<'.$lt{'cbds'}.'
'); - - if ($action eq 'store') { - &blockstore($r); - } - - $r->print($lt{'desc'}.'-
'.$lt{'mecb'}.'
'); - my %records = (); - my $blockcount = 0; - my $parmcount = 0; - &get_blockdates(\%records,\$blockcount); - if ($blockcount > 0) { - $parmcount = &display_blocker_status($r,\%records,\%ltext); - } else { - $r->print($lt{'ncbc'}.''); - } - &display_addblocker_table($r,$parmcount,\%ltext); - my $end_page=&Apache::loncommon::end_page(); - $r->print(<<"END"); -
- - -
'.$lt{'head'}.'
'); - foreach my $envkey (keys(%env)) { - if ($envkey =~ m/^form\.modify_(\d+)$/) { - $adds{$1} = $1; - $removals{$1} = $1; - $modtotal ++; - } elsif ($envkey =~ m/^form\.cancel_(\d+)$/) { - $cancels{$1} = $1; - unless ( defined($removals{$1}) ) { - $removals{$1} = $1; - $canceltotal ++; - } - } elsif ($envkey =~ m/^form\.add_(\d+)$/) { - $adds{$1} = $1; - $addtotal ++; - } - } - - 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 my $key (keys(%adds)) { - unless ( defined($cancels{$key}) ) { - my ($newstart,$newend) = &get_dates_from_form($key); - my $newkey = $newstart.'____'.$newend; - 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) { - &Apache::lonnet::put('comm_block',\%blocking, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'} - ); - } - my $chgestotal = $canceltotal + $modtotal + $addtotal; - if ($chgestotal > 0) { - $r->print($lt{'tfcm'}.'- ');
- if ($canceltotal > 0) {
- $r->print('
- '.&mt('[quant,_1,communication blocking period was,communication blocking periods were] removed.',$canceltotal).' '); - } - if ($modtotal > 0) { - $r->print('
- '.&mt('[quant,_1,communication blocking period was,communication blocking periods were] modified.',$modtotal).' '); - } - if ($addtotal > 0) { - $r->print('
- '.&mt('[quant,_1,communication blocking period was,communication blocking periods were] added.',$addtotal).' '); - } - $r->print('
'); - return; -} - -sub get_dates_from_form { - my $item = shift; - my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate_'.$item); - my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate_'.$item); - return ($startdate,$enddate); -} - -sub get_blockdates { - my ($records,$blockcount) = @_; - $$blockcount = 0; - %{$records} = &Apache::lonnet::dump('comm_block', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'} - ); - $$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 %lt = &Apache::lonlocal::texthash( - 'modi' => 'Modify', - 'canc' => 'Cancel', - ); - my ($typeorder,$types) = &blocktype_text(); - $r->print(&Apache::loncommon::start_data_table()); - $r->print(<<"END"); -
$ltext->{'endd'}: $endform
'); - } - $r->print(<<"END"); -
-
-END - return $parmcount; -} - -sub display_addblocker_table { - my ($r,$parmcount,$ltext) = @_; - my $start = time; - my $end = $start + (60 * 60 * 2); #Default is an exam of 2 hours duration. - my $onchange = 'onFocus="javascript:window.document.forms['. - "'blockform'].elements['add_".$parmcount."'].". - '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 %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'}
-END - $r->print(&Apache::loncommon::start_data_table()); - $r->print(<<"END"); -$ltext->{'endd'}: $endform
'); - } - $r->print(<<"END"); -
".$blocktext); return; } if ($msgstatus eq '') { @@ -2096,7 +2154,6 @@ sub displaymessage { my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); my %content=&Apache::lonmsg::unpackagemsg($message{$msgid}); my $counter=0; - $r->print('
'); my $escmsgid=&escape($msgid); foreach (@messages) { if ($_->[5] eq $escmsgid){ @@ -2104,7 +2161,6 @@ sub displaymessage { } $counter++; } - $r->print(''); my $see_anonymous; my $from_student = 0; @@ -2122,82 +2178,162 @@ sub displaymessage { my $number_of_messages = scalar(@messages); #subtract 1 for last index + my $head_extra; + +# if student's view of resource will be included +# get tag(s) for css file(s) in use, and pass to &header to include +# in call to loncommon::start_page() + + if (($env{'request.course.id'} eq $content{'courseid'}) && + (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) { + my $symb; + if (defined($content{'symb'})) { + $symb = $content{'symb'}; + } elsif (defined($content{'baseurl'})) { + $symb=&Apache::lonnet::symbread($content{'baseurl'}); + } + if ($symb) { + $head_extra = &Apache::loncommon::css_links($symb); + } + } + # 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('Functions').': | '); + &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','', + $content{'baseurl'},$head_extra); + +# Prepare available functions + my @functionlist; if (!$content{'noreplies'}) { - $r->print(''.&mt('Reply').' | '); - } - $r->print(''.&mt('Forward').' | '. - ''.&mt('Mark Unread').' | '. - ''.&mt('Delete').' | '. - ''.&mt('Back to Folder Display').' | '); + push(@functionlist,'' + .&mt('Reply') + .''); + } + push(@functionlist,'' + .&mt('Forward') + .''); + push(@functionlist,'' + .&mt('Mark Unread') + .''); + push(@functionlist,'' + .&mt('Delete') + .''); + +# Prepare available navigation + my @navigationlist; if ($counter > 0){ - $r->print(''.&mt('Previous').' | '); + push(@navigationlist,'' + .&mt('Previous') + .''); } if ($counter < $number_of_messages - 1){ - $r->print(''.&mt('Next').' | '); - } - $r->print('
' - .&mt('Currently available actions (will open extra window):') - .' | ' - .$actionlist - .'
'.&mt('To').': '.$tolist); + # 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('
'.&mt('Reply To').': '. - $replytoname.' '.&mt('at').' '.$replytodom); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Reply To')) + .$replytoname.':'.$replytodom + .&Apache::lonhtmlcommon::row_closure() + ); } } } else { - $r->print('
'.&mt('From').': '. - &Apache::loncommon::aboutmewrapper( - &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), - $content{'sendername'},$content{'senderdomain'})); + # 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').')'); + $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('
'.&mt('Reply To').': '. - $replytoname.' '.&mt('at').' '.$replytodom); + $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'}.' '.&mt('at').' '. - $content{'senderdomain'}.') '); + $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('
'.&mt('Cc').': '.$cclist); + 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() + ); + } + } + } + } + } } - if ($content{'courseid'}) { - $r->print('
'.&mt($crstype).': '.$courseinfo{'description'}); - if ($content{'coursesec'}) { - $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')'); + + # 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('
'.&mt('Time').': '.$content{'time'}); + $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'}) { @@ -2264,14 +2503,21 @@ sub displaymessage { $showsymb,$env{'user.domain'},$env{'user.name'}); if ($symb) { if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) { - $showsymb = &Apache::lonenc::check_encrypt($symb); + unless ($showsymb =~ m{^/enc/}) { + $showsymb = &Apache::lonenc::encrypted($showsymb); + } } $symblink = '?symb='.$showsymb; } if ($encrypturl =~ /^yes$/i && !$env{'request.role.adv'}) { - $showurl = $baseurl; + unless ($showurl =~ m{^/enc/}) { + $showurl = &Apache::lonenc::encrypted($showurl); + } } - $r->print('
'.&mt('Refers to').': '.$restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); $refers_to = 1; } } @@ -2284,58 +2530,168 @@ sub displaymessage { $content{'courseid'}); if ($unencurl ne '') { if (&Apache::lonnet::allowed('bre',$unencurl)) { - $r->print('
'.&mt('Refers to'). - ': '. - $restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); } } } } } else { if (&Apache::lonnet::allowed('bre',$baseurl)) { - $r->print('
'.&mt('Refers to'). - ': '.$restitle.''); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Refers to')) + .''.$restitle.'' + .&Apache::lonhtmlcommon::row_closure() + ); + } } } } - $r->print('
'. - &Apache::lontexconvert::msgtexconverted($content{'message'},1). - '
'.&displayresource(%content).''); + + # 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_cc_recips { - my ($context,%content) = @_; - my %reciphash = - &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}], - $content{'senderdomain'},$content{'sendername'}); - my $recipinfo = $reciphash{$content{'recipid'}}; - my @ccs; - if (ref($recipinfo) eq 'HASH') { - if (ref($recipinfo->{'cc'}) eq 'HASH') { - foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) { - my ($ccname,$ccdom) = split(/:/,$cc); - if (!(($ccname eq $env{'user.name'}) && - ($ccdom eq $env{'user.domain'}))) { - my $showcc =''; - if ($context eq 'replying') { - $showcc = '
'.&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 .= ''.&mt('Current transactions for student (if applicable)').'
'. + &Apache::loncommon::get_previous_attempt($symb, + $content{'sendername'}, + $content{'senderdomain'}, + $content{'courseid'}); + } # Have a symb, can render return ''.&mt('Current attempts of student (if applicable)').'
'. &Apache::loncommon::get_previous_attempt($symb, @@ -2381,26 +2745,31 @@ sub displayresource { # ================================================================== The Header sub header { - my ($r,$title,$baseurl)=@_; - + my ($r,$title,$baseurl,$head_extra)=@_; my $extra = &Apache::loncommon::studentbrowser_javascript(); if ($baseurl) { $extra .= "'.&mt('Attachment not included - exceeded permitted length').'
'.&mt('Attachment not included - exceeded permitted length').'
'.$toaddr{$address}; + $msgtxt.="\n".'
'."\n".$toaddr{$address}; } my @thismsg; if ($msgtype eq 'critical') { @@ -2606,7 +3107,8 @@ sub sendoffmail { $env{'form.sendbck'}, $env{'form.permanent'}, \$sentmessage{$address}, - $nosentstore,$recipid); + $nosentstore,$recipid, + $attachmenturl,\%permresults); } else { $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': '); @thismsg= @@ -2617,32 +3119,51 @@ sub sendoffmail { $env{'form.permanent'}, \$sentmessage{$address}, undef,undef,undef, - $nosentstore,$recipid); + $nosentstore,$recipid, + \%permresults); } $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg); if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) { $numsent++; push(@recusers,$recuname); push(@recudoms,$recdomain); + if ($1 eq 'ok') { + $r->print('ok '); + } + if ($permresults{$recuname.':'.$recdomain}) { + $r->print(' (email) '); + } } $sendstatus.=' '.join(' ',@thismsg); } my $subj_prefix; if ($numsent > 0) { if (($env{'request.course.id'}) && - (($env{'form.sendmode'} eq 'group') || + (($mode eq 'group') || ($env{'form.courserecord'}) || - ($msgtype eq 'critical'))) { + ($msgtype eq 'critical')) || + ($env{'form.replyid'} && + (($content{'courseid'} ne '') && + ($mode eq 'group')))) { if ($msgtype eq 'critical') { $subj_prefix = 'Critical.'; - } elsif ($env{'form.sendmode'} eq 'group') { + } elsif ($mode eq 'group') { $subj_prefix = 'Broadcast.'; } else { $subj_prefix = 'Archive'; } my ($specialmsgid,$specialresult); - my $course_str = &escape('['.$cnum.':'.$cdom.']'); - + 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, @@ -2667,11 +3188,11 @@ sub sendoffmail { undef,$specialmsgid,undef,undef,undef,1); } } - if (($env{'form.sendmode'} ne 'upload') && (@recusers > 0)) { + 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); + \@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'); @@ -2683,13 +3204,15 @@ sub sendoffmail { &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix, $numsent,$stamp,$env{'user.name'}, $env{'user.domain'},$msgcount,$context, - $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl); + $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl, + '','','','',$recipid); } } - if (!$env{'form.multiforward'}) { + if (!$env{'form.multiforward'}) { if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { - $r->print('
'.&mt('Completed.'). - ''); + my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Completed.')); + $message = &Apache::loncommon::confirmwrapper($message); + $r->print($message); if ($env{'form.displayedcrit'}) { &discrit($r); } @@ -2699,10 +3222,32 @@ sub sendoffmail { &Apache::loncommunicate::menu($r); } } else { - $r->print('
'.&mt('Could not deliver message').' '. - &mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus).'
'); + 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); + } + } + if (keys(%disallowed)) { + if ((ref($disallowed{'to'}) eq 'HASH') && (keys(%{$disallowed{'to'}}) > 0)) { + $r->print(&mt("The following recipients were excluded because the user's domain does not accept messages from server's domain:").'
- '. + join("
- \n",sort(keys(%{$disallowed{'to'}}))). + '
- '. + join("
- \n",sort(keys(%{$disallowed{'cc'}}))). + '
- '. + join("
- \n",sort(keys(%{$disallowed{'bcc'}}))). + '
'); + } + if (ref($disallowed{'cc'}) eq 'HASH') { + $r->print(&mt("The following CCs were excluded because the user's domain does not accept messages from server's domain:").'
'); + } + if (ref($disallowed{'bcc'}) eq 'HASH') { + $r->print(&mt("The following BCCs were excluded because the user's domain does not accept messages from server's domain:").'
'); } } + } else { + &printheader($r,'','Messages cancelled.'); + return 'cancelled'; } return $sendstatus; } @@ -2723,22 +3268,35 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', - 'recordftf','sortedby','block','folder','startdis','interdis', + 'recordftf','sortedby','folder','startdis','interdis', 'showcommentbaseurl','dismode','group','subject','text','ref', - 'msgstatus']); - $sqs='&sortedby='.$env{'form.sortedby'}; + 'msgstatus','btoken']); + $sqs='&sortedby='.$env{'form.sortedby'}; -# ------------------------------------------------------ They checked for email - unless ($env{'form.block'}) { - &Apache::lonnet::put('email_status',{'recnewemail'=>0}); +# ----------- Check if access was from balancer to server with existing session + + if ($env{'form.btoken'}) { + my %info = &Apache::lonnet::tmpget($env{'form.btoken'}); + &Apache::lonnet::tmpdel($env{'form.btoken'}); + delete($env{'form.btoken'}); + unless ($env{'form.display'}) { + if (($info{'display'}) && ($info{'mailrecip'})) { + if (&unescape($info{'mailrecip'}) eq $env{'user.name'}.':'.$env{'user.domain'}) { + $env{'form.display'} = &unescape($info{'display'}); + } + } + } } +# ------------------------------------------------------ They checked for email + &Apache::lonnet::put('email_status',{'recnewemail'=>0}); + # ----------------------------------------------------------------- Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/communicate", - text=>"Communication/Messages", + text=>"Messages", faq=>12,bug=>'Communication Tools',}); # ------------------------------------------------------------------ Get Folder @@ -2747,7 +3305,7 @@ sub handler { unless ($folder) { $folder=''; } else { - $sqs.='&folder='.&escape($folder); + $sqs.='&folder='.&escape($folder); } # ------------------------------------------------------------ Get Display Mode @@ -2779,7 +3337,7 @@ sub handler { $startdis++; } my $postedstartdis=$startdis+1; - $sqs.='&startdis='.$postedstartdis; + $sqs.='&startdis='.$postedstartdis; # --------------------------------------------------------------- Render Output @@ -2819,9 +3377,10 @@ sub handler { my ($result,$msg) = &statuschange($env{'form.markdel'},'deleted',$folder); if (!$result) { - $r->print('
'. - &mt('Failed to delete the message.').'
'. - ''.$msg."
\n"); + 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),$msgstatus); @@ -2843,7 +3402,10 @@ sub handler { $total ++; } &printheader($r,'','Marked Messages Read'); - $r->print(&mt('Marked [_1] message(s) read',$total).''); + 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') { @@ -2854,7 +3416,10 @@ sub handler { $total ++; } &printheader($r,'','Marked Messages Unread'); - $r->print(&mt('Marked [_1] message(s) unread',$total).'
'); + 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') { @@ -2863,7 +3428,7 @@ sub handler { &printheader($r,'','Moved Messages'); if (!defined($gotfolders{$destfolder})) { $r->print(&mt('Destination folder [_1] is not a valid folder', - $destfolder)); + ''.$destfolder.'')); } else { my ($total,$failed,@failed_msg)=(0,0); my @to_move = &Apache::loncommon::get_env_multiple('form.delmark'); @@ -2877,15 +3442,17 @@ sub handler { push(@failed_msg,$msg); } } - if ($failed) { - $r->print('
- '.&mt('Failed to move [_1] message(s)',$failed). - '
'); - $r->print(''. - join("
\n",@failed_msg). - "
\n"); - } - $r->print(&mt('Moved [_1] message(s)',$total).''); + 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),$msgstatus); @@ -2903,15 +3470,17 @@ sub handler { } } &printheader($r,'','Deleted Messages'); + my $message = ''; if ($failed) { - $r->print('
- '.&mt('Failed to delete [_1] message(s)',$failed). - '
'); - $r->print(''. - join("
\n",@failed_msg). - "
\n"); - } - $r->print(&mt('Deleted [_1] message(s)',$total).''); + $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),$msgstatus);
} elsif ($env{'form.markunread'}) {
@@ -2923,8 +3492,6 @@ sub handler {
&compout($r,'','',$env{'form.compose'});
} elsif ($env{'form.recordftf'}) {
&facetoface($r,$env{'form.recordftf'});
- } elsif ($env{'form.block'}) {
- &examblock($r,$env{'form.block'});
} elsif ($env{'form.sendmail'}) {
if ($env{'form.multiforward'}) {
&printheader($r,'','Messages being sent.');
@@ -2967,19 +3534,23 @@ sub handler {
}
if (keys(%forwardok) > 0) {
my $count = keys(%forwardok);
- $r->print('
'.
- &mt('[quant,_1,message] forwarded.',$count).
- '');
+ 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);
- $r->print('
'.
- &mt('Could not forward [quant,_1,message].',$count).
- ' ');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);
foreach my $key (keys(%forwardfail)) {
- $r->print(&mt('Could not deliver forwarded message.').' '.
- &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').
');
+ $message .= '
'.&mt('Could not deliver forwarded message.').' ';
+ if ($forwardfail{$key} eq 'blocked') {
+ $message .= &mt('Sending messages is blocked from your IP address');
+ } else {
+ $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 {
@@ -3003,10 +3574,13 @@ sub handler {
my $showfolder = $env{'form.newfolder'};
my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});
if ($makeresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" created.',$showfolder).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" created.',$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
} else {
- $r->print(&mt('Creation failed.').' '.$makeresult.'
'.
- $warning);
+ 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);
@@ -3018,10 +3592,14 @@ sub handler {
my $showfolder = '';
my $delresult = &deletefolder($folder);
if ($delresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" deleted.',$folder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
$env{'form.folder'} = '';
} else {
- $r->print(&mt('Deletion failed.').' '.$delresult.'
');
+ 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);
@@ -3031,9 +3609,13 @@ sub handler {
my $showfolder = $env{'form.renamed'};
my $renresult = &renamefolder($folder);
if ($renresult eq 'ok') {
- $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).'
');
+ my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" renamed to "[_2]".',$folder,$showfolder));
+ $message = &Apache::loncommon::confirmwrapper($message);
+ $r->print($message);
} else {
- $r->print(&mt('Renaming failed.').' '.$renresult.'
');
+ 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);
@@ -3043,7 +3625,7 @@ sub handler {
&Apache::loncommunicate::menu($r);
&disall($r,($folder?$folder:$dismode),$msgstatus);
}
- $r->print(&Apache::loncommon::end_page());
+ $r->print('