Annotation of loncom/interface/grouproster.pm, revision 1.2

1.1       raeburn     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;
1.2     ! raeburn    34: use LONCAPA;
1.1       raeburn    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: 
1.2     ! raeburn    81:     my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
        !            82:     if (!defined($curr_groups{$group})) {
1.1       raeburn    83:         $r->print(&mt('[_1] is not the name of a valid [_2] in this [_3].',
                     84:                       $group,$gpterm,lc($crstype)));
1.2     ! raeburn    85:         return OK;
1.1       raeburn    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:     }
1.2     ! raeburn   101:     my %content = &Apache::longroup::get_group_settings($curr_groups{$group});
1.1       raeburn   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
1.2     ! raeburn   131:         ({href=>"/adm/$cdom/$cnum/$group/smppg",
1.1       raeburn   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}) {
1.2     ! raeburn   206:                 $r->print(&mt('There are no [_1]s to display in this [_2].',
        !           207:                               lc($lt{$key}),$gpterm));
1.1       raeburn   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>