$lt{'ad'}username\@domain,username\@domain, ...
+$lt{'ad'}username:domain,username:domain, ...
$lt{'sb'}:
@@ -902,6 +1055,14 @@ $disbase
$citation
ENDCOMP
+ if (exists($env{'form.ref'})) {
+ $r->print(' ');
+ }
+ if (exists($env{'form.group'})) {
+ $r->print(' ');
+ }
} else { # $broadcast is 'upload'
$r->print(<
@@ -916,14 +1077,14 @@ Subject:
The file format for the uploaded portion of the message is:
-username1\@domain1: text
-username2\@domain2: text
-username3\@domain1: text
+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.
+username:domain , and appended to the general message text.
$dispcrit
@@ -931,7 +1092,13 @@ $dispcrit
ENDUPLOAD
}
if ($broadcast eq 'group') {
- &discourse($r);
+ if ($group eq '') {
+ my $studentsel = &discourse();
+ $r->print($studentsel);
+ }
+ }
+ if ($env{'form.displayedcrit'}) {
+ $r->print(' ');
}
$r->print(''.
&Apache::lonfeedback::generate_preview_button('compemail','message').
@@ -940,6 +1107,20 @@ ENDUPLOAD
# ---------------------------------------------------- Display all face to face
+sub recipient_input_row {
+ my ($dom,%lt) = @_;
+ my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain');
+ my $selectlink=
+ &Apache::loncommon::selectstudent_link('compemail','recuname',
+ 'recdomain');
+ my $output = <<"ENDREC";
+
$lt{'us'}: $selectlink
+$lt{'do'}:
+$domform
+ENDREC
+ return $output;
+}
+
sub retrieve_instructor_comments {
my ($user,$domain)=@_;
my $target=$env{'form.grade_target'};
@@ -954,8 +1135,8 @@ sub retrieve_instructor_comments {
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
my $result='';
- foreach (sort(keys(%records))) {
- my %content=&Apache::lonmsg::unpackagemsg($records{$_});
+ foreach my $key (sort(keys(%records))) {
+ my %content=&Apache::lonmsg::unpackagemsg($records{$key});
next if ($content{'senderdomain'} eq '');
next if ($content{'subject'} !~ /^Record/);
# &Apache::lonfeedback::newline_to_br(\$content{'message'});
@@ -982,8 +1163,8 @@ sub disfacetoface {
$env{'course.'.$env{'request.course.id'}.'.num'},
'%255b'.$user.'%253a'.$domain.'%255d');
my $result='';
- foreach (sort keys %records) {
- my %content=&Apache::lonmsg::unpackagemsg($records{$_});
+ foreach my $key (sort(keys(%records))) {
+ my %content=&Apache::lonmsg::unpackagemsg($records{$key});
next if ($content{'senderdomain'} eq '');
&Apache::lonfeedback::newline_to_br(\$content{'message'});
if ($content{'subject'}=~/^Record/) {
@@ -992,7 +1173,7 @@ sub disfacetoface {
$result .=''.&mt('Broadcast Message').' ';
if ($content{'subject'}=~/^Broadcast\./) {
if (defined($content{'coursemsgid'})) {
- my $crsmsgid = &Apache::lonnet::escape($content{'coursemsgid'});
+ my $crsmsgid = &escape($content{'coursemsgid'});
my $broadcast_message = &general_message($crsmsgid);
$content{'message'} = ''.&mt('Subject').': '.$content{'message'}.' '.$broadcast_message;
} else {
@@ -1005,7 +1186,7 @@ sub disfacetoface {
} else {
$result.=''.&mt('Critical Message').' ';
if (defined($content{'coursemsgid'})) {
- my $crsmsgid=&Apache::lonnet::escape($content{'coursemsgid'});
+ my $crsmsgid=&escape($content{'coursemsgid'});
my $critical_message = &general_message($crsmsgid);
$content{'message'} = ''.&mt('Subject').': '.$content{'message'}.' '.$critical_message;
} else {
@@ -1026,10 +1207,11 @@ $content{'sendername'}.':'.
}
# Check to see if there were any messages.
if ($result eq '') {
+ my $lctype = lc(&Apache::loncommon::course_type());
if ($target ne 'tex') {
- $r->print(" ".&mt("No notes, face-to-face discussion records, critical messages, or broadcast messages in this course.")."
");
+ $r->print("".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."
");
} else {
- $r->print('\textbf{'.&mt("No notes, face-to-face discussion records, critical messages or broadcast messages in this course.").'}\\\\');
+ $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');
}
} else {
$r->print($result);
@@ -1058,6 +1240,9 @@ sub facetoface {
$r->print('Not allowed');
return;
}
+ my $crstype = &Apache::loncommon::course_type();
+ my $leaders = ($crstype eq 'Group') ? 'coordinators and leaders'
+ : 'faculty and staff';
&printheader($r,
'/adm/email?recordftf=query',
"User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
@@ -1075,9 +1260,9 @@ sub facetoface {
('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',
+ 'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in $crstype",
'subm' => 'Retrieve discussion and message records',
- 'newr' => 'New Record (record is visible to course faculty and staff)',
+ 'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
'post' => 'Post this Record');
$r->print(<<"ENDTREC");
$lt{'head'}
@@ -1098,13 +1283,9 @@ ENDTREC
($env{'form.recdomain'}) && ($env{'form.recuname'})) {
chomp($env{'form.newrecord'});
if ($env{'form.newrecord'}) {
- my $recordtxt = $env{'form.newrecord'};
- &Apache::lonmsg::user_normal_msg_raw(
- $env{'course.'.$env{'request.course.id'}.'.num'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- &mt('Record').
- ' ['.$env{'form.recuname'}.':'.$env{'form.recdomain'}.']',
- $recordtxt);
+ &Apache::lonmsg::store_instructor_comment($env{'form.newrecord'},
+ $env{'form.recuname'},
+ $env{'form.recdomain'});
}
$r->print(''.&Apache::loncommon::plainname($env{'form.recuname'},
$env{'form.recdomain'}).' ');
@@ -1136,10 +1317,12 @@ sub examblock {
$r->print('Not allowed');
return;
}
+ my $usertype = (&Apache::loncommon::course_type() eq 'Group') ? 'members'
+ : 'students';
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.',
+ 'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype 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'
);
@@ -1204,35 +1387,35 @@ sub blockstore {
my $addtotal = 0;
my %blocking = ();
$r->print(''.$lt{'head'}.' ');
- foreach (keys %env) {
- if ($_ =~ m/^form\.modify_(\w+)$/) {
+ foreach my $envkey (keys(%env)) {
+ if ($envkey =~ m/^form\.modify_(\w+)$/) {
$adds{$1} = $1;
$removals{$1} = $1;
$modtotal ++;
- } elsif ($_ =~ m/^form\.cancel_(\d+)$/) {
+ } elsif ($envkey =~ m/^form\.cancel_(\d+)$/) {
$cancels{$1} = $1;
unless ( defined($removals{$1}) ) {
$removals{$1} = $1;
$canceltotal ++;
}
- } elsif ($_ =~ m/^form\.add_(\d+)$/) {
+ } elsif ($envkey =~ m/^form\.add_(\d+)$/) {
$adds{$1} = $1;
$addtotal ++;
}
}
- foreach (keys %removals) {
- my $hashkey = $env{'form.key_'.$_};
+ foreach my $key (keys(%removals)) {
+ my $hashkey = $env{'form.key_'.$key};
&Apache::lonnet::del('comm_block',["$hashkey"],
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'}
);
}
- foreach (keys %adds) {
- unless ( defined($cancels{$_}) ) {
- my ($newstart,$newend) = &get_dates_from_form($_);
+ foreach my $key (keys(%adds)) {
+ unless ( defined($cancels{$key}) ) {
+ my ($newstart,$newend) = &get_dates_from_form($key);
my $newkey = $newstart.'____'.$newend;
- $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$_};
+ $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$key};
}
}
if ($addtotal + $modtotal > 0) {
@@ -1310,7 +1493,7 @@ END
my ($setuname,$setudom,$title) =
&parse_block_record($$records{$record});
- $title = &HTML::Entities::encode($title,'"<>');
+ $title = &HTML::Entities::encode($title,'"<>&');
my $settername = &Apache::loncommon::plainname($setuname,$setudom);
$r->print(&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
@@ -1405,7 +1588,7 @@ sub blockcheck {
$setters->{$course}{'staff'} = [];
$setters->{$course}{'times'} = [];
my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
- foreach my $record (keys %records) {
+ foreach my $record (keys(%records)) {
my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);
if ($start <= time && $end >= time) {
my ($staff_name,$staff_dom,$title) =
@@ -1427,7 +1610,7 @@ sub build_block_table {
my ($r,$startblock,$endblock,$setters) = @_;
my %lt = &Apache::lonlocal::texthash(
'cacb' => 'Currently active communication blocks',
- 'cour' => 'Course',
+ 'cour' => 'Course/Group',
'dura' => 'Duration',
'blse' => 'Block set by'
);
@@ -1471,6 +1654,8 @@ sub displaymessage {
my $startblock = 0;
my $endblock = 0;
my $numblocked = 0;
+ my $crstype = &Apache::loncommon::course_type();
+
# info to generate "next" and "previous" buttons and check if message is blocked
&blockcheck(\%setters,\$startblock,\$endblock);
my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
@@ -1486,7 +1671,7 @@ sub displaymessage {
my $counter=0;
$r->print('');
- my $escmsgid=&Apache::lonnet::escape($msgid);
+ my $escmsgid=&escape($msgid);
foreach (@messages) {
if ($_->[5] eq $escmsgid){
last;
@@ -1496,17 +1681,17 @@ sub displaymessage {
$r->print(' ');
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'});
+ &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
# Functions
$r->print(''.&mt('Functions').': '.
- ''.&mt('Reply').' '.
- ''.&mt('Forward').' '.
- ''.&mt('Mark Unread').' '.
- ''.&mt('Delete').' '.
''.
$content{'baseurl'}.' ('.&Apache::lonnet::gettitle($content{'baseurl'}).') ':'').
@@ -1605,13 +1790,12 @@ sub header {
my $extra = &Apache::loncommon::studentbrowser_javascript();
if ($baseurl) {
- $extra .= " ";
+ $extra .= " ";
}
$r->print(&Apache::loncommon::start_page('Communication and Messages',
- $extra));
+ $extra));
$r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,($title?$title:'Communication and Messages')));
-
+ (($title?$title:'Communication and Messages')));
}
# ---------------------------------------------------------------- Print header
@@ -1630,27 +1814,27 @@ sub storecomment {
my ($r)=@_;
my $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});
my $cleanmsgtxt='';
- foreach (split(/[\n\r]/,$msgtxt)) {
- unless ($_=~/^\s*(\>|\>\;)/) {
- $cleanmsgtxt.=$_."\n";
+ foreach my $line (split(/[\n\r]/,$msgtxt)) {
+ unless ($line=~/^\s*(\>|\>\;)/) {
+ $cleanmsgtxt.=$line."\n";
}
}
- my $key=&Apache::lonnet::escape($env{'form.baseurl'}).'___'.time;
+ my $key=&escape($env{'form.baseurl'}).'___'.time;
&Apache::lonnet::put('nohist_stored_comments',{ $key => $cleanmsgtxt });
}
sub storedcommentlisting {
my ($r)=@_;
my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
- '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($env{'form.showcommentbaseurl'})));
+ '^'.&escape(&escape($env{'form.showcommentbaseurl'})));
$r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,
{'onlybody' => 1}));
if ((keys %msgs)[0]=~/^error\:/) {
$r->print(&mt('No stored comments yet.'));
} else {
my $found=0;
- foreach (sort keys %msgs) {
- $r->print("\n".$msgs{$_}." ");
+ foreach my $key (sort(keys(%msgs))) {
+ $r->print("\n".$msgs{$key}." ");
$found=1;
}
unless ($found) {
@@ -1667,8 +1851,20 @@ sub sendoffmail {
my $sendstatus='';
my %specialmsg_status;
my $numspecial = 0;
+ my ($cdom,$cnum,$group);
+ if (exists($env{'form.group'})) {
+ $group = $env{'form.group'};
+ }
+ if (exists($env{'request.course.id'})) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ }
if ($env{'form.send'}) {
- &printheader($r,'','Messages being sent.');
+ if ($group eq '') {
+ &printheader($r,'','Messages being sent.');
+ } else {
+ $r->print(&groupmail_header('sending',$group));
+ }
$r->rflush();
my %content=();
undef %content;
@@ -1687,28 +1883,47 @@ sub sendoffmail {
&statuschange($msgid,'replied',$folder);
}
+ my @to =
+ &Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
+ my $mode = $env{'form.sendmode'};
+
my %toaddr;
- if ($env{'form.sendmode'} eq 'group') {
- foreach my $address (keys(%env)) {
- if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
- $toaddr{$1}='';
+ if (@to) {
+ foreach my $dest (@to) {
+ my ($user,$domain) = split(/:/, $dest);
+ if (($user ne '') && ($domain ne '')) {
+ my $address = $user.":".$domain; # How the code below expects it.
+ $toaddr{$address} = '';
}
}
+ }
+
+ if ($env{'form.sendmode'} eq 'group') {
+ foreach my $address (keys(%env)) {
+ if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
+ $toaddr{$1}='';
+ }
+ }
} elsif ($env{'form.sendmode'} eq 'upload') {
foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
- my ($rec,$txt)=split(/\s*\:\s*/,$line);
+ my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/);
if ($txt) {
- $rec=~s/\@/\:/;
+ $rec =~ s/^\s+//;
+ $rec =~ ~s/\s+$//;
$toaddr{$rec}.=$txt."\n";
}
}
} else {
- $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
+ $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ }
}
if ($env{'form.additionalrec'}) {
- foreach (split(/\,/,$env{'form.additionalrec'})) {
- my ($auname,$audom)=split(/\@/,$_);
- $toaddr{$auname.':'.$audom}='';
+ foreach my $rec (split(/\,/,$env{'form.additionalrec'})) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ }
}
}
@@ -1775,22 +1990,20 @@ sub sendoffmail {
$subj_prefix = 'Broadcast.';
}
my ($specialmsgid,$specialresult);
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $course_str = &Apache::lonnet::escape('['.$cnum.':'.$cdom.']');
+ my $course_str = &escape('['.$cnum.':'.$cdom.']');
if ($numspecial) {
$specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.
' '.$course_str,$savemsg,undef,undef,undef,
undef,undef,\$specialmsgid);
- $specialmsgid = &Apache::lonnet::unescape($specialmsgid);
+ $specialmsgid = &unescape($specialmsgid);
}
if ($specialresult eq 'ok') {
my $record_sent;
my @recusers;
my @recudoms;
my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
- split(/\:/,&Apache::lonnet::unescape($specialmsgid));
+ split(/\:/,&unescape($specialmsgid));
foreach my $recipient (sort(keys(%toaddr))) {
if ($specialmsg_status{$recipient} eq 'ok') {
@@ -1832,12 +2045,15 @@ sub sendoffmail {
$r->print(''.&mt('Completed.').' ');
if ($env{'form.displayedcrit'}) {
&discrit($r);
+ }
+ if ($group ne '') {
+ $r->print(&groupmail_sent($group,$cdom,$cnum));
} else {
&Apache::loncommunicate::menu($r);
}
} else {
$r->print(''.&mt('Could not deliver message').' '.
- &mt('Please use the browser "Back" button and correct the recipient addresses').'
');
+ &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'');
}
}
@@ -1858,7 +2074,7 @@ sub handler {
['display','replyto','forward','markread','markdel','markunread',
'sendreply','compose','sendmail','critical','recname','recdom',
'recordftf','sortedby','block','folder','startdis','interdis',
- 'showcommentbaseurl','dismode']);
+ 'showcommentbaseurl','dismode','group','subject','text','ref']);
$sqs='&sortedby='.$env{'form.sortedby'};
# ------------------------------------------------------ They checked for email
@@ -1880,7 +2096,7 @@ sub handler {
unless ($folder) {
$folder='';
} else {
- $sqs.='&folder='.&Apache::lonnet::escape($folder);
+ $sqs.='&folder='.&escape($folder);
}
# ------------------------------------------------------------ Get Display Mode
@@ -1888,7 +2104,7 @@ sub handler {
unless ($dismode) {
$dismode='';
} else {
- $sqs.='&dismode='.&Apache::lonnet::escape($dismode);
+ $sqs.='&dismode='.&escape($dismode);
}
# --------------------------------------------------------------------- Display
@@ -1924,19 +2140,23 @@ sub handler {
&compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode);
} elsif ($env{'form.confirm'}) {
&printheader($r,'','Confirmed Receipt');
- foreach (keys %env) {
- if ($_=~/^form\.rec\_(.*)$/) {
+ my $replying = 0;
+ foreach my $envkey (keys(%env)) {
+ if ($envkey=~/^form\.rec\_(.*)$/) {
$r->print(''.&mt('Confirming Receipt').': '.
&Apache::lonmsg::user_crit_received($1).' ');
}
- if ($_=~/^form\.reprec\_(.*)$/) {
+ if ($envkey=~/^form\.reprec\_(.*)$/) {
my $msgid=$1;
$r->print(''.&mt('Confirming Receipt').': '.
&Apache::lonmsg::user_crit_received($msgid).' ');
&compout($r,'','','',$msgid);
+ $replying = 1;
}
}
- &discrit($r);
+ if (!$replying) {
+ &discrit($r);
+ }
} elsif ($env{'form.critical'}) {
&printheader($r,'','Displaying Critical Messages');
&discrit($r);
@@ -1958,7 +2178,7 @@ sub handler {
foreach my $key (keys(%env)) {
if ($key=~/^form\.delmark_(.*)$/) {
my ($result,$msg) =
- &movemsg(&Apache::lonnet::unescape($1),$folder,
+ &movemsg(&unescape($1),$folder,
$env{'form.movetofolder'});
if ($result) {
$total++;
@@ -1985,7 +2205,7 @@ sub handler {
foreach my $key (keys(%env)) {
if ($key=~/^form\.delmark_(.*)$/) {
my ($result,$msg) =
- &statuschange(&Apache::lonnet::unescape($1),'deleted',
+ &statuschange(&unescape($1),'deleted',
$folder);
if ($result) {
$total++;
@@ -2022,15 +2242,17 @@ sub handler {
&sendoffmail($r,$folder);
if ($env{'form.storebasecomment'}) {
&storecomment($r);
- }
+ }
if (($env{'form.rsspost'}) && ($env{'request.course.id'})) {
- &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},
+ &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},
$env{'course.'.$env{'request.course.id'}.'.domain'},
'Course_Announcements',
$env{'form.subject'},
$env{'form.message'},'/adm/communicate','public');
}
- &disall($r,($folder?$folder:$dismode));
+ if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) {
+ &disall($r,($folder?$folder:$dismode));
+ }
} elsif ($env{'form.newfolder'}) {
&printheader($r,'','New Folder');
&makefolder($env{'form.newfolder'});
@@ -2058,9 +2280,3 @@ sub handler {
__END__
-
-
-
-
-
-