--- loncom/interface/lonmsg.pm 2003/07/05 10:07:11 1.57 +++ loncom/interface/lonmsg.pm 2003/08/17 19:13:32 1.63 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.57 2003/07/05 10:07:11 www Exp $ +# $Id: lonmsg.pm,v 1.63 2003/08/17 19:13:32 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,6 +44,68 @@ # package Apache::lonmsg; +=pod + +=head1 NAME + +Apache::lonmsg: supports internal messaging + +=head1 SYNOPSIS + +lonmsg provides routines for sending messages, receiving messages, and +a handler to allow users to read, send, and delete messages. + +=head1 OVERVIEW + +=head2 Messaging Overview + +XLON-CAPA provides an internal messaging system similar to +email, but customized for LON-CAPA's usage. LON-CAPA implements its +own messaging system, rather then building on top of email, because of +the features LON-CAPA messages can offer that conventional e-mail can +not: + +=over 4 + +=item * B: A message the recipient B +acknowlegde receipt of before they are allowed to continue using the +system, preventing a user from claiming they never got a message + +=item * B: LON-CAPA can reliably send reciepts informing the +sender that it has been read; again, useful for preventing students +from claiming they did not see a message. (While conventional e-mail +has some reciept support, it's sporadic, e-mail client-specific, and +generally the receiver can opt to not send one, making it useless in +this case.) + +=item * B: LON-CAPA knows about the sender, such as where +they are in a course. When a student mails an instructor asking for +help on the problem, the instructor receives not just the student's +question, but all submissions the student has made up to that point, +the user's rendering of the problem, and the complete view the student +saw of the resource, including discussion up to that point. Finally, +the instructor is reading all of this inside of LON-CAPA, not their +email program, so they have full access to LON-CAPA's grading +interface, or other features they may wish to use in response to the +student's query. + +=back + +Users can ask LON-CAPA to forward messages to conventional e-mail +addresses on their B screen, but generally, LON-CAPA messages +are much more useful then traditional email can be made to be, even +with HTML support. + +Right now, this document will cover just how to send a message, since +it is likely you will not need to programmatically read messages, +since lonmsg already implements that functionality. + +=head1 FUNCTIONS + +=over 4 + +=cut + use strict; use Apache::lonnet(); use vars qw($msgcount); @@ -192,6 +254,13 @@ sub newmail { # =============================== Automated message to the author of a resource +=pod + +=item * B: Sends message $message to the owner + of the resource with the URI $filename. + +=cut + sub author_res_msg { my ($filename,$message)=@_; unless ($message) { return 'empty'; } @@ -255,6 +324,14 @@ sub user_crit_msg_raw { # New routine that respects "forward" and calls old routine +=pod + +=item * B: Sends + a critical message $message to the $user at $domain. If $sendback is true, + a reciept will be sent to the current user when $user recieves the message. + +=cut + sub user_crit_msg { my ($user,$domain,$subject,$message,$sendback)=@_; my $status=''; @@ -335,6 +412,14 @@ sub user_normal_msg_raw { # New routine that respects "forward" and calls old routine +=pod + +=item * B: Sends a message to the + $user at $domain, with subject $subject and message $message. + +=cut + sub user_normal_msg { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_; my $status=''; @@ -418,6 +503,19 @@ sub discourse {

ENDDISHEADER + my %coursepersonnel= + &Apache::lonnet::get_course_adv_roles(); + foreach my $role (sort keys %coursepersonnel) { + 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; @@ -468,7 +566,8 @@ $content{'sendername'}.'@'. } # Check to see if there were any messages. if ($result eq '') { - $result = "

You have no critical messages.

"; + $result = "

You have no critical messages.

". + 'Select a course'; } else { $r->print($header); } @@ -539,24 +638,89 @@ sub disall { } ENDDISHEADER - $r->print( - '

Display All Messages

'. - ''. - ''); - foreach (sort split(/\&/,&Apache::lonnet::reply('keys:'. - $ENV{'user.domain'}.':'. - $ENV{'user.name'}.':nohist_email', - $ENV{'user.home'}))) { - my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= + $r->print('

Display All Messages

'. + '
 DateUsernameDomainSubjectStatus
'); + } else { + $r->print('Date'); + } + $r->print(''); + } else { + $r->print('Status'); + } + $r->print(''); + my @messages = split(/\&/,&Apache::lonnet::reply('keys:'.$ENV{'user.domain'}.':'.$ENV{'user.name'}.':nohist_email',$ENV{'user.home'})); + #unpack the varibles and repack into temp for sorting + my @temp; + foreach (@messages) { + my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= &Apache::lonmsg::unpackmsgid($_); + my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status); + push @temp ,\@temp1; + } + #default sort + @temp = sort {$a->[0] <=> $b->[0]} @temp; + if ($ENV{'form.sortedby'} eq "date"){ + @temp = sort {$a->[0] <=> $b->[0]} @temp; + } + if ($ENV{'form.sortedby'} eq "revdate"){ + @temp = sort {$b->[0] <=> $a->[0]} @temp; + } + if ($ENV{'form.sortedby'} eq "user"){ + @temp = sort {lc($a->[2]) cmp lc($b->[2])} @temp; + } + if ($ENV{'form.sortedby'} eq "revuser"){ + @temp = sort {lc($b->[2]) cmp lc($a->[2])} @temp; + } + if ($ENV{'form.sortedby'} eq "domain"){ + @temp = sort {$a->[3] cmp $b->[3]} @temp; + } + if ($ENV{'form.sortedby'} eq "revdomain"){ + @temp = sort {$b->[3] cmp $a->[3]} @temp; + } + if ($ENV{'form.sortedby'} eq "subject"){ + @temp = sort {lc($a->[1]) cmp lc($b->[1])} @temp; + } + if ($ENV{'form.sortedby'} eq "revsubject"){ + @temp = sort {lc($b->[1]) cmp lc($a->[1])} @temp; + } + if ($ENV{'form.sortedby'} eq "status"){ + @temp = sort {$a->[4] cmp $b->[4]} @temp; + } + if ($ENV{'form.sortedby'} eq "revstatus"){ + @temp = sort {$b->[4] cmp $a->[4]} @temp; + } + foreach (@temp){ + my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= @$_; if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) { if ($status eq 'new') { $r->print(''); } elsif ($status eq 'read') { $r->print(''); } elsif ($status eq 'replied') { - $r->print(''); + $r->print(''); } else { $r->print(''); } @@ -568,7 +732,7 @@ ENDDISHEADER &Apache::lonnet::unescape($shortsubj).''); } - } + } $r->print('
 '); + if ($ENV{'form.sortedby'} eq "revdate") { + $r->print('Date'); + if ($ENV{'form.sortedby'} eq "revuser") { + $r->print('Username'); + } else { + $r->print('Username'); + } + $r->print(''); + if ($ENV{'form.sortedby'} eq "revdomain") { + $r->print('Domain'); + } else { + $r->print('Domain'); + } + $r->print(''); + if ($ENV{'form.sortedby'} eq "revsubject") { + $r->print('Subject'); + } else { + $r->print('Subject'); + } + $r->print(''); + if ($ENV{'form.sortedby'} eq "revstatus") { + $r->print('Status
'. $status.'

'. 'Check All '. 'Uncheck All

'. @@ -789,7 +953,7 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', - 'recordftf']); + 'recordftf','sortedby']); # ------------------------------------------------------ They checked for email &Apache::lonnet::put('email_status',{'recnewemail'=>0}); @@ -970,7 +1134,14 @@ BEGIN { $msgcount=0; } -1; +=pod + +=back + +=cut + +1; + __END__