version 1.79, 2004/01/15 15:12:31
|
version 1.106, 2004/09/10 06:38:24
|
Line 74 email program, so they have full access
|
Line 74 email program, so they have full access
|
interface, or other features they may wish to use in response to the |
interface, or other features they may wish to use in response to the |
student's query. |
student's query. |
|
|
|
=item * B<Blocking>: LON-CAPA can block display of e-mails that are |
|
sent to a student 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, |
|
display of all e-mail sent during the blocking period will be |
|
suppressed, and a message of explanation, including details of the |
|
currently active blocking periods will be displayed instead. A user |
|
who has a course coordinator or instructor role in a course will be |
|
unaffected by any blocking periods for the course, unless the user |
|
also has a student role in the course, AND has selected the student role. |
|
|
=back |
=back |
|
|
Users can ask LON-CAPA to forward messages to conventional e-mail |
Users can ask LON-CAPA to forward messages to conventional e-mail |
Line 101 use Apache::lontexconvert();
|
Line 113 use Apache::lontexconvert();
|
use HTML::Entities(); |
use HTML::Entities(); |
use Mail::Send; |
use Mail::Send; |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::loncommunicate; |
|
|
# Querystring component with sorting type |
# Querystring component with sorting type |
my $sqs; |
my $sqs; |
Line 109 my $sqs;
|
Line 122 my $sqs;
|
|
|
sub packagemsg { |
sub packagemsg { |
my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_; |
my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_; |
$message =&HTML::Entities::encode($message); |
$message =&HTML::Entities::encode($message,'<>&"'); |
$citation=&HTML::Entities::encode($citation); |
$citation=&HTML::Entities::encode($citation,'<>&"'); |
$subject =&HTML::Entities::encode($subject); |
$subject =&HTML::Entities::encode($subject,'<>&"'); |
#remove machine specification |
#remove machine specification |
$baseurl =~ s|^http://[^/]+/|/|; |
$baseurl =~ s|^http://[^/]+/|/|; |
$baseurl =&HTML::Entities::encode($baseurl); |
$baseurl =&HTML::Entities::encode($baseurl,'<>&"'); |
#remove machine specification |
#remove machine specification |
$attachmenturl =~ s|^http://[^/]+/|/|; |
$attachmenturl =~ s|^http://[^/]+/|/|; |
$attachmenturl =&HTML::Entities::encode($attachmenturl); |
$attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); |
|
|
my $now=time; |
my $now=time; |
$msgcount++; |
$msgcount++; |
Line 139 sub packagemsg {
|
Line 152 sub packagemsg {
|
'<browsermathml>'.$ENV{'browser.mathml'}.'</browsermathml>'. |
'<browsermathml>'.$ENV{'browser.mathml'}.'</browsermathml>'. |
'<browserraw>'.$ENV{'HTTP_USER_AGENT'}.'</browserraw>'. |
'<browserraw>'.$ENV{'HTTP_USER_AGENT'}.'</browserraw>'. |
'<courseid>'.$ENV{'request.course.id'}.'</courseid>'. |
'<courseid>'.$ENV{'request.course.id'}.'</courseid>'. |
|
'<coursesec>'.$ENV{'request.course.sec'}.'</coursesec>'. |
'<role>'.$ENV{'request.role'}.'</role>'. |
'<role>'.$ENV{'request.role'}.'</role>'. |
'<resource>'.$ENV{'request.filename'}.'</resource>'. |
'<resource>'.$ENV{'request.filename'}.'</resource>'. |
'<msgid>'.$msgid.'</msgid>'. |
'<msgid>'.$msgid.'</msgid>'. |
Line 170 sub unpackagemsg {
|
Line 184 sub unpackagemsg {
|
} |
} |
} |
} |
if ($content{'attachmenturl'}) { |
if ($content{'attachmenturl'}) { |
my ($fname,$ft)=($content{'attachmenturl'}=~/\/(\w+)\.(\w+)$/); |
my ($fname)=($content{'attachmenturl'}=~m|/([^/]+)$|); |
if ($notoken) { |
if ($notoken) { |
$content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'.'.$ft.'</tt>'; |
$content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'</tt>'; |
} else { |
} else { |
$content{'message'}.='<p>'.&mt('Attachment').': <a href="'. |
&Apache::lonnet::allowuploaded('/adm/msg', |
&Apache::lonnet::tokenwrapper($content{'attachmenturl'}). |
$content{'attachmenturl'}); |
'"><tt>'.$fname.'.'.$ft.'</tt></a>'; |
$content{'message'}.='<p>'.&mt('Attachment'). |
|
': <a href="'.$content{'attachmenturl'}.'"><tt>'. |
|
$fname.'</tt></a>'; |
} |
} |
} |
} |
return %content; |
return %content; |
Line 185 sub unpackagemsg {
|
Line 201 sub unpackagemsg {
|
# ======================================================= Get info out of msgid |
# ======================================================= Get info out of msgid |
|
|
sub unpackmsgid { |
sub unpackmsgid { |
my $msgid=&Apache::lonnet::unescape(shift); |
my ($msgid,$folder)=@_; |
|
$msgid=&Apache::lonnet::unescape($msgid); |
|
my $suffix=&foldersuffix($folder); |
my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/, |
my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/, |
&Apache::lonnet::unescape($msgid)); |
&Apache::lonnet::unescape($msgid)); |
my %status=&Apache::lonnet::get('email_status',[$msgid]); |
my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]); |
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } |
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } |
unless ($status{$msgid}) { $status{$msgid}='new'; } |
unless ($status{$msgid}) { $status{$msgid}='new'; } |
return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid}); |
return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid}); |
Line 203 sub sendemail {
|
Line 221 sub sendemail {
|
my $msg = new Mail::Send; |
my $msg = new Mail::Send; |
$msg->to($to); |
$msg->to($to); |
$msg->subject('[LON-CAPA] '.$subject); |
$msg->subject('[LON-CAPA] '.$subject); |
if (my $fh = $msg->open('smtp',Server => 'localhost')) { |
my %oldENV=%ENV; |
|
undef(%ENV); |
|
if (my $fh = $msg->open()) { |
print $fh $body; |
print $fh $body; |
$fh->close; |
$fh->close; |
} |
} |
|
%ENV=%oldENV; |
|
undef(%oldENV); |
} |
} |
|
|
# ==================================================== Send notification emails |
# ==================================================== Send notification emails |
Line 274 sub author_res_msg {
|
Line 296 sub author_res_msg {
|
sub retrieve_author_res_msg { |
sub retrieve_author_res_msg { |
my $url=shift; |
my $url=shift; |
$url=&Apache::lonnet::declutter($url); |
$url=&Apache::lonnet::declutter($url); |
my ($domain,$author,$file)=($url=~/^(\w+)\/(\w+)\/(.+)$/); |
my ($domain,$author)=($url=~/^(\w+)\/(\w+)\//); |
my $listall=($file eq 'allbombs'); |
|
my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); |
my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author); |
my $msgs=''; |
my $msgs=''; |
foreach (keys %errormsgs) { |
foreach (keys %errormsgs) { |
if (($_=~/^\Q$url\E\_\d+$/) || ($listall)) { |
if ($_=~/^\Q$url\E\_\d+$/) { |
my ($errurl)=($_=~/^(.+)\_(\d+)$/); |
|
my %content=&unpackagemsg($errormsgs{$_}); |
my %content=&unpackagemsg($errormsgs{$_}); |
$msgs.='<p><img src="/adm/lonMisc/bomb.gif" /><b>'. |
$msgs.='<p><img src="/adm/lonMisc/bomb.gif" /><b>'. |
($listall?"<a href='".&Apache::lonnet::clutter($errurl)."'><tt>". |
|
$errurl. |
|
'</tt></a> ':' '). |
|
$content{'time'}.'</b>: '.$content{'message'}. |
$content{'time'}.'</b>: '.$content{'message'}. |
'<br /></p>'; |
'<br /></p>'; |
} |
} |
Line 401 sub user_crit_received {
|
Line 418 sub user_crit_received {
|
my %contents=&unpackagemsg($message{$msgid},1); |
my %contents=&unpackagemsg($message{$msgid},1); |
my $status='rec: '.($contents{'sendback'}? |
my $status='rec: '.($contents{'sendback'}? |
&user_normal_msg($contents{'sendername'},$contents{'senderdomain'}, |
&user_normal_msg($contents{'sendername'},$contents{'senderdomain'}, |
&mt('Receipt').': '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}, |
&mt('Receipt').': '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.', '.$contents{'subject'}, |
&mt('User').' '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}. |
&mt('User').' '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}. |
' acknowledged receipt of message'."\n".' "'. |
' acknowledged receipt of message'."\n".' "'. |
$contents{'subject'}.'"'."\n".&mt('dated').' '. |
$contents{'subject'}.'"'."\n".&mt('dated').' '. |
Line 483 sub user_normal_msg {
|
Line 500 sub user_normal_msg {
|
} |
} |
|
|
|
|
|
# ============================================================ List all folders |
|
|
|
sub folderlist { |
|
my $folder=shift; |
|
my @allfolders=&Apache::lonnet::getkeys('email_folders'); |
|
if ($allfolders[0]=~/^error:/) { @allfolders=(); } |
|
return '<form method="post" action="/adm/email">'. |
|
'<input type="submit" value="'.&mt('View Folder').'" />'. |
|
&Apache::loncommon::select_form($folder,'folder', |
|
('' => &mt('INBOX'),'trash' => &mt('TRASH'), |
|
'sent' => &mt('Sent Messages'), |
|
map { $_ => $_ } @allfolders)). |
|
'<a href="/adm/email?critical=display">'. |
|
&mt('View Critical Messages').'</a>'. |
|
'</form>'; |
|
} |
|
# =============================================================== Folder suffix |
|
|
|
sub foldersuffix { |
|
my $folder=shift; |
|
unless ($folder) { return ''; } |
|
return '_'.&Apache::lonnet::escape($folder); |
|
} |
|
|
# =============================================================== Status Change |
# =============================================================== Status Change |
|
|
sub statuschange { |
sub statuschange { |
my ($msgid,$newstatus)=@_; |
my ($msgid,$newstatus,$folder)=@_; |
my %status=&Apache::lonnet::get('email_status',[$msgid]); |
my $suffix=&foldersuffix($folder); |
|
my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]); |
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } |
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } |
unless ($status{$msgid}) { $status{$msgid}='new'; } |
unless ($status{$msgid}) { $status{$msgid}='new'; } |
unless (($status{$msgid} eq 'replied') || |
unless (($status{$msgid} eq 'replied') || |
($status{$msgid} eq 'forwarded')) { |
($status{$msgid} eq 'forwarded')) { |
&Apache::lonnet::put('email_status',{$msgid => $newstatus}); |
&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus}); |
} |
} |
if (($newstatus eq 'deleted') || ($newstatus eq 'new')) { |
if (($newstatus eq 'deleted') || ($newstatus eq 'new')) { |
&Apache::lonnet::put('email_status',{$msgid => $newstatus}); |
&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus}); |
} |
} |
} |
} |
|
|
|
# ============================================================= Make new folder |
|
|
|
sub makefolder { |
|
my ($newfolder)=@_; |
|
&Apache::lonnet::put('email_folders',{$newfolder => time}); |
|
} |
|
|
|
# ======================================================== Move between folders |
|
|
|
sub movemsg { |
|
my ($msgid,$srcfolder,$trgfolder)=@_; |
|
my $srcsuffix=&foldersuffix($srcfolder); |
|
my $trgsuffix=&foldersuffix($trgfolder); |
|
my $srcstatus=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]); |
|
my $trgstatus=$srcstatus; |
|
if ($trgstatus eq 'deleted') { $trgstatus='read'; } |
|
&Apache::lonnet::put( |
|
'nohist_email'.$trgsuffix,{$msgid => |
|
&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid])}); |
|
&statuschange($msgid,$trgstatus,$trgfolder); |
|
&Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]); |
|
&Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]); |
|
} |
|
|
# ======================================================= Display a course list |
# ======================================================= Display a course list |
|
|
sub discourse { |
sub discourse { |
Line 512 sub discourse {
|
Line 578 sub discourse {
|
'cfs' => 'Check for Section/Group', |
'cfs' => 'Check for Section/Group', |
'cfn' => 'Check for None'); |
'cfn' => 'Check for None'); |
$r->print(<<ENDDISHEADER); |
$r->print(<<ENDDISHEADER); |
<input type=hidden name=sendmode value=group> |
<input type="hidden" name="sendmode" value="group" /> |
<script> |
<script> |
function checkall() { |
function checkall() { |
for (i=0; i<document.forms.compemail.elements.length; i++) { |
for (i=0; i<document.forms.compemail.elements.length; i++) { |
Line 542 sub discourse {
|
Line 608 sub discourse {
|
} |
} |
} |
} |
</script> |
</script> |
<input type=button onClick="checkall()" value="$lt{'cfa'}"> |
<input type="button" onClick="checkall()" value="$lt{'cfa'}" /> |
<input type=button onClick="checksec()" value="$lt{'cfs'}"> |
<input type="button" onClick="checksec()" value="$lt{'cfs'}" /> |
<input type=text size=5 name=chksec> |
<input type="text" size="5" name=chksec /> |
<input type=button onClick="uncheckall()" value="$lt{'cfn'}"> |
<input type="button" onClick="uncheckall()" value="$lt{'cfn'}" /> |
<p> |
<p> |
ENDDISHEADER |
ENDDISHEADER |
my %coursepersonnel= |
my %coursepersonnel= |
Line 596 sub discrit {
|
Line 662 sub discrit {
|
my %content=&unpackagemsg($what{$_}); |
my %content=&unpackagemsg($what{$_}); |
next if ($content{'senderdomain'} eq ''); |
next if ($content{'senderdomain'} eq ''); |
$content{'message'}=~s/\n/\<br\>/g; |
$content{'message'}=~s/\n/\<br\>/g; |
$result.='<hr>'.&mt('From').': <b>'. |
$result.='<hr />'.&mt('From').': <b>'. |
&Apache::loncommon::aboutmewrapper( |
&Apache::loncommon::aboutmewrapper( |
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('. |
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('. |
$content{'sendername'}.'@'. |
$content{'sendername'}.'@'. |
$content{'senderdomain'}.') '.$content{'time'}. |
$content{'senderdomain'}.') '.$content{'time'}. |
'<br>'.&mt('Subject').': '.$content{'subject'}. |
'<br />'.&mt('Subject').': '.$content{'subject'}. |
'<br><blockquote>'. |
'<br /><blockquote>'. |
&Apache::lontexconvert::msgtexconverted($content{'message'}). |
&Apache::lontexconvert::msgtexconverted($content{'message'}). |
'</blockquote>'. |
'</blockquote><small>'. |
|
&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox'). |
|
'</small><br />'. |
'<input type=submit name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'">'. |
'<input type=submit name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'">'. |
'<input type=submit name="reprec_'.$_.'" '. |
'<input type=submit name="reprec_'.$_.'" '. |
'value="'.&mt('Confirm Receipt and Reply').'">'; |
'value="'.&mt('Confirm Receipt and Reply').'">'; |
Line 612 $content{'sendername'}.'@'.
|
Line 680 $content{'sendername'}.'@'.
|
# Check to see if there were any messages. |
# Check to see if there were any messages. |
if ($result eq '') { |
if ($result eq '') { |
$result = "<h2>".&mt('You have no critical messages.')."</h2>". |
$result = "<h2>".&mt('You have no critical messages.')."</h2>". |
'<a href="/adm/roles">'.&mt('Select a course').'</a>'; |
'<a href="/adm/roles">'.&mt('Select a course').'</a><br />'. |
|
'<a href="/adm/email">'.&mt('Communicate').'</a>'; |
} else { |
} else { |
$r->print($header); |
$r->print($header); |
} |
} |
$r->print($result); |
$r->print($result); |
$r->print('<input type=hidden name="displayedcrit" value="true"></form>'); |
$r->print('<input type=hidden name="displayedcrit" value="true" /></form>'); |
} |
|
|
|
# =============================================================== Compose reply |
|
|
|
sub comprep { |
|
my ($r,$msgid)=@_; |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
my %content=&unpackagemsg($message{$msgid},1); |
|
my $quotemsg='> '.$content{'message'}; |
|
$quotemsg=~s/\r/\n/g; |
|
$quotemsg=~s/\f/\n/g; |
|
$quotemsg=~s/\n+/\n\> /g; |
|
my $torepl=&Apache::loncommon::aboutmewrapper( |
|
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. |
|
$content{'sendername'}.'@'. |
|
$content{'senderdomain'}.')'; |
|
my $subject=&mt('Re').': '.$content{'subject'}; |
|
my $dispcrit=''; |
|
if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
|
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); |
|
$dispcrit= |
|
'<input type=checkbox name=critmsg> '.&mt('Send as critical message').' ' . $crithelp . |
|
'<br>'. |
|
'<input type=checkbox name=sendbck> '.&mt('Send as critical message').' ' . |
|
&mt('and return receipt') . $crithelp . '<p>'; |
|
} |
|
my %lt=&Apache::lonlocal::texthash( |
|
'to' => 'To', |
|
'sb' => 'Subject', |
|
'sr' => 'Send Reply', |
|
'ca' => 'Cancel' |
|
); |
|
$r->print(<<"ENDREPLY"); |
|
<form action="/adm/email" method="post"> |
|
<input type="hidden" name="sendreply" value="$msgid"> |
|
$lt{'to'}: $torepl<br /> |
|
$lt{'sb'}: <input type="text" size=50 name="subject" value="$subject"><p> |
|
<textarea name="message" cols="84" rows="10" wrap="hard"> |
|
$quotemsg |
|
</textarea></p><br /> |
|
$dispcrit |
|
<input type="submit" name="send" value="$lt{'sr'}" /> |
|
<input type="submit" name="cancel" value="$lt{'ca'}"/ > |
|
</form> |
|
ENDREPLY |
|
} |
} |
|
|
sub sortedmessages { |
sub sortedmessages { |
my @messages = &Apache::lonnet::getkeys('nohist_email'); |
my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_; |
|
my $suffix=&foldersuffix($folder); |
|
my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix); |
#unpack the varibles and repack into temp for sorting |
#unpack the varibles and repack into temp for sorting |
my @temp; |
my @temp; |
foreach (@messages) { |
foreach (@messages) { |
Line 675 sub sortedmessages {
|
Line 701 sub sortedmessages {
|
&Apache::lonmsg::unpackmsgid($msgid); |
&Apache::lonmsg::unpackmsgid($msgid); |
my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status, |
my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status, |
$msgid); |
$msgid); |
push @temp ,\@temp1; |
# Check whether message was sent during blocking period. |
|
if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) { |
|
my $escid = &Apache::lonnet::unescape($msgid); |
|
$$blocked{$escid} = 'ON'; |
|
$$numblocked ++; |
|
} else { |
|
push @temp ,\@temp1; |
|
} |
} |
} |
#default sort |
#default sort |
@temp = sort {$a->[0] <=> $b->[0]} @temp; |
@temp = sort {$a->[0] <=> $b->[0]} @temp; |
Line 715 sub sortedmessages {
|
Line 748 sub sortedmessages {
|
# ======================================================== Display all messages |
# ======================================================== Display all messages |
|
|
sub disall { |
sub disall { |
my $r=shift; |
my ($r,$folder)=@_; |
$r->print(<<ENDDISHEADER); |
my %blocked = (); |
|
my %setters = (); |
|
my $startblock; |
|
my $endblock; |
|
my $numblocked = 0; |
|
&blockcheck(\%setters,\$startblock,\$endblock); |
|
$r->print(<<ENDDISHEADER); |
<script> |
<script> |
function checkall() { |
function checkall() { |
for (i=0; i<document.forms.disall.elements.length; i++) { |
for (i=0; i<document.forms.disall.elements.length; i++) { |
Line 737 sub disall {
|
Line 776 sub disall {
|
} |
} |
</script> |
</script> |
ENDDISHEADER |
ENDDISHEADER |
$r->print('<h1>'.&mt('Display All Messages').'</h1><form method=post name=disall '. |
$r->print('<h2>'.&mt('Display All Messages').'</h2>'. |
'action="/adm/email">'. |
&folderlist($folder). |
'<table border=2><tr><th colspan=2> </th><th>'); |
'<form method="post" name="disall" action="/adm/email">'. |
|
'<table border=2><tr><th colspan="3"> </th><th>'); |
if ($ENV{'form.sortedby'} eq "revdate") { |
if ($ENV{'form.sortedby'} eq "revdate") { |
$r->print('<a href = "?sortedby=date">'.&mt('Date').'</a></th>'); |
$r->print('<a href = "?sortedby=date">'.&mt('Date').'</a></th>'); |
} else { |
} else { |
Line 770 ENDDISHEADER
|
Line 810 ENDDISHEADER
|
$r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>'); |
$r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>'); |
} |
} |
$r->print('</tr>'); |
$r->print('</tr>'); |
my @temp=sortedmessages(); |
my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder); |
foreach (@temp){ |
foreach (@temp){ |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_; |
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_; |
if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) { |
if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) { |
Line 783 ENDDISHEADER
|
Line 823 ENDDISHEADER
|
} else { |
} else { |
$r->print('<tr bgcolor="#99BBBB">'); |
$r->print('<tr bgcolor="#99BBBB">'); |
} |
} |
$r->print('<td><a href="/adm/email?display='.$origID.$sqs. |
$r->print('<td></a><input type=checkbox name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. |
'">'.&mt('Open').'</a></td><td><a href="/adm/email?markdel='.$origID.$sqs. |
'">'.&mt('Open').'</a></td><td>'. |
'">'.&mt('Delete').'</a><input type=checkbox name="delmark_'.$origID.'"></td>'. |
($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs. |
|
'">'.&mt('Delete'):' ').'</td>'. |
'<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'. |
'<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'. |
$fromname.'</td><td>'.$fromdomain.'</td><td>'. |
$fromname.'</td><td>'.$fromdomain.'</td><td>'. |
&Apache::lonnet::unescape($shortsubj).'</td><td>'. |
&Apache::lonnet::unescape($shortsubj).'</td><td>'. |
$status.'</td></tr>'); |
$status.'</td></tr>'); |
|
} elsif ($status eq 'deleted') { |
|
# purge |
|
&movemsg($origID,$folder,'trash'); |
} |
} |
} |
} |
$r->print('</table><p>'. |
$r->print('</table><p>'. |
'<a href="javascript:checkall()">'.&mt('Check All').'</a> '. |
'<a href="javascript:checkall()">'.&mt('Check All').'</a> '. |
'<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a><p>'. |
'<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a></p>'. |
'<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'. |
'<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'); |
'<input type=submit name="markeddel" value="'.&mt('Delete Checked').'">'. |
if ($folder ne 'trash') { |
'</form></body></html>'); |
$r->print( |
|
'<p><input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" /></p>'); |
|
} |
|
$r->print('<p><input type="submit" name="markedmove" value="'.&mt('Move Checked to Folder').'" />'); |
|
my @allfolders=&Apache::lonnet::getkeys('email_folders'); |
|
if ($allfolders[0]=~/^error:/) { @allfolders=(); } |
|
$r->print( |
|
&Apache::loncommon::select_form('','movetofolder', |
|
( map { $_ => $_ } @allfolders)) |
|
); |
|
$r->print('<input type="hidden" name="folder" value="'.$folder.'" /></form>'); |
|
if ($numblocked > 0) { |
|
my $beginblock = &Apache::lonlocal::locallocaltime($startblock); |
|
my $finishblock = &Apache::lonlocal::locallocaltime($endblock); |
|
$r->print('<br /><br />'. |
|
$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); |
|
} |
} |
} |
|
|
# ============================================================== Compose output |
# ============================================================== Compose output |
|
|
sub compout { |
sub compout { |
my ($r,$forwarding,$broadcast)=@_; |
my ($r,$forwarding,$replying,$broadcast,$replycrit)=@_; |
my $dispcrit=''; |
|
|
if ($broadcast eq 'individual') { |
|
&printheader($r,'/adm/email?compose=individual', |
|
'Send a Message'); |
|
} elsif ($broadcast) { |
|
&printheader($r,'/adm/email?compose=group', |
|
'Broadcast Message'); |
|
} elsif ($forwarding) { |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/email?display=".&Apache::lonnet::escape($forwarding), |
|
text=>"Display Message"}); |
|
&printheader($r,'/adm/email?forward='.&Apache::lonnet::escape($forwarding), |
|
'Forwarding a Message'); |
|
} elsif ($replying) { |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/email?display=".&Apache::lonnet::escape($replying), |
|
text=>"Display Message"}); |
|
&printheader($r,'/adm/email?replyto='.&Apache::lonnet::escape($replying), |
|
'Replying to a Message'); |
|
} elsif ($replycrit) { |
|
$r->print('<h3>'.&mt('Replying to a Critical Message').'</h3>'); |
|
$replying=$replycrit; |
|
} else { |
|
&printheader($r,'/adm/email?compose=upload', |
|
'Distribute from Uploaded File'); |
|
} |
|
|
|
my $dispcrit=''; |
my $dissub=''; |
my $dissub=''; |
my $dismsg=''; |
my $dismsg=''; |
my $func=&mt('Send New'); |
my $func=&mt('Send New'); |
Line 818 sub compout {
|
Line 906 sub compout {
|
if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); |
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); |
$dispcrit= |
$dispcrit= |
'<input type="checkbox" name="critmsg"> '.&mt('Send as critical message').' ' . $crithelp . |
'<input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').' ' . $crithelp . |
'<br>'. |
'<br>'. |
'<input type="checkbox" name="sendbck"> '.&mt('Send as critical message').' ' . |
'<input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').' ' . |
&mt('and return receipt') . $crithelp . '<p>'; |
&mt('and return receipt') . $crithelp . '<p>'; |
} |
} |
|
my %message; |
|
my %content; |
|
my $defdom=$ENV{'user.domain'}; |
if ($forwarding) { |
if ($forwarding) { |
$dispcrit.='<input type="hidden" name="forwid" value="'. |
%message=&Apache::lonnet::get('nohist_email',[$forwarding]); |
$forwarding.'">'; |
%content=&unpackagemsg($message{$forwarding}); |
$func=&mt('Forward'); |
$dispcrit.='<input type="hidden" name="forwid" value="'. |
my %message=&Apache::lonnet::get('nohist_email',[$forwarding]); |
$forwarding.'" />'; |
my %content=&unpackagemsg($message{$forwarding}); |
$func=&mt('Forward'); |
|
|
$dissub=&mt('Forwarding').': '.$content{'subject'}; |
$dissub=&mt('Forwarding').': '.$content{'subject'}; |
$dismsg=&mt('Forwarded message from').' '. |
$dismsg=&mt('Forwarded message from').' '. |
$content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'}; |
$content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'}; |
|
} |
|
if ($replying) { |
|
%message=&Apache::lonnet::get('nohist_email',[$replying]); |
|
%content=&unpackagemsg($message{$replying}); |
|
$dispcrit.='<input type="hidden" name="replyid" value="'. |
|
$replying.'" />'; |
|
$func=&mt('Replying to'); |
|
|
|
$dissub=&mt('Reply').': '.$content{'subject'}; |
|
$dismsg='> '.$content{'message'}; |
|
$dismsg=~s/\r/\n/g; |
|
$dismsg=~s/\f/\n/g; |
|
$dismsg=~s/\n+/\n\> /g; |
} |
} |
my $defdom=$ENV{'user.domain'}; |
|
if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; } |
if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; } |
$r->print( |
$r->print( |
'<form action="/adm/email" name="compemail" method="post"'. |
'<form action="/adm/email" name="compemail" method="post"'. |
' enctype="multipart/form-data">'."\n". |
' enctype="multipart/form-data">'."\n". |
'<input type="hidden" name="sendmail" value="on">'."\n". |
'<input type="hidden" name="sendmail" value="on" />'."\n". |
'<table>'); |
'<table>'); |
unless (($broadcast eq 'group') || ($broadcast eq 'upload')) { |
unless (($broadcast eq 'group') || ($broadcast eq 'upload')) { |
my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); |
if ($replying) { |
my $selectlink=&Apache::loncommon::selectstudent_link |
$r->print('<tr><td colspan="2">'.&mt('Replying to').' '. |
|
&Apache::loncommon::aboutmewrapper( |
|
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. |
|
$content{'sendername'}.'@'. |
|
$content{'senderdomain'}.')'. |
|
'<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'. |
|
'<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'. |
|
'</td></tr>'); |
|
} else { |
|
my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); |
|
my $selectlink=&Apache::loncommon::selectstudent_link |
('compemail','recuname','recdomain'); |
('compemail','recuname','recdomain'); |
$r->print(<<"ENDREC"); |
$r->print(<<"ENDREC"); |
<table> |
|
<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recname'}"></td><td rowspan="2">$selectlink</td></tr> |
<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recname'}"></td><td rowspan="2">$selectlink</td></tr> |
<tr><td>$lt{'do'}:</td> |
<tr><td>$lt{'do'}:</td> |
<td>$domform</td></tr> |
<td>$domform</td></tr> |
ENDREC |
ENDREC |
|
} |
} |
} |
my $latexHelp = Apache::loncommon::helpLatexCheatsheet(); |
my $latexHelp = Apache::loncommon::helpLatexCheatsheet(); |
if ($broadcast ne 'upload') { |
if ($broadcast ne 'upload') { |
$r->print(<<"ENDCOMP"); |
$r->print(<<"ENDCOMP"); |
<tr><td>$lt{'ad'}<br /><tt>username\@domain,username\@domain, ... |
<tr><td>$lt{'ad'}<br /><tt>username\@domain,username\@domain, ... |
</tt></td><td> |
</tt></td><td> |
<input type="text" size="50" name="additionalrec"></td></tr> |
<input type="text" size="50" name="additionalrec" /></td></tr> |
<tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub"> |
<tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub" /> |
</td></tr></table> |
</td></tr></table> |
$latexHelp |
$latexHelp |
<textarea name="message" cols="80" rows="10" wrap="hard">$dismsg |
<textarea name="message" cols="80" rows="15" wrap="hard">$dismsg |
</textarea></p><br /> |
</textarea></p><br /> |
$dispcrit |
$dispcrit |
<input type="submit" name="send" value="$func $lt{'ma'}" /> |
<input type="submit" name="send" value="$func $lt{'ma'}" /> |
Line 869 $dispcrit
|
Line 982 $dispcrit
|
ENDCOMP |
ENDCOMP |
} else { # $broadcast is 'upload' |
} else { # $broadcast is 'upload' |
$r->print(<<ENDUPLOAD); |
$r->print(<<ENDUPLOAD); |
<input type=hidden name=sendmode value=upload> |
<input type="hidden" name="sendmode" value="upload" /> |
|
<input type="hidden" name="send" value="on" /> |
<h3>Generate messages from a file</h3> |
<h3>Generate messages from a file</h3> |
<p> |
<p> |
Subject: <input type=text size=50 name=subject> |
Subject: <input type="text" size="50" name="subject" /> |
</p> |
</p> |
<p>General message text<br /> |
<p>General message text<br /> |
<textarea name=message cols=60 rows=10 wrap=hard>$dismsg |
<textarea name="message" cols="60" rows="10" wrap="hard">$dismsg |
</textarea></p> |
</textarea></p> |
<p> |
<p> |
The file format for the uploaded portion of the message is: |
The file format for the uploaded portion of the message is: |
Line 889 username3\@domain1: text
|
Line 1003 username3\@domain1: text
|
The messages will be assembled from all lines with the respective |
The messages will be assembled from all lines with the respective |
<tt>username\@domain</tt>, and appended to the general message text.</p> |
<tt>username\@domain</tt>, and appended to the general message text.</p> |
<p> |
<p> |
<input type=file name=upfile size=20><p> |
<input type="file" name="upfile" size="40" /></p><p> |
$dispcrit |
$dispcrit |
<input type=submit value="Upload and send"> |
<input type="submit" value="Upload and Send" /></p> |
ENDUPLOAD |
ENDUPLOAD |
} |
} |
if ($broadcast eq 'group') { |
if ($broadcast eq 'group') { |
Line 902 ENDUPLOAD
|
Line 1016 ENDUPLOAD
|
|
|
# ---------------------------------------------------- Display all face to face |
# ---------------------------------------------------- Display all face to face |
|
|
|
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'})) { |
|
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=&unpackagemsg($records{$_}); |
|
next if ($content{'senderdomain'} eq ''); |
|
next if ($content{'subject'} !~ /^Record/); |
|
# $content{'message'}=~s/\n/\<br\>/g; |
|
$result.='Recorded by '. |
|
$content{'sendername'}.'@'.$content{'senderdomain'}."\n"; |
|
$result.= |
|
&Apache::lontexconvert::msgtexconverted($content{'message'})."\n"; |
|
} |
|
return $result; |
|
} |
|
|
sub disfacetoface { |
sub disfacetoface { |
my ($r,$user,$domain)=@_; |
my ($r,$user,$domain)=@_; |
|
my $target=$ENV{'form.grade_target'}; |
unless ($ENV{'request.course.id'}) { return; } |
unless ($ENV{'request.course.id'}) { return; } |
unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
return; |
return; |
Line 919 sub disfacetoface {
|
Line 1059 sub disfacetoface {
|
$content{'message'}=~s/\n/\<br\>/g; |
$content{'message'}=~s/\n/\<br\>/g; |
if ($content{'subject'}=~/^Record/) { |
if ($content{'subject'}=~/^Record/) { |
$result.='<h3>'.&mt('Record').'</h3>'; |
$result.='<h3>'.&mt('Record').'</h3>'; |
|
} elsif ($content{'subject'}=~/^Broadcast/) { |
|
$result .='<h3>'.&mt('Broadcast Message').'</h3>'; |
} else { |
} else { |
$result.='<h3>'.&mt('Sent Message').'</h3>'; |
$result.='<h3>'.&mt('Critical Message').'</h3>'; |
%content=&unpackagemsg($content{'message'}); |
%content=&unpackagemsg($content{'message'}); |
$content{'message'}= |
$content{'message'}= |
'<b>Subject: '.$content{'subject'}.'</b><br />'. |
'<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br />'. |
$content{'message'}; |
$content{'message'}; |
} |
} |
$result.=&mt('By').': <b>'. |
$result.=&mt('By').': <b>'. |
Line 931 sub disfacetoface {
|
Line 1073 sub disfacetoface {
|
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('. |
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('. |
$content{'sendername'}.'@'. |
$content{'sendername'}.'@'. |
$content{'senderdomain'}.') '.$content{'time'}. |
$content{'senderdomain'}.') '.$content{'time'}. |
'<br><blockquote>'. |
'<br /><blockquote>'. |
&Apache::lontexconvert::msgtexconverted($content{'message'}). |
&Apache::lontexconvert::msgtexconverted($content{'message'}). |
'</blockquote>'; |
'</blockquote>'; |
} |
} |
# Check to see if there were any messages. |
# Check to see if there were any messages. |
if ($result eq '') { |
if ($result eq '') { |
$r->print("<p><b>No notes, face-to-face discussion records, or critical messages in this course.</b></p>"); |
if ($target ne 'tex') { |
|
$r->print("<p><b>".&mt("No notes, face-to-face discussion records, critical messages, or broadcast messages in this course.")."</b></p>"); |
|
} else { |
|
$r->print('\textbf{'.&mt("No notes, face-to-face discussion records, critical messages or broadcast messages in this course.").'}\\\\'); |
|
} |
} else { |
} else { |
$r->print($result); |
$r->print($result); |
} |
} |
Line 950 sub facetoface {
|
Line 1096 sub facetoface {
|
unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { |
return; |
return; |
} |
} |
|
&printheader($r, |
|
'/adm/email?recordftf=query', |
|
"User Notes, Face-to-Face, Critical Messages, Broadcast Messages"); |
# from query string |
# from query string |
|
|
if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; } |
if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; } |
if ($ENV{'form.recdom'}) { $ENV{'form.recdomain'}=$ENV{'form.recdom'}; } |
if ($ENV{'form.recdom'}) { $ENV{'form.recdomain'}=$ENV{'form.recdom'}; } |
|
|
Line 961 sub facetoface {
|
Line 1111 sub facetoface {
|
my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); |
my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); |
my $stdbrws = &Apache::loncommon::selectstudent_link |
my $stdbrws = &Apache::loncommon::selectstudent_link |
('stdselect','recuname','recdomain'); |
('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', |
|
'subm' => 'Retrieve discussion and message records', |
|
'newr' => 'New Record (record is visible to course faculty and staff)', |
|
'post' => 'Post this Record'); |
$r->print(<<"ENDTREC"); |
$r->print(<<"ENDTREC"); |
<h3>User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course</h3> |
<h3>$lt{'head'}</h3> |
<form method="post" action="/adm/email" name="stdselect"> |
<form method="post" action="/adm/email" name="stdselect"> |
<input type="hidden" name="recordftf" value="retrieve" /> |
<input type="hidden" name="recordftf" value="retrieve" /> |
<table> |
<table> |
<tr><td>Username:</td><td><input type=text size=12 name=recuname value="$ENV{'form.recuname'}"></td> |
<tr><td>$lt{'user'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recuname'}" /></td> |
<td rowspan="2"> |
<td rowspan="2"> |
$stdbrws |
$stdbrws |
<input type="submit" value="Retrieve discussion and message records"></td> |
<input type="submit" value="$lt{'subm'}" /></td> |
</tr> |
</tr> |
<tr><td>Domain:</td> |
<tr><td>$lt{'dom'}:</td> |
<td>$domform</td></tr> |
<td>$domform</td></tr> |
</table> |
</table> |
</form> |
</form> |
Line 983 ENDTREC
|
Line 1139 ENDTREC
|
&user_normal_msg_raw( |
&user_normal_msg_raw( |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
'Record ['.$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}.']', |
&mt('Record'). |
|
' ['.$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}.']', |
$ENV{'form.newrecord'}); |
$ENV{'form.newrecord'}); |
} |
} |
$r->print('<h3>'.&Apache::loncommon::plainname($ENV{'form.recuname'}, |
$r->print('<h3>'.&Apache::loncommon::plainname($ENV{'form.recuname'}, |
Line 995 ENDTREC
|
Line 1152 ENDTREC
|
<input name="recuname" value="$ENV{'form.recuname'}" type="hidden" /> |
<input name="recuname" value="$ENV{'form.recuname'}" type="hidden" /> |
ENDRHEAD |
ENDRHEAD |
$r->print(<<ENDBFORM); |
$r->print(<<ENDBFORM); |
<hr />New Record (record is visible to course faculty and staff)<br /> |
<hr />$lt{'newr'}<br /> |
<textarea name="newrecord" cols="80" rows="10" wrap="hard"></textarea> |
<textarea name="newrecord" cols="80" rows="10" wrap="hard"></textarea> |
<br /> |
<br /> |
<input type="hidden" name="recordftf" value="post" /> |
<input type="hidden" name="recordftf" value="post" /> |
<input type="submit" value="Post this record" /> |
<input type="submit" value="$lt{'post'}" /> |
</form> |
</form> |
ENDBFORM |
ENDBFORM |
} |
} |
} |
} |
|
|
|
# ----------------------------------------------------------- Blocking during exams |
|
|
|
sub examblock { |
|
my ($r,$action) = @_; |
|
unless ($ENV{'request.course.id'}) { return;} |
|
unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { $r->print('Not allowed'); } |
|
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.', |
|
'mecb' => 'Modify existing communication blocking periods', |
|
'ncbc' => 'No communication blocks currently stored' |
|
); |
|
|
|
my %ltext = &Apache::lonlocal::texthash( |
|
'dura' => 'Duration', |
|
'setb' => 'Set by', |
|
'even' => 'Event', |
|
'actn' => 'Action', |
|
'star' => 'Start', |
|
'endd' => 'End' |
|
); |
|
|
|
&printheader($r,'/adm/email?block=display',$lt{'comb'}); |
|
$r->print('<h3>'.$lt{'cbds'}.'</h3>'); |
|
|
|
if ($action eq 'store') { |
|
&blockstore($r); |
|
} |
|
|
|
$r->print($lt{'desc'}.'<br /><br /> |
|
<form name="blockform" method="post" action="/adm/email?block=store"> |
|
'); |
|
|
|
$r->print('<h4>'.$lt{'mecb'}.'</h4>'); |
|
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'}.'<br /><br />'); |
|
} |
|
&display_addblocker_table($r,$parmcount,\%ltext); |
|
$r->print(<<"END"); |
|
<br /> |
|
<input type="hidden" name="blocktotal" value="$blockcount" /> |
|
<input type ="submit" value="Save Changes" /> |
|
</form> |
|
</body> |
|
</html> |
|
END |
|
return; |
|
} |
|
|
|
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 = (); |
|
my %removals = (); |
|
my %cancels = (); |
|
my $modtotal = 0; |
|
my $canceltotal = 0; |
|
my $addtotal = 0; |
|
my %blocking = (); |
|
$r->print('<h3>'.$lt{'head'}.'</h3>'); |
|
foreach (keys %ENV) { |
|
if ($_ =~ m/^form\.modify_(\w+)$/) { |
|
$adds{$1} = $1; |
|
$removals{$1} = $1; |
|
$modtotal ++; |
|
} elsif ($_ =~ m/^form\.cancel_(\d+)$/) { |
|
$cancels{$1} = $1; |
|
unless ( defined($removals{$1}) ) { |
|
$removals{$1} = $1; |
|
$canceltotal ++; |
|
} |
|
} elsif ($_ =~ m/^form\.add_(\d+)$/) { |
|
$adds{$1} = $1; |
|
$addtotal ++; |
|
} |
|
} |
|
|
|
foreach (keys %removals) { |
|
my $hashkey = $ENV{'form.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($_); |
|
my $newkey = $newstart.'____'.$newend; |
|
$blocking{$newkey} = $ENV{'user.name'}.'@'.$ENV{'user.domain'}.':'.$ENV{'form.title_'.$_}; |
|
} |
|
} |
|
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'}.'<ul>'); |
|
if ($canceltotal > 0) { |
|
$r->print('<li>'.$canceltotal.' '.$lt{'cbps'},' '.$lt{'werm'}.'</li>'); |
|
} |
|
if ($modtotal > 0) { |
|
$r->print('<li>'.$modtotal.' '.$lt{'cbps'},' '.$lt{'wemo'}.'</li>'); |
|
} |
|
if ($addtotal > 0) { |
|
$r->print('<li>'.$addtotal.' '.$lt{'cbps'},' '.$lt{'wead'}.'</li>'); |
|
} |
|
$r->print('</ul>'); |
|
} else { |
|
$r->print($lt{'ncwm'}); |
|
} |
|
$r->print('<br />'); |
|
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}; |
|
|
|
foreach (keys %{$records}) { |
|
if ($_ eq 'error: 2 tie(GDBM) Failed while attempting dump') { |
|
$$blockcount = 0; |
|
last; |
|
} |
|
} |
|
} |
|
|
|
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', |
|
); |
|
$r->print(<<"END"); |
|
<table border="0" cellpadding="0" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table width="100%" border="0" cellpadding="1" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF"> |
|
<tr bgcolor="$color"> |
|
<td><b>$$ltext{'dura'}</b></td> |
|
<td><b>$$ltext{'setb'}</b></td> |
|
<td><b>$$ltext{'even'}</b></td> |
|
<td><b>$$ltext{'actn'}?</b></td> |
|
</tr> |
|
END |
|
foreach (sort keys %{$records}) { |
|
my $iter = $parmcount%2; |
|
my $onchange = 'onFocus="javascript:window.document.forms['. |
|
"'blockform'].elements['modify_".$parmcount."'].". |
|
'checked=true;"'; |
|
my ($start,$end) = split/____/,$_; |
|
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); |
|
$r->print(<<"END"); |
|
<tr bgcolor="$bgcols[$iter]"> |
|
<td>$$ltext{'star'}: $startform<br/>$$ltext{'endd'}: $endform</td> |
|
<td>$settername</td> |
|
<td><input type="text" name="title_$parmcount" size="15" value="$title"/><input type="hidden" name="key_$parmcount" value="$_"></td> |
|
<td>$lt{'modi'}? <input type="checkbox" name="modify_$parmcount"/><br />$lt{'canc'}? <input type="checkbox" name="cancel_$parmcount"/> |
|
</tr> |
|
END |
|
$parmcount ++; |
|
} |
|
$r->print(<<"END"); |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
<br /> |
|
<br /> |
|
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 $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' |
|
); |
|
$r->print(<<"END"); |
|
<h4>$lt{'addn'}</h4> |
|
<table border="0" cellpadding="0" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table width="100%" border="0" cellpadding="1" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF"> |
|
<tr bgcolor="#CCCCFF"> |
|
<td><b>$$ltext{'dura'}</b></td> |
|
<td><b>$$ltext{'even'} $lt{'exam'}</b></td> |
|
<td><b>$$ltext{'actn'}?</b></td> |
|
</tr> |
|
<tr bgcolor="#eeeeee"> |
|
<td>$$ltext{'star'}: $startform<br />$$ltext{'endd'}: $endform</td> |
|
<td><input type="text" name="title_$parmcount" size="15" value=""/></td> |
|
<td>$lt{'addb'}? <input type="checkbox" name="add_$parmcount" value="1"/></td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
</table> |
|
END |
|
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"); |
|
<br /<br />$lt{'cacb'}:<br /><br /> |
|
<table border="0" cellpadding="0" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table width="100%" border="0" cellpadding="1" cellspacing="0"> |
|
<tr> |
|
<td width="100%" bgcolor="#000000"> |
|
<table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF"> |
|
<tr bgcolor="$color"> |
|
<td><b>$lt{'cour'}</b></td> |
|
<td><b>$lt{'dura'}</b></td> |
|
<td><b>$lt{'blse'}</b></td> |
|
</tr> |
|
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('<tr><td>'.$courseinfo{'description'}.'</td>'. |
|
'<td>'.$openblock.' to '.$closeblock.'</td>'. |
|
'<td>'.$fullname.' ('.$uname.'@'.$udom. |
|
')</td></tr>'); |
|
} |
|
} |
|
$r->print('</table></td></tr></table></td></tr></table>'); |
|
} |
|
|
|
# ----------------------------------------------------------- Display a message |
|
|
|
sub displaymessage { |
|
my ($r,$msgid,$folder)=@_; |
|
my $suffix=&foldersuffix($folder); |
|
my %blocked = (); |
|
my %setters = (); |
|
my $startblock = 0; |
|
my $endblock = 0; |
|
my $numblocked = 0; |
|
# info to generate "next" and "previous" buttons and check if message is blocked |
|
&blockcheck(\%setters,\$startblock,\$endblock); |
|
my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked); |
|
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'); |
|
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); |
|
my %content=&unpackagemsg($message{$msgid}); |
|
my $counter=0; |
|
$r->print('<pre>'); |
|
my $escmsgid=&Apache::lonnet::escape($msgid); |
|
foreach (@messages) { |
|
if ($_->[5] eq $escmsgid){ |
|
last; |
|
} |
|
$counter++; |
|
} |
|
$r->print('</pre>'); |
|
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('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'. |
|
'<td><a href="/adm/email?replyto='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Reply').'</b></a></td>'. |
|
'<td><a href="/adm/email?forward='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Forward').'</b></a></td>'. |
|
'<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Mark Unread').'</b></a></td>'. |
|
'<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>Delete</b></a></td>'. |
|
'<td><a href="/adm/email?sortedby='.$ENV{'form.sortedby'}. |
|
'"><b>'.&mt('Display all Messages').'</b></a></td>'); |
|
if ($counter > 0){ |
|
$r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs. |
|
'"><b>'.&mt('Previous').'</b></a></td>'); |
|
} |
|
if ($counter < $number_of_messages - 1){ |
|
$r->print('<td><a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs. |
|
'"><b>'.&mt('Next').'</b></a></td>'); |
|
} |
|
$r->print('</tr></table>'); |
|
$r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}. |
|
'<br /><b>'.&mt('From').':</b> '. |
|
&Apache::loncommon::aboutmewrapper( |
|
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), |
|
$content{'sendername'},$content{'senderdomain'}).' ('. |
|
$content{'sendername'}.' at '. |
|
$content{'senderdomain'}.') '. |
|
($content{'courseid'}?'<br /><b>'.&mt('Course').':</b> '.$courseinfo{'description'}. |
|
($content{'coursesec'}?' ('.&mt('Group/Section').': '.$content{'coursesec'}.')':''):''). |
|
'<br /><b>'.&mt('Time').':</b> '.$content{'time'}. |
|
'<p><pre>'. |
|
&Apache::lontexconvert::msgtexconverted($content{'message'},1). |
|
'</pre><hr />'.$content{'citation'}.'</p>'); |
|
return; |
|
} |
|
|
|
# ================================================================== The Header |
|
|
|
sub header { |
|
my ($r,$title,$baseurl)=@_; |
|
$r->print('<html><head><title>Communication and Messages</title>'); |
|
if ($baseurl) { |
|
$r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />"); |
|
} |
|
$r->print(&Apache::loncommon::studentbrowser_javascript().'</head>'. |
|
&Apache::loncommon::bodytag('Communication and Messages')); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
|
(undef,($title?$title:'Communication and Messages'))); |
|
|
|
} |
|
|
|
# ---------------------------------------------------------------- Print header |
|
|
|
sub printheader { |
|
my ($r,$url,$desc,$title,$baseurl)=@_; |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>$url, |
|
text=>$desc}); |
|
&header($r,$title,$baseurl); |
|
} |
|
|
|
|
# ===================================================================== Handler |
# ===================================================================== Handler |
|
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
|
|
# ----------------------------------------------------------- Set document type |
# ----------------------------------------------------------- Set document type |
|
|
&Apache::loncommon::content_type($r,'text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
$r->send_http_header; |
$r->send_http_header; |
|
|
return OK if $r->header_only; |
return OK if $r->header_only; |
|
|
# --------------------------- Get query string for limited number of parameters |
# --------------------------- Get query string for limited number of parameters |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['display','replyto','forward','markread','markdel','markunread', |
['display','replyto','forward','markread','markdel','markunread', |
'sendreply','compose','sendmail','critical','recname','recdom', |
'sendreply','compose','sendmail','critical','recname','recdom', |
'recordftf','sortedby']); |
'recordftf','sortedby','block','folder']); |
$sqs='&sortedby='.$ENV{'form.sortedby'}; |
$sqs='&sortedby='.$ENV{'form.sortedby'}; |
# ------------------------------------------------------ They checked for email |
# ------------------------------------------------------ They checked for email |
&Apache::lonnet::put('email_status',{'recnewemail'=>0}); |
unless ($ENV{'form.block'}) { |
|
&Apache::lonnet::put('email_status',{'recnewemail'=>0}); |
|
} |
|
|
|
# ----------------------------------------------------------------- Breadcrumbs |
|
|
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/communicate", |
|
text=>"Communication/Messages", |
|
faq=>12,bug=>'Communication Tools',}); |
|
|
|
# ------------------------------------------------------------------ Get Folder |
|
|
|
my $folder=$ENV{'form.folder'}; |
|
unless ($folder) { |
|
$folder=''; |
|
} else { |
|
$sqs='&folder='.&Apache::lonnet::escape($folder); |
|
} |
|
|
# --------------------------------------------------------------- Render Output |
# --------------------------------------------------------------- Render Output |
if (!$ENV{'form.display'}) { |
|
$r->print('<html><head><title>EMail and Messaging</title>'. |
|
&Apache::loncommon::studentbrowser_javascript().'</head>'. |
|
&Apache::loncommon::bodytag('EMail and Messages'). |
|
&Apache::loncommon::help_open_faq(12). |
|
&Apache::loncommon::help_open_bug('Communication Tools')); |
|
} |
|
if ($ENV{'form.display'}) { |
|
my $msgid=$ENV{'form.display'}; |
|
&statuschange($msgid,'read'); |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
my %content=&unpackagemsg($message{$msgid}); |
|
# info to generate "next" and "previous" buttons |
|
my @messages=&sortedmessages(); |
|
my $counter=0; |
|
$r->print('<pre>'); |
|
my $escmsgid=&Apache::lonnet::escape($msgid); |
|
foreach (@messages) { |
|
if ($_->[5] eq $escmsgid){ |
|
last; |
|
} |
|
$counter++; |
|
} |
|
$r->print('</pre>'); |
|
my $number_of_messages = scalar(@messages); #subtract 1 for last index |
|
# start output |
|
$r->print('<html><head><title>EMail and Messaging</title>'); |
|
if (defined($content{'baseurl'})) { |
|
$r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$content{'baseurl'}\" />"); |
|
} |
|
$r->print(&Apache::loncommon::studentbrowser_javascript(). |
|
'</head>'. |
|
&Apache::loncommon::bodytag('EMail and Messages'). |
|
&Apache::loncommon::help_open_faq(12). |
|
&Apache::loncommon::help_open_bug('Communication Tools')); |
|
$r->print('<b>'.&mt('Subject').':</b> '.$content{'subject'}. |
|
'<br><b>'.&mt('From').':</b> '. |
|
&Apache::loncommon::aboutmewrapper( |
|
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), |
|
$content{'sendername'},$content{'senderdomain'}).' ('. |
|
$content{'sendername'}.' at '. |
|
$content{'senderdomain'}.') '. |
|
'<br><b>'.&mt('Time').':</b> '.$content{'time'}.'<p>'. |
|
'<table border=2><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'. |
|
'<td><a href="/adm/email?replyto='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Reply').'</b></a></td>'. |
|
'<td><a href="/adm/email?forward='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Forward').'</b></a></td>'. |
|
'<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>'.&mt('Mark Unread').'</b></a></td>'. |
|
'<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs. |
|
'"><b>Delete</b></a></td>'. |
|
'<td><a href="/adm/email?sortedby='.$ENV{'form.sortedby'}. |
|
'"><b>'.&mt('Display all Messages').'</b></a></td>'); |
|
if ($counter > 0){ |
|
$r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs. |
|
'"><b>'.&mt('Previous').'</b></a></td>'); |
|
} |
|
if ($counter < $number_of_messages - 1){ |
|
$r->print('<td><a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs. |
|
'"><b>'.&mt('Next').'</b></a></td>'); |
|
} |
|
$r->print('</tr></table><p><pre>'. |
|
&Apache::lontexconvert::msgtexconverted($content{'message'}). |
|
'</pre><hr>'.$content{'citation'}); |
|
} elsif ($ENV{'form.replyto'}) { |
|
&comprep($r,$ENV{'form.replyto'}); |
|
} elsif ($ENV{'form.sendreply'}) { |
|
if ($ENV{'form.send'}) { |
|
my $msgid=$ENV{'form.sendreply'}; |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
my %content=&unpackagemsg($message{$msgid},1); |
|
&statuschange($msgid,'replied'); |
|
if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && |
|
(&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { |
|
$r->print(&mt('Sending critical message').': '. |
|
&user_crit_msg($content{'sendername'}, |
|
$content{'senderdomain'}, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.message'}), |
|
$ENV{'form.sendbck'})); |
|
} else { |
|
$r->print(&mt('Sending').': '.&user_normal_msg($content{'sendername'}, |
|
$content{'senderdomain'}, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.message'}))); |
|
} |
|
} |
|
if ($ENV{'form.displayedcrit'}) { |
|
&discrit($r); |
|
} else { |
|
&disall($r); |
|
} |
|
} elsif ($ENV{'form.confirm'}) { |
|
foreach (keys %ENV) { |
|
if ($_=~/^form\.rec\_(.*)$/) { |
|
$r->print('<b>Confirming Receipt:</b> '. |
|
&user_crit_received($1).'<br>'); |
|
} |
|
if ($_=~/^form\.reprec\_(.*)$/) { |
|
my $msgid=$1; |
|
$r->print('<b>Confirming Receipt:</b> '. |
|
&user_crit_received($msgid).'<br>'); |
|
&comprep($r,$msgid); |
|
} |
|
} |
|
&discrit($r); |
|
} elsif ($ENV{'form.critical'}) { |
|
&discrit($r); |
|
} elsif ($ENV{'form.forward'}) { |
|
&compout($r,$ENV{'form.forward'}); |
|
} elsif ($ENV{'form.markread'}) { |
|
} elsif ($ENV{'form.markdel'}) { |
|
&statuschange($ENV{'form.markdel'},'deleted'); |
|
&disall($r); |
|
} elsif ($ENV{'form.markeddel'}) { |
|
my $total=0; |
|
foreach (keys %ENV) { |
|
if ($_=~/^form\.delmark_(.*)$/) { |
|
&statuschange(&Apache::lonnet::unescape($1),'deleted'); |
|
$total++; |
|
} |
|
} |
|
$r->print('Deleted '.$total.' message(s)<p>'); |
|
&disall($r); |
|
} elsif ($ENV{'form.markunread'}) { |
|
&statuschange($ENV{'form.markunread'},'new'); |
|
&disall($r); |
|
} elsif ($ENV{'form.compose'}) { |
|
&compout($r,'',$ENV{'form.compose'}); |
|
} elsif ($ENV{'form.recordftf'}) { |
|
&facetoface($r,$ENV{'form.recordftf'}); |
|
} elsif ($ENV{'form.sendmail'}) { |
|
my $sendstatus=''; |
|
if ($ENV{'form.send'}) { |
|
my %content=(); |
|
undef %content; |
|
if ($ENV{'form.forwid'}) { |
|
my $msgid=$ENV{'form.forwid'}; |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
%content=&unpackagemsg($message{$msgid},1); |
|
&statuschange($msgid,'forwarded'); |
|
$ENV{'form.message'}.="\n\n-- Forwarded message --\n\n". |
|
$content{'message'}; |
|
} |
|
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*/,$_); |
|
if ($txt) { |
|
$rec=~s/\@/\:/; |
|
$toaddr{$rec}.=$txt."\n"; |
|
} |
|
} |
|
} else { |
|
$toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}=''; |
|
} |
|
if ($ENV{'form.additionalrec'}) { |
|
foreach (split(/\,/,$ENV{'form.additionalrec'})) { |
|
my ($auname,$audom)=split(/\@/,$_); |
|
$toaddr{$auname.':'.$audom}=''; |
|
} |
|
} |
|
foreach (keys %toaddr) { |
|
my ($recuname,$recdomain)=split(/\:/,$_); |
|
my $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'}); |
|
if ($toaddr{$_}) { $msgtxt.='<hr>'.$toaddr{$_}; } |
|
if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && |
|
(&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { |
|
$r->print(&mt('Sending critical message').' ...'); |
|
$sendstatus.=' '.&user_crit_msg($recuname,$recdomain, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
$msgtxt, |
|
$ENV{'form.sendbck'}); |
|
} else { |
|
$r->print(&mt('Sending').' ...'); |
|
$sendstatus.=' '.&user_normal_msg($recuname,$recdomain, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
$msgtxt, |
|
$content{'citation'}); |
|
} |
|
$r->print('<br />'); |
|
} |
|
} |
|
if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { |
|
if ($ENV{'form.displayedcrit'}) { |
|
&discrit($r); |
|
} else { |
|
&disall($r); |
|
} |
|
} else { |
|
$r->print( |
|
'<h2><font color="red">'.&mt('Could not deliver message').'</font></h2>'. |
|
&mt('Please use the browser "Back" button and correct the recipient addresses') |
|
); |
|
} |
|
} else { |
|
&disall($r); |
|
} |
|
$r->print('</body></html>'); |
|
return OK; |
|
|
|
|
if ($ENV{'form.display'}) { |
|
&displaymessage($r,$ENV{'form.display'},$folder); |
|
} elsif ($ENV{'form.replyto'}) { |
|
&compout($r,'',$ENV{'form.replyto'}); |
|
} elsif ($ENV{'form.confirm'}) { |
|
&printheader($r,'','Confirmed Receipt'); |
|
foreach (keys %ENV) { |
|
if ($_=~/^form\.rec\_(.*)$/) { |
|
$r->print('<b>'.&mt('Confirming Receipt').':</b> '. |
|
&user_crit_received($1).'<br>'); |
|
} |
|
if ($_=~/^form\.reprec\_(.*)$/) { |
|
my $msgid=$1; |
|
$r->print('<b>'.&mt('Confirming Receipt').':</b> '. |
|
&user_crit_received($msgid).'<br>'); |
|
&compout($r,'','','',$msgid); |
|
} |
|
} |
|
&discrit($r); |
|
} elsif ($ENV{'form.critical'}) { |
|
&printheader($r,'','Displaying Critical Messages'); |
|
&discrit($r); |
|
} elsif ($ENV{'form.forward'}) { |
|
&compout($r,$ENV{'form.forward'}); |
|
} elsif ($ENV{'form.markdel'}) { |
|
&printheader($r,'','Deleted Message'); |
|
&statuschange($ENV{'form.markdel'},'deleted',$folder); |
|
&disall($r,$folder); |
|
} elsif ($ENV{'form.markedmove'}) { |
|
my $total=0; |
|
foreach (keys %ENV) { |
|
if ($_=~/^form\.delmark_(.*)$/) { |
|
&movemsg(&Apache::lonnet::unescape($1),$folder, |
|
$ENV{'form.movetofolder'}); |
|
$total++; |
|
} |
|
} |
|
&printheader($r,'','Moved Messages'); |
|
$r->print('Moved '.$total.' message(s)<p>'); |
|
&disall($r,$folder); |
|
} elsif ($ENV{'form.markeddel'}) { |
|
my $total=0; |
|
foreach (keys %ENV) { |
|
if ($_=~/^form\.delmark_(.*)$/) { |
|
&statuschange(&Apache::lonnet::unescape($1),'deleted'); |
|
$total++; |
|
} |
|
} |
|
&printheader($r,'','Deleted Messages'); |
|
$r->print('Deleted '.$total.' message(s)<p>'); |
|
&disall($r,$folder); |
|
} elsif ($ENV{'form.markunread'}) { |
|
&printheader($r,'','Marked Message as Unread'); |
|
&statuschange($ENV{'form.markunread'},'new'); |
|
&disall($r,$folder); |
|
} elsif ($ENV{'form.compose'}) { |
|
&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'}) { |
|
my $sendstatus=''; |
|
if ($ENV{'form.send'}) { |
|
&printheader($r,'','Messages being sent.'); |
|
$r->rflush(); |
|
my %content=(); |
|
undef %content; |
|
if ($ENV{'form.forwid'}) { |
|
my $msgid=$ENV{'form.forwid'}; |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
%content=&unpackagemsg($message{$msgid},1); |
|
&statuschange($msgid,'forwarded'); |
|
$ENV{'form.message'}.="\n\n-- Forwarded message --\n\n". |
|
$content{'message'}; |
|
} |
|
if ($ENV{'form.replyid'}) { |
|
my $msgid=$ENV{'form.replyid'}; |
|
my %message=&Apache::lonnet::get('nohist_email',[$msgid]); |
|
%content=&unpackagemsg($message{$msgid},1); |
|
&statuschange($msgid,'replied'); |
|
} |
|
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*/,$_); |
|
if ($txt) { |
|
$rec=~s/\@/\:/; |
|
$toaddr{$rec}.=$txt."\n"; |
|
} |
|
} |
|
} else { |
|
$toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}=''; |
|
} |
|
if ($ENV{'form.additionalrec'}) { |
|
foreach (split(/\,/,$ENV{'form.additionalrec'})) { |
|
my ($auname,$audom)=split(/\@/,$_); |
|
$toaddr{$auname.':'.$audom}=''; |
|
} |
|
} |
|
|
|
foreach (keys %toaddr) { |
|
my ($recuname,$recdomain)=split(/\:/,$_); |
|
my $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'}); |
|
if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; } |
|
my $thismsg; |
|
if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && |
|
(&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { |
|
$r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': '); |
|
$thismsg=&user_crit_msg($recuname,$recdomain, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
$msgtxt, |
|
$ENV{'form.sendbck'}); |
|
} else { |
|
$r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': '); |
|
$thismsg=&user_normal_msg($recuname,$recdomain, |
|
&Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), |
|
$msgtxt, |
|
$content{'citation'}); |
|
if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) { |
|
&user_normal_msg_raw( |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
|
'Broadcast ['.$recuname.':'.$recdomain.']', |
|
$msgtxt); |
|
} |
|
} |
|
$r->print($thismsg.'<br />'); |
|
$sendstatus.=' '.$thismsg; |
|
} |
|
} else { |
|
&printheader($r,'','No messages sent.'); |
|
} |
|
if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { |
|
$r->print('<br /><font color="green">'.&mt('Completed.').'</font>'); |
|
if ($ENV{'form.displayedcrit'}) { |
|
&discrit($r); |
|
} else { |
|
&Apache::loncommunicate::menu($r); |
|
} |
|
} else { |
|
$r->print( |
|
'<h2><font color="red">'.&mt('Could not deliver message').'</font></h2>'. |
|
&mt('Please use the browser "Back" button and correct the recipient addresses') |
|
); |
|
} |
|
} elsif ($ENV{'form.newfolder'}) { |
|
&printheader($r,'','New Folder'); |
|
&makefolder($ENV{'form.newfolder'}); |
|
&disall($r,$ENV{'form.newfolder'}); |
|
} else { |
|
&printheader($r,'','Display All Messages'); |
|
&disall($r,$folder); |
|
} |
|
$r->print('</body></html>'); |
|
return OK; |
} |
} |
# ================================================= Main program, reset counter |
# ================================================= Main program, reset counter |
|
|