File:  [LON-CAPA] / loncom / interface / grouproster.pm
Revision 1.2: download - view: text, annotated - select for diffs
Sat Jul 8 00:59:22 2006 UTC (17 years, 10 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
group homepage is now smppg instead of grppg in breadcrumbs link. Also list of groups retrieved from longroup::coursegroups() instead of environment var so it is current.

    1: # The LearningOnline Network with CAPA
    2: #
    3: # Copyright Michigan State University Board of Trustees
    4: #
    5: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    6: #
    7: # LON-CAPA is free software; you can redistribute it and/or modify
    8: # it under the terms of the GNU General Public License as published by
    9: # the Free Software Foundation; either version 2 of the License, or
   10: # (at your option) any later version.
   11: #
   12: # LON-CAPA is distributed in the hope that it will be useful,
   13: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   14: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   15: # GNU General Public License for more details.
   16: #
   17: # You should have received a copy of the GNU General Public License
   18: # along with LON-CAPA; if not, write to the Free Software
   19: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   20: #
   21: # /home/httpd/html/adm/gpl.txt
   22: #
   23: # http://www.lon-capa.org/
   24: #
   25: 
   26: package Apache::grouproster;
   27:                                                                                  
   28: use strict;
   29: use Apache::lonnet;
   30: use Apache::loncommon;
   31: use Apache::lonhtmlcommon;
   32: use Apache::lonlocal;
   33: use Apache::longroup;
   34: use LONCAPA;
   35: use Apache::Constants qw(:common :http);
   36: use lib '/home/httpd/lib/perl/';
   37: 
   38: sub handler {
   39:     my ($r) = @_;
   40:     &Apache::loncommon::content_type($r,'text/html');
   41:     $r->send_http_header;
   42:                                                                                  
   43:     if ($r->header_only) {
   44:         return OK;
   45:     }
   46:                                                                                  
   47:     #  Needs to be in a course
   48:     if (! ($env{'request.course.fn'})) {
   49:         # Not in a course
   50:         $env{'user.error.msg'}=
   51:      "/adm/coursegroups:mdg:0:0:Cannot edit or view course groups";
   52:         return HTTP_NOT_ACCEPTABLE;
   53:     }
   54: 
   55:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['group']); 
   56: 
   57:     my $gpterm  = &Apache::loncommon::group_term();
   58:     my $ucgpterm = $gpterm;
   59:     $ucgpterm =~ s/^(\w)/uc($1)/e;  
   60:     my $crstype = &Apache::loncommon::course_type();
   61:     my $group;
   62: 
   63:     if ((!defined($env{'form.group'})) || ($env{'form.group'} eq '')) {
   64:         $r->print(&mt('No [_1] name provided',$gpterm));
   65:                                                                                    
   66:     } else {
   67:         $group = $env{'form.group'};
   68:         $group =~ s/\W//g;
   69:     }
   70:     if ($group eq '') {
   71:         $r->print(&mt('Invalid [_1] name provided',$gpterm));
   72:     }
   73: 
   74:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
   75:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   76: 
   77:     if ($cdom eq '' || $cnum eq '') {
   78:         $r->print(&mt('Invalid [_1]',$crstype));
   79:     }
   80: 
   81:     my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
   82:     if (!defined($curr_groups{$group})) {
   83:         $r->print(&mt('[_1] is not the name of a valid [_2] in this [_3].',
   84:                       $group,$gpterm,lc($crstype)));
   85:         return OK;
   86:     } 
   87: 
   88:     &Apache::lonhtmlcommon::clear_breadcrumbs();
   89: 
   90:     my $can_view = &Apache::lonnet::allowed('vgm',$env{'request.course.id'}.
   91:                                             '/'.$group);
   92:     my $view_details = &Apache::lonnet::allowed('vmd',$env{'request.course.id'}.'/'.$group);
   93: 
   94:     my $viewgrps = &Apache::lonnet::allowed('vcg',$env{'request.course.id'});
   95:     my $editgrps = &Apache::lonnet::allowed('mdg',$env{'request.course.id'});
   96: 
   97:     if ((!$can_view) && (!$view_details) && (!$viewgrps) && (!$editgrps)) {
   98:         $r->print(&mt('You do not have privileges to view the membership roster in this [_1]',$gpterm));
   99:         return OK;
  100:     }
  101:     my %content = &Apache::longroup::get_group_settings($curr_groups{$group});
  102:     my $description = &unescape($content{'description'});
  103:     $r->print(&roster_header($cdom,$cnum,$group,$description,$gpterm,$ucgpterm));
  104: 
  105:     my $available;
  106:     foreach my $tool (sort(keys(%{$content{'functions'}}))) {
  107:         if ($content{functions}{$tool} eq 'on') {
  108:             push(@{$available},$tool);
  109:         }
  110:     }
  111: 
  112:     &roster_table($r,$cdom,$cnum,$group,$can_view,$view_details,$viewgrps,
  113:                   $editgrps,$available,$gpterm,$ucgpterm);
  114: 
  115:     $r->print(&Apache::loncommon::end_page());
  116:     return OK;
  117: }
  118: 
  119: sub roster_header {
  120:     my ($cdom,$cnum,$group,$description,$gpterm,$ucgpterm) = @_;
  121:     my $jscript = qq|
  122: function changeSort(caller) {
  123:     document.grouproster.sortby.value = caller;
  124:     document.grouproster.submit();
  125: }\n|;
  126:     my $output =
  127:         &Apache::loncommon::start_page(&mt('[_1] Membership ',$ucgpterm),
  128:                                        '<script type="text/javascript">'.
  129:                                        $jscript.'</script>');
  130:     &Apache::lonhtmlcommon::add_breadcrumb
  131:         ({href=>"/adm/$cdom/$cnum/$group/smppg",
  132:           text=>"$ucgpterm: $description",
  133:           title=>"Go to group's home page"},
  134:          {href=>"/adm/grouproster?group=$group",
  135:           text=>"Membership roster",
  136:           title=>"Display group membership"},);
  137:     $output .= &Apache::lonhtmlcommon::breadcrumbs(&mt('[_1] membership status - [_2]',$gpterm,$description));
  138:     return $output;
  139: }
  140: 
  141: sub roster_table {
  142:     my ($r,$cdom,$cnum,$group,$can_view,$view_details,$viewgrps,$editgrps,
  143:         $available,$gpterm,$ucgpterm) = @_;
  144: 
  145:     my $fixedprivs = &Apache::longroup::get_fixed_privs();
  146: 
  147:     my ($memberinfo,$hastools,$addtools,$numitems) = 
  148:         &Apache::longroup::group_memberlist($cdom,$cnum,$group,$fixedprivs,
  149:                                             $available);
  150:     my (%tooltype,$toolprivs);
  151: 
  152:     if ($hastools) {
  153:         $toolprivs = &Apache::longroup::get_tool_privs($gpterm);
  154:         foreach my $tool (sort(keys(%{$toolprivs}))) {
  155:             foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) {
  156:                 $tooltype{$priv} = $tool;
  157:             }
  158:         }
  159:     }
  160:  
  161:     my %lt = &Apache::lonlocal::texthash(
  162:                                          'name'     => 'Name',
  163:                                          'usnm'     => 'Username',
  164:                                          'doma'     => 'Domain',
  165:                                          'stid'     => 'ID',
  166:                                          'stda'     => 'Start Date',
  167:                                          'enda'     => 'End Date',
  168:                                          'func'     => 'Functionality',
  169:                                          'priv'     => 'Privileges', 
  170:                                          'all'      => 'Any Membership status',
  171:                                          'active'   => 'Active Member',
  172:                                          'previous' => 'Former Member',
  173:                                          'future'   => 'Future Member',
  174:                                          'updi'     => 'Update Display',
  175:                                         );
  176:     my $status = $env{'form.status'};
  177:     if (!defined($status)) {
  178:         $status = 'active';
  179:     }
  180:     if (($viewgrps) || ($editgrps) || 
  181:         (&Apache::lonnet::allowed('vmd',$env{'request.course.id'}.'/'.$group))) {
  182:         if (keys(%{$memberinfo}) == 0) {
  183:             $r->print(&mt('There are no membership data to display for this [_1]',
  184:                       $gpterm));  
  185:             return;  
  186:         }  
  187:         $r->print('<br /><form name="rosterstatus" method="post" action="/adm/grouproster">'.&mt('Membership status: ').'<select name="status">');
  188:         foreach my $type ('active','previous','future','all') {
  189:             $r->print('<option value="'.$type.'" ');
  190:             if ($status eq $type) {
  191:                 $r->print('selected="selected"');
  192:             }
  193:             $r->print('>'.$lt{$type}.'</option>');
  194:         }
  195:         $r->print('</select>'."\n".
  196:                   '<input type="submit" name="statusbutton" value="'.
  197:                   $lt{'updi'}.'"><input type="hidden" name="sortby" value="'.
  198:                   $env{'form.sortby'}.'"/>'.
  199:                   '<input type="hidden" name="group" value="'.$group.
  200:                   '"/></form><br /><br />');
  201: 
  202:     }
  203:     if (ref($numitems) eq 'HASH') {
  204:         foreach my $key (keys(%{$numitems})) {
  205:             if ($status eq $key && !$$numitems{$key}) {
  206:                 $r->print(&mt('There are no [_1]s to display in this [_2].',
  207:                               lc($lt{$key}),$gpterm));
  208:                 return;
  209:             }
  210:         }
  211:     }
  212:     $r->print('
  213: <form name="grouproster" action="/adm/grouproster" method="post">
  214:  <input type="hidden" name="group" value="'.$group.'" />
  215:  <input type="hidden" name="sortby" value="'.$env{'form.sortby'}.'" />
  216: ');
  217:     my %Sortby = ();
  218:     my $usercount = 0;
  219:     foreach my $user (sort(keys(%{$memberinfo}))) {
  220:         if ($env{'form.sortby'} eq 'fullname') {
  221:             push(@{$Sortby{$$memberinfo{$user}{fullname}}},$user);
  222:         } elsif ($env{'form.sortby'} eq 'username') {
  223:             push(@{$Sortby{$$memberinfo{$user}{uname}}},$user);
  224:         } elsif ($env{'form.sortby'} eq 'domain') {
  225:             push(@{$Sortby{$$memberinfo{$user}{udom}}},$user);
  226:         } elsif ($env{'form.sortby'} eq 'id') {
  227:             push(@{$Sortby{$$memberinfo{$user}{id}}},$user);
  228:         } else {
  229:             push(@{$Sortby{$$memberinfo{$user}{fullname}}},$user);
  230:         }
  231:     }
  232:     $r->print(&Apache::loncommon::start_data_table());
  233:     $r->print(&members_table_header_row(\%lt,$viewgrps,$editgrps,$view_details,
  234:                                         $hastools));
  235:     foreach my $key (sort(keys(%Sortby))) {
  236:         foreach my $user (@{$Sortby{$key}}) {
  237:             if (($status eq 'all') || 
  238:                 ($status eq $$memberinfo{$user}{status})) {
  239:                 $r->print(&members_table_row($viewgrps,$editgrps,$view_details,
  240:                           $hastools,\%tooltype,$toolprivs,$$memberinfo{$user}));
  241:             }
  242:         }
  243:     }
  244:     $r->print(&Apache::loncommon::end_data_table());
  245:     $r->print('</form>');
  246:     return;
  247: }
  248: 
  249: sub members_table_header_row {
  250:     my ($lt,$viewgrps,$editgrps,$view_details,$hastools) = @_; 
  251:     my $output = &Apache::loncommon::start_data_table_header_row();
  252:     $output .= "<th><a href=\"javascript:changeSort('fullname')\">".
  253:               "$$lt{'name'}</a></th>";
  254:     if ($viewgrps || $editgrps || $view_details ) {
  255:         $output .= "<th><a href=\"javascript:changeSort('username')\">$$lt{'usnm'}</a></th>";
  256:         $output .= "<th><a href=\"javascript:changeSort('domain')\">$$lt{'doma'}</a></th>";
  257:     }
  258:     if ($viewgrps || $editgrps) {
  259:         $output .= "<th><a href=\"javascript:changeSort('id')\">$$lt{'stid'}</a></th>";
  260:     }
  261:     if ($viewgrps || $editgrps || $view_details ) {
  262:         $output .= "<th><a href=\"javascript:changeSort('start')\">$$lt{'stda'}</a></th>";
  263:         $output .= "<th><a href=\"javascript:changeSort('end')\">$$lt{'enda'}</a></th>";
  264:         if ($hastools) {
  265:             if ($viewgrps || $editgrps) {
  266:                 $output .= '<th><b>'.$$lt{'priv'}.'</b></th>';
  267:             } elsif ($view_details) {
  268:                 $output .= '<th><b>'.$$lt{'func'}.'</b></th>';
  269:             }
  270:         }
  271:     }
  272:     $output .= &Apache::loncommon::end_data_table_header_row();
  273:     return $output;
  274: }
  275: 
  276: sub members_table_row {
  277:     my ($viewgrps,$editgrps,$view_details,$hastools,$tooltype,$toolprivs,
  278:         $userinfo) = @_;
  279:     my $output = &Apache::loncommon::start_data_table_row();
  280:     $output .= '<td>'.&Apache::loncommon::aboutmewrapper($$userinfo{'fullname'},
  281:                       $$userinfo{'uname'},$$userinfo{'udom'}  ).
  282:                '</td>';
  283:     if ($viewgrps || $editgrps || $view_details ) {
  284:         $output .= '<td>'.$$userinfo{'uname'}.'</td>';
  285:         $output .= '<td>'.$$userinfo{'udom'}.'</td>';
  286:     }
  287:     if ($viewgrps || $editgrps) {
  288:         $output .= '<td>'.$$userinfo{'id'}.'</td>';
  289:     }
  290:     if ($viewgrps || $editgrps || $view_details) {
  291:         $output .= '<td>'.$$userinfo{'start'}.'</td>';
  292:         $output .= '<td>'.$$userinfo{'end'}.'</td>';
  293:     }
  294:     if ($hastools) {
  295:         if ($viewgrps || $editgrps) {
  296:             my $curr_tool;
  297:             my $privlist;
  298:             foreach my $priv (@{$$userinfo{'privs'}}) {
  299:                 unless ($curr_tool eq $$tooltype{$priv}) {
  300:                     $curr_tool = $$tooltype{$priv};
  301:                     $privlist .= '<b>'.$curr_tool.'</b>: ';
  302:                 }
  303:                 $privlist .= $$toolprivs{$curr_tool}{$priv}.', ';
  304:             }
  305:             $privlist =~ s/, $//;
  306:             $output .= '<td>'.$privlist.'</td>';
  307:         } elsif ($view_details) {
  308:             $output .= '<td><nobr>'.join('&nbsp;&nbsp;&nbsp;',
  309:                       @{$$userinfo{'currtools'}}).'</nobr></td>';
  310:         }
  311:     }
  312:     $output .= &Apache::loncommon::end_data_table_row();
  313:     return $output;
  314: }
  315: 
  316: 1;
  317: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>