--- loncom/interface/lonmsg.pm 2004/05/17 19:00:45 1.101
+++ loncom/interface/lonmsg.pm 2005/01/01 18:24:12 1.127
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging
#
-# $Id: lonmsg.pm,v 1.101 2004/05/17 19:00:45 raeburn Exp $
+# $Id: lonmsg.pm,v 1.127 2005/01/01 18:24:12 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -117,11 +117,14 @@ use Apache::loncommunicate;
# Querystring component with sorting type
my $sqs;
+my $startdis;
+my $interdis;
# ===================================================================== Package
sub packagemsg {
- my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_;
+ my ($subject,$message,$citation,$baseurl,$attachmenturl,
+ $recuser,$recdomain)=@_;
$message =&HTML::Entities::encode($message,'<>&"');
$citation=&HTML::Entities::encode($citation,'<>&"');
$subject =&HTML::Entities::encode($subject,'<>&"');
@@ -156,6 +159,8 @@ sub packagemsg {
''.$ENV{'request.role'}.' '.
''.$ENV{'request.filename'}.' '.
''.$msgid.' '.
+ ''.$recuser.' '.
+ ''.$recdomain.' '.
''.$message.' ';
if (defined($citation)) {
$result.=''.$citation.' ';
@@ -201,10 +206,12 @@ sub unpackagemsg {
# ======================================================= Get info out of msgid
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(/\:/,
&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}=''; }
unless ($status{$msgid}) { $status{$msgid}='new'; }
return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid});
@@ -219,10 +226,14 @@ sub sendemail {
my $msg = new Mail::Send;
$msg->to($to);
$msg->subject('[LON-CAPA] '.$subject);
+ my %oldENV=%ENV;
+ undef(%ENV);
if (my $fh = $msg->open()) {
print $fh $body;
$fh->close;
}
+ %ENV=%oldENV;
+ undef(%oldENV);
}
# ==================================================== Send notification emails
@@ -441,13 +452,21 @@ sub user_normal_msg_raw {
my $homeserver=&Apache::lonnet::homeserver($user,$domain);
if ($homeserver ne 'no_host') {
($msgid,$message)=&packagemsg($subject,$message,$citation,$baseurl,
- $attachmenturl);
+ $attachmenturl,$user,$domain);
+# Store in user folder
$status=&Apache::lonnet::critical(
'put:'.$domain.':'.$user.':nohist_email:'.
&Apache::lonnet::escape($msgid).'='.
&Apache::lonnet::escape($message),$homeserver);
+# Save new message received time
&Apache::lonnet::put
('email_status',{'recnewemail'=>time},$domain,$user);
+# Into sent-mail folder
+ $status.=' '.&Apache::lonnet::critical(
+ 'put:'.$ENV{'user.domain'}.':'.$ENV{'user.name'}.
+ ':nohist_email_sent:'.
+ &Apache::lonnet::escape($msgid).'='.
+ &Apache::lonnet::escape($message),$ENV{'user.home'});
} else {
$status='no_host';
}
@@ -494,30 +513,108 @@ 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 '
':'');
+}
+
+sub scrollbuttons {
+ my ($start,$maxdis,$first,$finish,$total)=@_;
+ unless ($total>0) { return ''; }
+ $start++; $maxdis++;$first++;$finish++;
+ return
+ ' '.
+ ' '.
+ ' of '.$maxdis.
+ ' '.
+ ' '.
+ &mt('Messages [_1] through [_2] of [_3]',$first,$finish,$total).'';
+}
+
+# =============================================================== Folder suffix
+
+sub foldersuffix {
+ my $folder=shift;
+ unless ($folder) { return ''; }
+ return '_'.&Apache::lonnet::escape($folder);
+}
+
# =============================================================== Status Change
sub statuschange {
- my ($msgid,$newstatus)=@_;
- my %status=&Apache::lonnet::get('email_status',[$msgid]);
+ my ($msgid,$newstatus,$folder)=@_;
+ my $suffix=&foldersuffix($folder);
+ my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
unless ($status{$msgid}) { $status{$msgid}='new'; }
unless (($status{$msgid} eq 'replied') ||
($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')) {
- &Apache::lonnet::put('email_status',{$msgid => $newstatus});
+ &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
+ }
+}
+
+# ============================================================= Make new folder
+
+sub makefolder {
+ my ($newfolder)=@_;
+ if (($newfolder eq 'sent')
+ || ($newfolder eq 'critical')
+ || ($newfolder eq 'trash')
+ || ($newfolder eq 'new')) { return; }
+ &Apache::lonnet::put('email_folders',{$newfolder => time});
+}
+
+# ======================================================== Move between folders
+
+sub movemsg {
+ my ($msgid,$srcfolder,$trgfolder)=@_;
+ my $srcsuffix=&foldersuffix($srcfolder);
+ my $trgsuffix=&foldersuffix($trgfolder);
+
+# Copy message
+ my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
+ &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
+
+# Copy status
+ my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
+ &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});
+# See if was deleted -> becomes "read" in trash
+ my $currentstatus=(&unpackmsgid($status{$msgid}),$srcfolder);
+ if ($currentstatus eq 'deleted') {
+ &statuschange($msgid,'read',$trgfolder);
}
+# Delete orginals
+ &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
+ &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
}
# ======================================================= Display a course list
sub discourse {
my $r=shift;
- my %courselist=&Apache::lonnet::dump(
- 'classlist',
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my $classlist = &Apache::loncoursedata::get_classlist();
my $now=time;
my %lt=&Apache::lonlocal::texthash('cfa' => 'Check for All',
'cfs' => 'Check for Section/Group',
@@ -559,39 +656,36 @@ sub discourse {
ENDDISHEADER
- my %coursepersonnel=
- &Apache::lonnet::get_course_adv_roles();
+ my %coursepersonnel=&Apache::lonnet::get_course_adv_roles();
+ $r->print('
');
foreach my $role (sort keys %coursepersonnel) {
- foreach (split(/\,/,$coursepersonnel{$role})) {
- my ($puname,$pudom)=split(/\:/,$_);
- $r->print(
- ' '.
- &Apache::loncommon::plainname($puname,
- $pudom).' ('.$_.'), '.$role.' ');
- }
+ foreach (split(/\,/,$coursepersonnel{$role})) {
+ my ($puname,$pudom)=split(/\:/,$_);
+ $r->print(''.
+ ' '.
+ &Apache::loncommon::plainname($puname,$pudom).
+ ' '.
+ '('.$_.'), '.$role.' ');
+ }
}
-
- foreach (sort keys %courselist) {
- my ($end,$start)=split(/\:/,$courselist{$_});
- my $active=1;
- if (($end) && ($now>$end)) { $active=0; }
- if ($active) {
- my ($sname,$sdom)=split(/\:/,$_);
- my %reply=&Apache::lonnet::get('environment',
- ['firstname','middlename','lastname','generation'],
- $sdom,$sname);
- my $section=&Apache::lonnet::usection
- ($sdom,$sname,$ENV{'request.course.id'});
- $r->print(
- ' '.
- $reply{'firstname'}.' '.
- $reply{'middlename'}.' '.
- $reply{'lastname'}.' '.
- $reply{'generation'}.
- ' ('.$_.') '.$section);
- }
+ $r->print('
');
}
# ==================================================== Display Critical Message
@@ -606,14 +700,13 @@ sub discrit {
foreach (sort keys %what) {
my %content=&unpackagemsg($what{$_});
next if ($content{'senderdomain'} eq '');
- $content{'message'}=~s/\n/\ /g;
- $result.=' '.&mt('From').': '.
+ $result.=' '.&mt('From').': '.
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
$content{'sendername'}.'@'.
$content{'senderdomain'}.') '.$content{'time'}.
- ' '.&mt('Subject').': '.$content{'subject'}.
- ''.
+ ' '.&mt('Subject').': '.$content{'subject'}.
+ ''.
&Apache::lontexconvert::msgtexconverted($content{'message'}).
' '.
&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
@@ -625,23 +718,25 @@ $content{'sendername'}.'@'.
# Check to see if there were any messages.
if ($result eq '') {
$result = "".&mt('You have no critical messages.')." ".
- ''.&mt('Select a course').' ';
+ ''.&mt('Select a course').' '.
+ ''.&mt('Communicate').' ';
} else {
$r->print($header);
}
$r->print($result);
- $r->print(' ');
+ $r->print(' ');
}
sub sortedmessages {
- my ($blocked,$startblock,$endblock,$numblocked) = @_;
- 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
my @temp;
foreach (@messages) {
my $msgid=&Apache::lonnet::escape($_);
my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)=
- &Apache::lonmsg::unpackmsgid($msgid);
+ &Apache::lonmsg::unpackmsgid($msgid,$folder);
my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
$msgid);
# Check whether message was sent during blocking period.
@@ -688,10 +783,108 @@ sub sortedmessages {
return @temp;
}
+# ======================================================== Display new messages
+
+
+sub disnew {
+ my $r=shift;
+ my %lt=&Apache::lonlocal::texthash(
+ 'nm' => 'New Messages',
+ 'su' => 'Subject',
+ 'da' => 'Date',
+ 'us' => 'Username',
+ 'op' => 'Open',
+ 'do' => 'Domain'
+ );
+ my @msgids = sort split(/\&/,&Apache::lonnet::reply
+ ('keys:'.$ENV{'user.domain'}.':'.
+ $ENV{'user.name'}.':nohist_email',
+ $ENV{'user.home'}));
+ my @newmsgs;
+ my %setters = ();
+ my $startblock = 0;
+ my $endblock = 0;
+ my %blocked = ();
+ my $numblocked = 0;
+ # Check for blocking of display because of scheduled online exams.
+ &blockcheck(\%setters,\$startblock,\$endblock);
+ foreach (@msgids) {
+ my ($sendtime,$shortsubj,$fromname,$fromdom,$status)=
+ &Apache::lonmsg::unpackmsgid($_);
+ if (defined($sendtime) && $sendtime!~/error/) {
+ my $numsendtime = $sendtime;
+ $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
+ if ($status eq 'new') {
+ if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) {
+ $blocked{$_} = 'ON';
+ $numblocked ++;
+ } else {
+ push @newmsgs, {
+ msgid => $_,
+ sendtime => $sendtime,
+ shortsub => &Apache::lonnet::unescape($shortsubj),
+ from => $fromname,
+ fromdom => $fromdom
+ }
+ }
+ }
+ }
+ }
+ if ($#newmsgs >= 0) {
+ $r->print(<$lt{'nm'}
+ 
+$lt{'da'} $lt{'us'} $lt{'do'} $lt{'su'}
+TABLEHEAD
+ foreach my $msg (@newmsgs) {
+ $r->print(<<"ENDLINK");
+
+$lt{'op'}
+ENDLINK
+ foreach ('sendtime','from','fromdom','shortsub') {
+ $r->print("$msg->{$_} ");
+ }
+ $r->print(" ");
+ }
+ $r->print('