--- loncom/interface/lonmsg.pm 2001/08/13 19:36:39 1.20 +++ loncom/interface/lonmsg.pm 2002/08/28 14:11:27 1.37 @@ -1,7 +1,31 @@ # The LearningOnline Network with CAPA -# # Routines for messaging # +# $Id: lonmsg.pm,v 1.37 2002/08/28 14:11:27 www Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# +# # (Routines to control the menu # # (TeX Conversion Module @@ -13,8 +37,11 @@ # 10/19,10/20,10/30, # 02/06/01 Gerd Kortemeyer # 07/27 Guy Albertelli -# 07/27,07/28,07/30,08/03,08/06,08/08,08/09,08/10,8/13 Gerd Kortemeyer - +# 07/27,07/28,07/30,08/03,08/06,08/08,08/09,08/10,8/13,8/15, +# 10/1,11/5 Gerd Kortemeyer +# YEAR=2002 +# 1/1,3/18 Gerd Kortemeyer +# package Apache::lonmsg; use strict; @@ -22,6 +49,8 @@ use Apache::lonnet(); use vars qw($msgcount); use HTML::TokeParser; use Apache::Constants qw(:common); +use Apache::loncommon; +use Apache::lontexconvert; # ===================================================================== Package @@ -37,7 +66,6 @@ sub packagemsg { $msgcount++; my $partsubj=$subject; $partsubj=&Apache::lonnet::escape($partsubj); - $partsubj=substr($partsubj,0,50); my $msgid=&Apache::lonnet::escape( $now.':'.$partsubj.':'.$ENV{'user.name'}.':'. $ENV{'user.domain'}.':'.$msgcount.':'.$$); @@ -114,15 +142,15 @@ sub author_res_msg { # ================================================== Critical message to a user sub user_crit_msg { - my ($user,$domain,$subject,$message)=@_; + my ($user,$domain,$subject,$message,$sendback)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { - my $msgid; ($msgid,$message)=&packagemsg($subject,$message); + if ($sendback) { $message.='true'; } $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':critical:'. &Apache::lonnet::escape($msgid).'='. @@ -146,13 +174,13 @@ sub user_crit_received { my $msgid=shift; my %message=&Apache::lonnet::get('critical',[$msgid]); my %contents=&unpackagemsg($message{$msgid}); - my $status='rec: '. + my $status='rec: '.($contents{'sendback'}? &user_normal_msg($contents{'sendername'},$contents{'senderdomain'}, 'Receipt: '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}, 'User '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}. ' acknowledged receipt of message "'. $contents{'subject'}.'" dated '.$contents{'time'}.".\n\n" - .'Message ID: '.$contents{'msgid'}); + .'Message ID: '.$contents{'msgid'}):'no msg req'); $status.=' trans: '. &Apache::lonnet::put( 'nohist_email',{$contents{'msgid'} => $message{$msgid}}); @@ -175,7 +203,6 @@ sub user_normal_msg { unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { - my $msgid; ($msgid,$message)=&packagemsg($subject,$message,$citation); $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':nohist_email:'. @@ -252,7 +279,7 @@ sub discourse {

ENDDISHEADER - map { + foreach (sort keys %courselist) { my ($end,$start)=split(/\:/,$courselist{$_}); my $active=1; if (($end) && ($now>$end)) { $active=0; } @@ -271,28 +298,43 @@ ENDDISHEADER $reply{'generation'}. ' ('.$_.') '.$section); } - } sort keys %courselist; + } } # ==================================================== Display Critical Message sub discrit { my $r=shift; - $r->print('

Critical Messages

'. - '
'. - ''); - my %what=&Apache::lonnet::dump('critical'); - map { - my %content=&unpackagemsg($what{$_}); - $content{'message'}=~s/\n/\/g; - $r->print('
From: '.$content{'sendername'}.'@'. - $content{'senderdomain'}.' ('.$content{'time'}. - ')
'.$content{'message'}.'
'. - ''. - ''); - } sort keys %what; - $r->print( - ''); + my $header = '

Critical Messages

'. + '
'. + ''; + my %what=&Apache::lonnet::dump('critical'); + my $result = ''; + foreach (sort keys %what) { + my %content=&unpackagemsg($what{$_}); + next if ($content{'senderdomain'} eq ''); + $content{'message'}=~s/\n/\/g; + $result.='
From: '. +&Apache::loncommon::aboutmewrapper( + &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. +$content{'sendername'}.'@'. + $content{'senderdomain'}.') '.$content{'time'}. + '
Subject: '.$content{'subject'}. + '
'. + &Apache::lontexconvert::msgtexconverted($content{'message'}). + '
'. + ''. + ''; + } + # Check to see if there were any messages. + if ($result eq '') { + $result = "

You have no critical messages.

"; + } else { + $r->print($header); + } + $r->print($result); + $r->print(''); } # =============================================================== Compose reply @@ -308,14 +350,18 @@ sub comprep { my $subject='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= - ' Send as critical message

'; + ' Send as critical message ' . $crithelp . + '
'. + ' Send as critical message ' . + ' and return receipt' . $crithelp . '

'; } $r->print(<<"ENDREPLY");

Subject:

-

$dispcrit @@ -328,13 +374,39 @@ ENDREPLY sub disall { my $r=shift; - $r->print('

Display All Messages

'. + $r->print(< + function checkall() { + for (i=0; i +ENDDISHEADER + $r->print( + '

Display All Messages

'. ''. ''); - map { + foreach (sort split(/\&/,&Apache::lonnet::reply('keys:'. + $ENV{'user.domain'}.':'. + $ENV{'user.name'}.':nohist_email', + $ENV{'user.home'}))) { my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)= &Apache::lonmsg::unpackmsgid($_); - unless ($status eq 'deleted') { + unless (($status eq 'deleted') || ($sendtime=~/error/)) { if ($status eq 'new') { $r->print(''); } elsif ($status eq 'read') { @@ -346,16 +418,18 @@ sub disall { } $r->print(''. + ''); } - } sort split(/\&/,&Apache::lonnet::reply('keys:'. - $ENV{'user.domain'}.':'. - $ENV{'user.name'}.':nohist_email', - $ENV{'user.home'})); - $r->print('
 DateUsernameDomainSubjectStatus
OpenDelete'.localtime($sendtime).''. + '">Delete'.localtime($sendtime).''. $fromname.''.$fromdomain.''. &Apache::lonnet::unescape($shortsubj).''. $status.'
'); + } + $r->print('

'. + 'Check All '. + 'Uncheck All

'. + ''. + '

'); } # ============================================================== Compose output @@ -367,8 +441,12 @@ sub compout { my $dismsg=''; my $func='Send New'; if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { + my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); $dispcrit= - ' Send as critical message

'; + ' Send as critical message ' . $crithelp . + '
'. + ' Send as critical message ' . + ' and return receipt' . $crithelp . '

'; } if ($forwarding) { $dispcrit.=''. - ''); - unless ($broadcast eq 'group') { + if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; } + $r->print( + ''."\n". + ''."\n". + '
'); + unless (($broadcast eq 'group') || ($broadcast eq 'upload')) { + my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); + $r->print(<<"ENDREC");
- + - + ENDREC } - $r->print(<<"ENDCOMP"); + if ($broadcast ne 'upload') { + $r->print(<<"ENDCOMP");
Username:
Username:
Domain:
$domform
Additional Recipients
username\@domain,username\@domain, ...
Subject:
-

$dispcrit ENDCOMP + } else { # $broadcast is 'upload' + $r->print(< +

Generate messages from a file

+

+Subject: +

+

General message text
+

+

+The file format for the uploaded portion of the message is: +

+username1\@domain1: text
+username2\@domain2: text
+username3\@domain1: text
+
+

+

+The messages will be assembled from all lines with the respective +username\@domain, and appended to the general message text.

+

+

+$dispcrit + +ENDUPLOAD + } if ($broadcast eq 'group') { &discourse; } @@ -422,36 +534,26 @@ sub handler { return OK if $r->header_only; # --------------------------- Get query string for limited number of parameters - - map { - my ($name, $value) = split(/=/,$_); - $value =~ tr/+/ /; - $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; - if (($name eq 'display') || ($name eq 'replyto') || - ($name eq 'forward') || ($name eq 'markread') || - ($name eq 'markdel') || ($name eq 'markunread') || - ($name eq 'sendreply') || ($name eq 'compose') || - ($name eq 'sendmail') || ($name eq 'critical')) { - unless ($ENV{'form.'.$name}) { - $ENV{'form.'.$name}=$value; - } - } - } (split(/&/,$ENV{'QUERY_STRING'})); + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['display','replyto','forward','markread','markdel','markunread', + 'sendreply','compose','sendmail','critical','recname','recdom']); # --------------------------------------------------------------- Render Output - $r->print('EMail and Messaging'); - $r->print( - ''); - $r->print('

EMail

'); + $r->print('EMail and Messaging'. + &Apache::loncommon::bodytag('EMail and Messages')); 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}); $r->print('Subject: '.$content{'subject'}. - '
From: '.$content{'sendername'}.' at '. - $content{'senderdomain'}. + '
From: '. +&Apache::loncommon::aboutmewrapper( +&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}), +$content{'sendername'},$content{'senderdomain'}).' ('. + $content{'sendername'}.' at '. + $content{'senderdomain'}.') '. '
Time: '.$content{'time'}.'

'. ''. ''. ''. '
Functions:Mark UnreadDisplay all Messages

'.
-             $content{'message'}.'

'.$content{'citation'}); + &Apache::lontexconvert::msgtexconverted($content{'message'}). + '
'.$content{'citation'}); } elsif ($ENV{'form.replyto'}) { &comprep($r,$ENV{'form.replyto'}); } elsif ($ENV{'form.sendreply'}) { @@ -470,13 +573,14 @@ sub handler { my %message=&Apache::lonnet::get('nohist_email',[$msgid]); my %content=&unpackagemsg($message{$msgid}); &statuschange($msgid,'replied'); - if (($ENV{'form.critmsg'}) && + if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { $r->print('Sending critical: '. &user_crit_msg($content{'sendername'}, $content{'senderdomain'}, $ENV{'form.subject'}, - $ENV{'form.message'})); + $ENV{'form.message'}, + $ENV{'form.sendbck'})); } else { $r->print('Sending: '.&user_normal_msg($content{'sendername'}, $content{'senderdomain'}, @@ -489,7 +593,7 @@ sub handler { &disall($r); } } elsif ($ENV{'form.confirm'}) { - map { + foreach (keys %ENV) { if ($_=~/^form\.rec\_(.*)$/) { $r->print('Confirming Receipt: '. &user_crit_received($1).'
'); @@ -500,7 +604,7 @@ sub handler { &user_crit_received($msgid).'
'); &comprep($r,$msgid); } - } keys %ENV; + } &discrit($r); } elsif ($ENV{'form.critical'}) { &discrit($r); @@ -510,6 +614,16 @@ sub handler { } 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)

'); + &disall($r); } elsif ($ENV{'form.markunread'}) { &statuschange($ENV{'form.markunread'},'new'); &disall($r); @@ -529,37 +643,47 @@ sub handler { my %toaddr=(); undef %toaddr; if ($ENV{'form.sendmode'} eq 'group') { - map { + foreach (keys %ENV) { if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) { - $toaddr{$1}=1; + $toaddr{$1}=''; } - } keys %ENV; + } + } 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'}}=1; + $toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}=''; } if ($ENV{'form.additionalrec'}) { - map { + foreach (split(/\,/,$ENV{'form.additionalrec'})) { my ($auname,$audom)=split(/\@/,$_); - $toaddr{$auname.':'.$audom}=1; - } split(/\,/,$ENV{'form.additionalrec'}); + $toaddr{$auname.':'.$audom}=''; + } } - map { + foreach (keys %toaddr) { my ($recuname,$recdomain)=split(/\:/,$_); - if (($ENV{'form.critmsg'}) && + my $msgtxt=$ENV{'form.message'}; + if ($toaddr{$_}) { $msgtxt.='


'.$toaddr{$_}; } + if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) { $r->print('Sending critical: '. &user_crit_msg($recuname,$recdomain, $ENV{'form.subject'}, - $ENV{'form.message'}, - $content{'citation'})); + $msgtxt, + $ENV{'form.sendbck'})); } else { $r->print('Sending: '.&user_normal_msg($recuname,$recdomain, $ENV{'form.subject'}, - $ENV{'form.message'}, + $msgtxt, $content{'citation'})); } $r->print('
'); - } keys %toaddr; + } if ($ENV{'form.displayedcrit'}) { &discrit($r); } else { @@ -574,7 +698,7 @@ sub handler { } # ================================================= Main program, reset counter -sub BEGIN { +BEGIN { $msgcount=0; }