--- loncom/interface/lonmsgdisplay.pm 2006/06/29 13:52:19 1.35 +++ loncom/interface/lonmsgdisplay.pm 2006/11/23 16:40:17 1.42 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.35 2006/06/29 13:52:19 albertel Exp $ +# $Id: lonmsgdisplay.pm,v 1.42 2006/11/23 16:40:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -270,12 +270,14 @@ sub discourse { &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'}); unshift @$current_members, (@$course_personnel); my %defaultUsers; + + $result .= ''."\n"; - $result = &Apache::lonselstudent::render_student_list($current_members, - "compemail", - "current", - \%defaultUsers, - 1,"selectedusers",1); + $result .= &Apache::lonselstudent::render_student_list($current_members, + "compemail", + "current", + \%defaultUsers, + 1,"selectedusers",1); $result .= &Apache::lonselstudent::render_student_list($expired_members, "compemail", @@ -290,6 +292,191 @@ sub discourse { return $result; } +sub disgroup { + my ($cdom,$cnum,$group,$viewgrps,$editgrps) = @_; + my $result; + # Needs to be in a course + if (!($env{'request.course.fn'})) { + $result = &mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.'); + return $result; + } + if ($cdom eq '' || $cnum eq '') { + $result = &mt('Error: could not determine domain or number of course'); + return $result; + } + my ($memberinfo,$numitems) = + &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]); + my @statustypes = ('active'); + if ($viewgrps || $editgrps) { + push(@statustypes,('future','previous')); + } + if (keys(%{$memberinfo}) == 0) { + $result = &mt('As this group has no members, there are no '. + 'recipients to select.'); + return $result; + } else { + $result = &mt('Select message recipients from the group members listed below.
'); + my %Sortby = ( + active => {}, + previous => {}, + future => {}, + ); + my %lt = &Apache::lonlocal::texthash( + 'name' => 'Name', + 'usnm' => 'Username', + 'doma' => 'Domain', + 'active' => 'Active Members', + 'previous' => 'Former Members', + 'future' => 'Future Members', + ); + foreach my $user (sort(keys(%{$memberinfo}))) { + my $status = $$memberinfo{$user}{status}; + if ($env{'form.'.$status.'.sortby'} eq 'fullname') { + push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user); + } elsif ($env{'form.'.$status.'.sortby'} eq 'username') { + push(@{$Sortby{$status}{$$memberinfo{$user}{uname}}},$user); + } elsif ($env{'form.'.$status.'.sortby'} eq 'domain') { + push(@{$Sortby{$status}{$$memberinfo{$user}{udom}}},$user); + } else { + push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user); + } + } + $result .= &group_check_uncheck(); + $result .= ''. + ''; + foreach my $status (@statustypes) { + if (ref($numitems) eq 'HASH') { + if ((defined($$numitems{$status})) && ($$numitems{$status})) { + $result.='". + "". + "". + &Apache::loncommon::end_data_table_header_row(); + foreach my $key (sort(keys(%{$Sortby{$status}}))) { + foreach my $user (@{$Sortby{$status}{$key}}) { + $result .= + &Apache::loncommon::start_data_table_row(). + ''. + ''. + ''. + &Apache::loncommon::end_data_table_row(); + } + } + $result .= &Apache::loncommon::end_data_table(); + } + } + $result .= ''; + } + $result .= '
'. + '
'.$lt{$status}. + ''. + ''. + '  '. + ''. + '

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(); + $result .= "
$lt{'name'}$lt{'usnm'}$lt{'doma'}'. + $$memberinfo{$user}{'fullname'}.''.$$memberinfo{$user}{'uname'}.''.$$memberinfo{$user}{'udom'}.'  
'; + } + return $result; +} + +sub group_check_uncheck { + my $output = qq| + + |; +} + +sub groupmail_header { + my ($action,$group,$cdom,$cnum) = @_; + my ($description,$refarg); + if (!$cdom || !$cnum) { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + if (exists($env{'form.ref'})) { + $refarg = 'ref='.$env{'form.ref'}; + } + if (!$group) { + $group = $env{'form.group'}; + } + if ($group eq '') { + return ''; + } else { + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group); + if (defined($curr_groups{$group})) { + my %groupinfo = + &Apache::longroup::get_group_settings($curr_groups{$group}); + $description = &unescape($groupinfo{'description'}); + } + } + &Apache::lonhtmlcommon::clear_breadcrumbs(); + if ($refarg) { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/coursegroups", + text=>"Groups", + title=>"View course groups"}); + } + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg", + text=>"Group: $description", + title=>"Go to group's home page"}, + {href=>"/adm/email?compose=group&group=". + "$env{'form.group'}&$refarg", + text=>"Send a Message in a Group", + title=>"Compose Group Email Message"},); + if ($action eq 'sending') { + &Apache::lonhtmlcommon::add_breadcrumb + ({text=>"Messages being sent.", + title=>"Messages sent"},); + } + my $groupheader = &Apache::loncommon::start_page('Group Email'); + $groupheader .= &Apache::lonhtmlcommon::breadcrumbs + ('Group - '.$env{'form.group'}.' Email'); + return $groupheader; +} + +sub groupmail_sent { + my ($group,$cdom,$cnum) = @_; + my $refarg; + if (exists($env{'form.ref'})) { + $refarg = 'ref='.$env{'form.ref'}; + } + my $output .= '

'. + &mt('Send another group email').''.'   '. + ''. &mt('Return to group page').''; + return $output; +} + # ==================================================== Display Critical Message sub discrit { @@ -299,8 +486,8 @@ sub discrit { ''; my %what=&Apache::lonnet::dump('critical'); my $result = ''; - foreach (sort keys %what) { - my %content=&Apache::lonmsg::unpackagemsg($what{$_}); + foreach my $key (sort(keys(%what))) { + my %content=&Apache::lonmsg::unpackagemsg($what{$key}); next if ($content{'senderdomain'} eq ''); $result.='
'.&mt('From').': '. &Apache::loncommon::aboutmewrapper( @@ -313,14 +500,14 @@ $content{'sendername'}.':'. ''. &mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox'). '
'. - ''. - ''. + ''; } # Check to see if there were any messages. if ($result eq '') { $result = "

".&mt('You have no critical messages.')."

". - ''.&mt('Select a course or group').'
'. + ''.&mt('Select a course').'
'. ''.&mt('Communicate').''; } else { $r->print($header); @@ -471,8 +658,8 @@ sub disnew { my %status_cache = &Apache::lonnet::get('email_status',\@msgids); my %descriptions; - foreach (@msgids) { - my $msgid=&escape($_); + foreach my $id (@msgids) { + my $msgid=&escape($id); my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)= &Apache::lonmsg::unpackmsgid($msgid,undef,undef,\%status_cache); if (defined($sendtime) && $sendtime!~/error/) { @@ -481,7 +668,7 @@ sub disnew { $sendtime = &Apache::lonlocal::locallocaltime($sendtime); if ($status eq 'new') { if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) { - $blocked{$_} = 'ON'; + $blocked{$id} = 'ON'; $numblocked ++; } else { push @newmsgs, { @@ -507,8 +694,8 @@ TABLEHEAD $lt{'op'} ENDLINK - foreach ('sendtime','from','fromdom','shortsub','course') { - $r->print("$msg->{$_}"); + foreach my $item ('sendtime','from','fromdom','shortsub','course') { + $r->print("$msg->{$item}"); } $r->print(""); } @@ -579,7 +766,7 @@ sub disfolder { ENDDISHEADER my $fsqs='&folder='.$folder; - my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder); + my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder); my $totalnumber=$#temp+1; unless ($totalnumber>0) { $r->print('

'.&mt('Empty Folder').'

'); @@ -709,8 +896,14 @@ ENDDISHEADER sub compout { my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_; my $suffix=&Apache::lonmsg::foldersuffix($folder); - - if ($broadcast eq 'individual') { + my ($cdom,$cnum,$group,$refarg); + if (exists($env{'form.group'})) { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $group = $env{'form.group'}; + my $action = 'composing'; + $r->print(&groupmail_header($action,$group,$cdom,$cnum)); + } elsif ($broadcast eq 'individual') { &printheader($r,'/adm/email?compose=individual', 'Send a Message'); } elsif ($broadcast) { @@ -802,15 +995,34 @@ sub compout { } } my $citation=&displayresource(%content); + my ($can_grp_broadcast,$viewgrps,$editgrps); if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; } if ($env{'form.text'}) { $dismsg=$env{'form.text'}; } if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; } $r->print( '
'."\n". - ''."\n". - ''); - unless (($broadcast eq 'group') || ($broadcast eq 'upload')) { + ''."\n"); + if ($broadcast eq 'group' && $env{'form.group'} ne '') { + $can_grp_broadcast = + &Apache::lonnet::allowed('sgb',$env{'request.course.id'}.'/'. + $group); + $viewgrps = + &Apache::lonnet::allowed('vcg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + $editgrps = + &Apache::lonnet::allowed('mdg',$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + if ($viewgrps || $editgrps || $can_grp_broadcast) { + $r->print(&disgroup($cdom,$cnum,$group,$viewgrps,$editgrps)); + } + } + $r->print('
'); + if (($broadcast eq 'group') && ($group ne '') && + (!$can_grp_broadcast && !$viewgrps && !$editgrps)) { + $r->print(&recipient_input_row($cdom,%lt)); + } + if (($broadcast ne 'group') && ($broadcast ne 'upload')) { if ($replying) { $r->print(''); } else { - my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain'); - my $selectlink=&Apache::loncommon::selectstudent_link - ('compemail','recuname','recdomain'); - $r->print(<<"ENDREC"); - - - -ENDREC + $r->print(&recipient_input_row($defdom,%lt)); } } my $latexHelp = Apache::loncommon::helpLatexCheatsheet(); @@ -850,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(< @@ -879,9 +1092,13 @@ $dispcrit ENDUPLOAD } if ($broadcast eq 'group') { - &discourse($r); - my $studentsel = &discourse(); - $r->print($studentsel); + if ($group eq '') { + my $studentsel = &discourse(); + $r->print($studentsel); + } + } + if ($env{'form.displayedcrit'}) { + $r->print(''); } $r->print(''. &Apache::lonfeedback::generate_preview_button('compemail','message'). @@ -890,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"; + + + +ENDREC + return $output; +} + sub retrieve_instructor_comments { my ($user,$domain)=@_; my $target=$env{'form.grade_target'}; @@ -904,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'}); @@ -932,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/) { @@ -1156,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) { @@ -1357,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) = @@ -1559,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 - (($title?$title:'Communication and Messages'))); - + (($title?$title:'Communication and Messages'))); } # ---------------------------------------------------------------- Print header @@ -1584,9 +1814,9 @@ 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=&escape($env{'form.baseurl'}).'___'.time; @@ -1603,8 +1833,8 @@ sub storedcommentlisting { $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) { @@ -1621,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; @@ -1642,7 +1884,7 @@ sub sendoffmail { } my @to = - &Apache::loncommon::get_env_multiple('form.selectedusers.forminput'); + &Apache::loncommon::get_env_multiple('form.selectedusers_forminput'); my $mode = $env{'form.sendmode'}; my %toaddr; @@ -1676,8 +1918,8 @@ sub sendoffmail { } } if ($env{'form.additionalrec'}) { - foreach (split(/\,/,$env{'form.additionalrec'})) { - my ($auname,$audom)=split(/\@/,$_); + foreach my $rec (split(/\,/,$env{'form.additionalrec'})) { + my ($auname,$audom)=split(/\@/,$rec); if (($auname ne "") && ($audom ne "")) { $toaddr{$auname.':'.$audom}=''; } @@ -1747,8 +1989,6 @@ 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 = &escape('['.$cnum.':'.$cdom.']'); if ($numspecial) { @@ -1804,6 +2044,9 @@ 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); } @@ -1830,7 +2073,7 @@ sub handler { ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', 'recordftf','sortedby','block','folder','startdis','interdis', - 'showcommentbaseurl','dismode','group','subject','text']); + 'showcommentbaseurl','dismode','group','subject','text','ref']); $sqs='&sortedby='.$env{'form.sortedby'}; # ------------------------------------------------------ They checked for email @@ -1896,19 +2139,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); @@ -1994,15 +2241,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'}); @@ -2030,9 +2279,3 @@ sub handler { __END__ - - - - - -
'.&mt('Replying to').' '. &Apache::loncommon::aboutmewrapper( @@ -821,14 +1033,7 @@ sub compout { ''. '
$lt{'us'}:$selectlink
$lt{'do'}:$domform
$lt{'us'}:$selectlink
$lt{'do'}:$domform