[LON-CAPA-cvs] cvs: loncom /interface lonmsgdisplay.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Mon, 17 Jul 2006 21:38:10 -0000


This is a MIME encoded message

--raeburn1153172290
Content-Type: text/plain

raeburn		Mon Jul 17 17:38:10 2006 EDT

  Modified files:              
    /loncom/interface	lonmsgdisplay.pm 
  Log:
  Group members with sgb privilege can broadcast e-mail to a group and can select from a list of group members to receive the e-mail.  Those with only sgm privilege can enter username:domain of recipient(s), but will not get a list to pick from.  
  
  
--raeburn1153172290
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20060717173810.txt"

Index: loncom/interface/lonmsgdisplay.pm
diff -u loncom/interface/lonmsgdisplay.pm:1.37 loncom/interface/lonmsgdisplay.pm:1.38
--- loncom/interface/lonmsgdisplay.pm:1.37	Mon Jul 17 12:26:09 2006
+++ loncom/interface/lonmsgdisplay.pm	Mon Jul 17 17:38:07 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging display
 #
-# $Id: lonmsgdisplay.pm,v 1.37 2006/07/17 16:26:09 raeburn Exp $
+# $Id: lonmsgdisplay.pm,v 1.38 2006/07/17 21:38:07 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -290,6 +290,194 @@
     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.<br />');  
+        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 .= '<table border="0" cellspacing="8" cellpadding="2">'.
+                   '<tr>';
+        foreach my $status (@statustypes)  {
+            if (ref($numitems) eq 'HASH') {
+                if ((defined($$numitems{$status})) && ($$numitems{$status})) {
+                    $result.='<td align="top">'.
+                             '<fieldset><legend><b>'.$lt{$status}.
+                             '</b></legend><nobr>'.
+                             '<input type="button" value="check all" '.
+                             'onclick="javascript:toggleAll('."'".$status."','check'".')" />'.
+                             '&nbsp;&nbsp;'.
+                             '<input type="button" value="uncheck all" '.
+                             'onclick="javascript:toggleAll('."'".$status."','uncheck'".')" />'.
+                             '</nobr></fieldset><br />'.
+                             &Apache::loncommon::start_data_table().
+                             &Apache::loncommon::start_data_table_header_row();
+                    $result .= "<th><a href=\"javascript:changeSort('fullname')\">".
+                    "$lt{'name'}</a></th>".
+                    "<th><a href=\"javascript:changeSort('username')\">".
+                    "$lt{'usnm'}</a></th>".
+                    "<th><a href=\"javascript:changeSort('domain')\">".
+                    "$lt{'doma'}</a></th>".
+                    &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().
+                                '<td><input type="checkbox" '.
+                                'name="selectedusers_forminput" value="'.
+                                $user.':'.$status.'" />'.
+                                $$memberinfo{$user}{'fullname'}.'</td>'.
+                                '<td>'.$$memberinfo{$user}{'uname'}.'</td>'.
+                                '<td>'.$$memberinfo{$user}{'udom'}.'</td>'.
+                                &Apache::loncommon::end_data_table_row();
+                        }
+                    }
+                    $result .= &Apache::loncommon::end_data_table();
+                }
+            }
+            $result .= '</td><td>&nbsp;&nbsp;</td>';
+        }
+        $result .= '</tr></table>';
+    }
+    return $result;
+}
+
+sub group_check_uncheck {
+    my $output = qq|
+<script type="text/javascript">
+function toggleAll(caller,action) {
+    var pattern = new RegExp(":"+caller+"\$");
+    if (typeof(document.compemail.selectedusers_forminput.length)=="undefined") {
+        if (document.compemail.selectedusers_forminput.value.match(pattern)) {
+            if (action == 'check') {
+                document.groupmail.selectedusers_forminput.checked = true;
+            } else {
+                document.groupmail.selectedusers_forminput.checked = false;
+            }
+        }
+    } else {
+        for (var i=0; i<document.compemail.selectedusers_forminput.length; i++) {
+            if (document.compemail.selectedusers_forminput[i].value.match(pattern)) {
+                if (action == 'check') {
+                    document.compemail.selectedusers_forminput[i].checked = true;
+                } else {
+                    document.compemail.selectedusers_forminput[i].checked = false;
+                }
+            }
+        }
+    }
+}
+</script>
+    |;
+}
+
+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&amp;group=".
+                "$env{'form.group'}&amp;$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 .= '<br /><br /><a href="/adm/email?compose=group&amp;group='.
+                  $group.'&amp;'.$refarg.'">'.
+                  &mt('Send another group email').'</a>'.'&nbsp;&nbsp;&nbsp;'.
+                  '<a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?'.
+                  $refarg.'">'. &mt('Return to group page').'</a>';
+    return $output;
+}
+
 # ==================================================== Display Critical Message
 
 sub discrit {
@@ -320,7 +508,7 @@
     # Check to see if there were any messages.
     if ($result eq '') {
         $result = "<h2>".&mt('You have no critical messages.')."</h2>".
-	    '<a href="/adm/roles">'.&mt('Select a course or group').'</a><br />'.
+	    '<a href="/adm/roles">'.&mt('Select a course').'</a><br />'.
             '<a href="/adm/email">'.&mt('Communicate').'</a>';
     } else {
         $r->print($header);
@@ -709,8 +897,14 @@
 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 +996,35 @@
 	}
     }
     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(
                 '<form action="/adm/email"  name="compemail" method="post"'.
                 ' enctype="multipart/form-data">'."\n".
-                '<input type="hidden" name="sendmail" value="on" />'."\n".
-                '<table>');
-    unless (($broadcast eq 'group') || ($broadcast eq 'upload')) {
+                '<input type="hidden" name="sendmail" value="on" />'."\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('<table>');
+    if (($broadcast eq 'group') && ($group ne '') && 
+        (!$can_grp_broadcast && !$viewgrps && !$editgrps)) {
+        print STDERR "$broadcast AND $env{'form.group'} AND $can_grp_broadcast\n";
+        $r->print(&recipient_input_row($cdom,%lt));
+    } 
+    if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
 	if ($replying) {
 	    $r->print('<tr><td colspan="2">'.&mt('Replying to').' '.
 		      &Apache::loncommon::aboutmewrapper(
@@ -821,14 +1035,7 @@
 		      '<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'.
 		      '</td></tr>');
 	} else {
-	    my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain');
-	    my $selectlink=&Apache::loncommon::selectstudent_link
-	    ('compemail','recuname','recdomain');
-	    $r->print(<<"ENDREC");
-<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr>
-<tr><td>$lt{'do'}:</td>
-<td>$domform</td></tr>
-ENDREC
+            $r->print(&recipient_input_row($defdom,%lt));
         }
     }
     my $latexHelp = Apache::loncommon::helpLatexCheatsheet();
@@ -850,6 +1057,14 @@
 <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />
 $citation
 ENDCOMP
+        if (exists($env{'form.ref'})) {
+            $r->print('<input type="hidden" name="ref" value="'.
+                      $env{'form.ref'}.'" />');
+        }
+        if (exists($env{'form.group'})) {
+            $r->print('<input type="hidden" name="group" value="'.
+                      $env{'form.group'}.'" />');
+        }
     } else { # $broadcast is 'upload'
 	$r->print(<<ENDUPLOAD);
 <input type="hidden" name="sendmode" value="upload" />
@@ -879,9 +1094,10 @@
 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('<input type="hidden" name="displayedcrit" value="true" />');
@@ -893,6 +1109,20 @@
 
 # ---------------------------------------------------- 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";
+<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr>
+<tr><td>$lt{'do'}:</td>
+<td>$domform</td></tr>
+ENDREC
+    return $output;
+}
+
 sub retrieve_instructor_comments {
     my ($user,$domain)=@_;
     my $target=$env{'form.grade_target'};
@@ -1565,10 +1795,9 @@
 	$extra .= "<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />";
     }
     $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
@@ -1624,8 +1853,20 @@
     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;
@@ -1750,8 +1991,6 @@
                 $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) {
@@ -1807,6 +2046,9 @@
 	$r->print('<br /><span class="LC_success">'.&mt('Completed.').'</span>');
 	if ($env{'form.displayedcrit'}) {
 	    &discrit($r);
+        }
+        if ($group ne '') {
+            $r->print(&groupmail_sent($group,$cdom,$cnum)); 
 	} else {
 	    &Apache::loncommunicate::menu($r);
 	}
@@ -1833,7 +2075,7 @@
         ['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
@@ -2001,15 +2243,15 @@
 	&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');
 	}
-	if (!$env{'form.displayedcrit'}) {
+	if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) {
 	    &disall($r,($folder?$folder:$dismode));
 	}
     } elsif ($env{'form.newfolder'}) {
@@ -2039,9 +2281,3 @@
 
 __END__
 
-
-
-
-
-
-

--raeburn1153172290--