Diff for /loncom/auth/lonroles.pm between versions 1.209.4.2 and 1.210

version 1.209.4.2, 2009/09/23 19:42:20 version 1.210, 2008/11/12 20:01:09
Line 27 Line 27
 #  #
 ###  ###
   
   =pod
   
   =head1 NAME
   
   Apache::lonroles - User Roles Screen
   
   =head1 SYNOPSIS
   
   Invoked by /etc/httpd/conf/srm.conf:
   
    <Location /adm/roles>
    PerlAccessHandler       Apache::lonacc
    SetHandler perl-script
    PerlHandler Apache::lonroles
    ErrorDocument     403 /adm/login
    ErrorDocument  500 /adm/errorhandler
    </Location>
   
   =head1 OVERVIEW
   
   =head2 Choosing Roles
   
   C<lonroles> is a handler that allows a user to switch roles in
   mid-session. LON-CAPA attempts to work with "No Role Specified", the
   default role that a user has before selecting a role, as widely as
   possible, but certain handlers for example need specification which
   course they should act on, etc. Both in this scenario, and when the
   handler determines via C<lonnet>'s C<&allowed> function that a certain
   action is not allowed, C<lonroles> is used as error handler. This
   allows the user to select another role which may have permission to do
   what they were trying to do. C<lonroles> can also be accessed via the
   B<CRS> button in the Remote Control. 
   
   =begin latex
   
   \begin{figure}
   \begin{center}
   \includegraphics[width=0.45\paperwidth,keepaspectratio]{Sample_Roles_Screen}
     \caption{\label{Sample_Roles_Screen}Sample Roles Screen} 
   \end{center}
   \end{figure}
   
   =end latex
   
   =head2 Role Initialization
   
   The privileges for a user are established at login time and stored in the session environment. As a consequence, a new role does not become active till the next login. Handlers are able to query for privileges using C<lonnet>'s C<&allowed> function. When a user first logs in, their role is the "common" role, which means that they have the sum of all of their privileges. During a session it might become necessary to choose a particular role, which as a consequence also limits the user to only the privileges in that particular role.
   
   =head1 INTRODUCTION
   
   This module enables a user to select what role he wishes to
   operate under (instructor, student, teaching assistant, course
   coordinator, etc).  These roles are pre-established by the actions
   of upper-level users.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 HANDLER SUBROUTINE
   
   This routine is called by Apache and mod_perl.
   
   =over 4
   
   =item *
   
   Roles Initialization (yes/no)
   
   =item *
   
   Get Error Message from Environment
   
   =item *
   
   Who is this?
   
   =item *
   
   Generate Page Output
   
   =item *
   
   Choice or no choice
   
   =item *
   
   Table
   
   =item *
   
   Privileges
   
   =back
   
   =cut
   
   
 package Apache::lonroles;  package Apache::lonroles;
   
 use strict;  use strict;
Line 548  ENDHEADER Line 645  ENDHEADER
     my $possiblerole='';      my $possiblerole='';
     my %futureroles;      my %futureroles;
     my %roles_nextlogin;      my %roles_nextlogin;
     my %timezones;  
     my $numcourses;  
     if ($env{'user.adv'}) {  
        my %courses = &Apache::lonnet::courseiddump($env{'user.domain'},'.','.','.','.','.',undef,undef,'Course');  
        $numcourses = keys(%courses);  
     }  
     foreach $envkey (sort keys %env) {      foreach $envkey (sort keys %env) {
         my $button = 1;          my $button = 1;
         my $switchserver='';          my $switchserver='';
Line 563  ENDHEADER Line 654  ENDHEADER
             my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);              my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);
             &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);              &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
             next if (!defined($role) || $role eq '' || $role =~ /^gr/);              next if (!defined($role) || $role eq '' || $role =~ /^gr/);
             my $timezone = &role_timezone($where,\%timezones);  
             $tremark='';              $tremark='';
             $tpstart='&nbsp;';              $tpstart='&nbsp;';
             $tpend='&nbsp;';              $tpend='&nbsp;';
             $tfont='#000000';              $tfont='#000000';
             if ($tstart) {              if ($tstart) {
                 $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone);                  $tpstart=&Apache::lonlocal::locallocaltime($tstart);
             }              }
             if ($tend) {              if ($tend) {
                 $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone);                  $tpend=&Apache::lonlocal::locallocaltime($tend);
             }              }
             if ($env{'request.role'} eq $trolecode) {              if ($env{'request.role'} eq $trolecode) {
  $tstatus='selected';   $tstatus='selected';
Line 719  ENDHEADER Line 809  ENDHEADER
         $r->print(' /></label><input type="submit" value="'.&mt('Display').'" /></span>');          $r->print(' /></label><input type="submit" value="'.&mt('Display').'" /></span>');
     } else {      } else {
         if ($countactive > 0) {          if ($countactive > 0) {
             my $queuetotal = &queued_selfenrollment($r);              my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
             if (($numcourses-$queuetotal) > 1) {              my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); 
                 my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');              $r->print('<p>'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] LON-CAPA courses.','<b>','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a></b>',$domdesc).'<br />'.&mt('If a course is [_1]not[_2] in your list of current courses below, you may be able to enroll if self-enrollment is permitted.','<b>','</b>').'</p>');
                 my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');   
                 $r->print('<p>'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] GCI WebCenter courses.','<b>','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a></b>',$domdesc).'<br />'.&mt('If a course is [_1]not[_2] in your list of current courses below, you may be able to enroll if self-enrollment is permitted.','<b>','</b>').'</p>');  
             }  
         }          }
     }      }
   
Line 735  ENDHEADER Line 822  ENDHEADER
  } else {   } else {
     $r->print('<h2>'.&mt('Currently no active roles or courses').'</h2>');      $r->print('<h2>'.&mt('Currently no active roles or courses').'</h2>');
  }   }
         &findcourse_advice($r,$numcourses);          &findcourse_advice($r);
  $r->print('</form>');   $r->print('</form>');
         if ($countfuture) {          if ($countfuture) {
             $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture));              $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture));
Line 760  ENDHEADER Line 847  ENDHEADER
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
  return OK;   return OK;
     } elsif ($countactive==1) { # Is there only one choice?  
         my $needs_switchserver;  
         if ($env{'user.author'}) {  
             $needs_switchserver = &check_needs_switchserver($possiblerole);  
         }  
         if ((!$needs_switchserver) && ($env{'request.role'} eq 'cm')) {  
     $r->print('<h3>'.&mt('Please stand by.').'</h3>'.  
         '<input type="hidden" name="'.$possiblerole.'" value="1" />'.  
             '<noscript><br /><input type="submit" name="submit" value="'.&mt('Continue').'" /></noscript>');  
     $r->print("</form>\n");  
     $r->rflush();  
     $r->print('<script type="text/javascript">document.forms.rolechoice.submit();</script>');  
     $r->print(&Apache::loncommon::end_page());  
     return OK;  
         }  
         if ($needs_switchserver) {  
             $r->print("<h2>".&mt('Server Switch Required')."</h2>\n".  
                       &mt('Construction Space access is only available from '.  
                           'the home server of the corresponding Author.').'<br />'.  
                       &mt("Click the 'Switch Server' link to go there.").'<br />');     
         }  
     }      }
 # ----------------------------------------------------------------------- Table  # ----------------------------------------------------------------------- Table
     unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {      unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {
Line 855  ENDHEADER Line 921  ENDHEADER
  $r->print('<p><small><i>'   $r->print('<p><small><i>'
                  .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion'))                   .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion'))
  .'</i><br />'   .'</i><br />'
  .'<a href="/adm/logout">'.&mt('Logout').'</a>');   .'<a href="/adm/logout">'.&mt('Logout').'</a>&nbsp;&nbsp;'
         if ($numcourses>1) {                   .'<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'
             $r->print('&nbsp;&nbsp;'.                   .&mt('Course Catalog')
                       '<a href="/adm/coursecatalog?showdom='.$esc_dom.'">'.                   .'</small></p>');
                       &mt('Course Catalog').  
                       '</small>');  
         }  
         $r->print('</p>');  
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
 sub role_timezone {  
     my ($where,$timezones) = @_;  
     my $timezone;  
     if (ref($timezones) eq 'HASH') {  
         if ($where =~ m{^/($match_domain)/($match_courseid)}) {  
             my $cdom = $1;  
             my $cnum = $2;  
             if ($cdom && $cnum) {  
                 if (!exists($timezones->{$cdom.'_'.$cnum})) {  
                     my %timehash =  
                         &Apache::lonnet::get('environment',['timezone'],$cdom,$cnum);  
                     if ($timehash{'timezone'} eq '') {  
                         if (!exists($timezones->{$cdom})) {  
                             my %domdefaults =  
                                 &Apache::lonnet::get_domain_defaults($cdom);  
                             if ($domdefaults{'timezone_def'} eq '') {  
                                 $timezones->{$cdom} = 'local';  
                             } else {  
                                 $timezones->{$cdom} = $domdefaults{'timezone_def'};  
                             }  
                         }  
                         $timezones->{$cdom.'_'.$cnum} = $timezones->{$cdom};  
                     } else {  
                         $timezones->{$cdom.'_'.$cnum} =  
                             &Apache::lonlocal::gettimezone($timehash{'timezone'});  
                     }  
                 }  
                 $timezone = $timezones->{$cdom.'_'.$cnum};  
             }  
         } else {  
             my ($tdom) = ($where =~ m{^/($match_domain)});  
             if ($tdom) {  
                 if (!exists($timezones->{$tdom})) {  
                     my %domdefaults = &Apache::lonnet::get_domain_defaults($tdom);  
                     if ($domdefaults{'timezone_def'} eq '') {  
                         $timezones->{$tdom} = 'local';  
                     } else {  
                         $timezones->{$tdom} = $domdefaults{'timezone_def'};  
                     }  
                 }  
                 $timezone = $timezones->{$tdom};  
             }  
         }  
         if ($timezone eq 'local') {  
             $timezone = undef;  
         }  
     }  
     return $timezone;  
 }  
   
 sub roletable_headers {  sub roletable_headers {
     my ($r,$roleclass,$sortrole,$nochoose) = @_;      my ($r,$roleclass,$sortrole,$nochoose) = @_;
     my $doheaders;      my $doheaders;
Line 980  sub print_rolerows { Line 992  sub print_rolerows {
 }  }
   
 sub findcourse_advice {  sub findcourse_advice {
     my ($r,$numcourses) = @_;      my ($r) = @_;
     my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');      my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
     my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');      my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&');
     if (&Apache::lonnet::auto_run(undef,$env{'user.domain'})) {      if (&Apache::lonnet::auto_run(undef,$env{'user.domain'})) {
Line 995  sub findcourse_advice { Line 1007  sub findcourse_advice {
     } else {      } else {
         $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'<br />');          $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'<br />');
     }      }
     my $queuetotal = &queued_selfenrollment($r);      $r->print('<p>'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a>',$domdesc).'<br />');
     if (($numcourses - $queuetotal) > 0) {      $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'</p>');
         $r->print('<p>'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','<a href="/adm/coursecatalog?showdom='.$esc_dom.'">','</a>',$domdesc).'<br />');  
         $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'</p>');  
     }  
     return;      return;
 }  }
   
 sub queued_selfenrollment {  
     my ($r) = @_;  
     my %selfenrollrequests = &Apache::lonnet::dump('selfenrollrequests');  
     my %reqs_by_date;  
     my $queuetotal = 0;  
     foreach my $item (keys(%selfenrollrequests)) {  
         if (ref($selfenrollrequests{$item}) eq 'HASH') {  
             if ($selfenrollrequests{$item}{'status'} eq 'request') {  
                 if ($selfenrollrequests{$item}{'timestamp'}) {  
                     push(@{$reqs_by_date{$selfenrollrequests{$item}{'timestamp'}}},$item);  
                 }  
             }  
         }  
     }  
     if (keys(%reqs_by_date)) {  
         my $rolename = &Apache::lonnet::plaintext('st');  
         $r->print('<b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />'.  
                   &Apache::loncommon::start_data_table().  
                   &Apache::loncommon::start_data_table_header_row().  
                   '<th>'.&mt('Date requested').'</th><th>'.&mt('Course title').'</th>'.  
                   '<th>'.&mt('User role').'</th><th>'.&mt('Section').'</th>'.  
                  &Apache::loncommon::end_data_table_header_row());  
         my @sorted = sort { $a <=> $b } (keys(%reqs_by_date));  
         foreach my $item (@sorted) {  
             if (ref($reqs_by_date{$item}) eq 'ARRAY') {  
                 foreach my $crs (@{$reqs_by_date{$item}}) {  
                     my %courseinfo = &Apache::lonnet::coursedescription($crs);  
                     my $usec = $selfenrollrequests{$crs}{'section'};  
                     if ($usec eq '') {  
                         $usec = &mt('No section');  
                     }  
                     $r->print(&Apache::loncommon::start_data_table_row().  
                              '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.  
                              '<td>'.$courseinfo{'description'}.'</td>'.  
                              '<td>'.$rolename.'</td><td>'.$usec.'</td>'.  
                              &Apache::loncommon::end_data_table_row());  
                     $queuetotal ++;  
                 }  
             }  
         }  
         $r->print(&Apache::loncommon::end_data_table());  
     }  
     return $queuetotal;  
 }  
   
 sub privileges_info {  sub privileges_info {
     my ($which) = @_;      my ($which) = @_;
     my $output;      my $output;
Line 1157  sub build_roletext { Line 1121  sub build_roletext {
         } elsif ($advanced) {          } elsif ($advanced) {
             $roletext.=              $roletext.=
                 '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Select').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         } elsif ($reinit) {          } elsif ($reinit) {
             $roletext.=               $roletext.= 
Line 1167  sub build_roletext { Line 1131  sub build_roletext {
         } else {          } else {
             $roletext.=              $roletext.=
                 '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Select').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
         }          }
     }      }

Removed from v.1.209.4.2  
changed lines
  Added in v.1.210


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