--- loncom/auth/lonroles.pm 2009/09/23 19:42:20 1.209.4.2 +++ loncom/auth/lonroles.pm 2008/11/12 20:01:09 1.210 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.209.4.2 2009/09/23 19:42:20 raeburn Exp $ +# $Id: lonroles.pm,v 1.210 2008/11/12 20:01:09 jms Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,103 @@ # ### +=pod + +=head1 NAME + +Apache::lonroles - User Roles Screen + +=head1 SYNOPSIS + +Invoked by /etc/httpd/conf/srm.conf: + + + PerlAccessHandler Apache::lonacc + SetHandler perl-script + PerlHandler Apache::lonroles + ErrorDocument 403 /adm/login + ErrorDocument 500 /adm/errorhandler + + +=head1 OVERVIEW + +=head2 Choosing Roles + +C 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's C<&allowed> function that a certain +action is not allowed, C 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 can also be accessed via the +B 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'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; use strict; @@ -548,12 +645,6 @@ ENDHEADER my $possiblerole=''; my %futureroles; 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) { my $button = 1; my $switchserver=''; @@ -563,16 +654,15 @@ ENDHEADER my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont); &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); next if (!defined($role) || $role eq '' || $role =~ /^gr/); - my $timezone = &role_timezone($where,\%timezones); $tremark=''; $tpstart=' '; $tpend=' '; $tfont='#000000'; if ($tstart) { - $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone); + $tpstart=&Apache::lonlocal::locallocaltime($tstart); } if ($tend) { - $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone); + $tpend=&Apache::lonlocal::locallocaltime($tend); } if ($env{'request.role'} eq $trolecode) { $tstatus='selected'; @@ -719,12 +809,9 @@ ENDHEADER $r->print(' />'); } else { if ($countactive > 0) { - my $queuetotal = &queued_selfenrollment($r); - if (($numcourses-$queuetotal) > 1) { - my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); - my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); - $r->print('

'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] GCI WebCenter courses.','','','',$domdesc).'
'.&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.','','').'

'); - } + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); + $r->print('

'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] LON-CAPA courses.','','','',$domdesc).'
'.&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.','','').'

'); } } @@ -735,7 +822,7 @@ ENDHEADER } else { $r->print('

'.&mt('Currently no active roles or courses').'

'); } - &findcourse_advice($r,$numcourses); + &findcourse_advice($r); $r->print(''); if ($countfuture) { $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture)); @@ -760,27 +847,6 @@ ENDHEADER } $r->print(&Apache::loncommon::end_page()); 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('

'.&mt('Please stand by.').'

'. - ''. - ''); - $r->print("\n"); - $r->rflush(); - $r->print(''); - $r->print(&Apache::loncommon::end_page()); - return OK; - } - if ($needs_switchserver) { - $r->print("

".&mt('Server Switch Required')."

\n". - &mt('Construction Space access is only available from '. - 'the home server of the corresponding Author.').'
'. - &mt("Click the 'Switch Server' link to go there.").'
'); - } } # ----------------------------------------------------------------------- Table unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) { @@ -855,69 +921,15 @@ ENDHEADER $r->print('

' .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion')) .'
' - .''.&mt('Logout').''); - if ($numcourses>1) { - $r->print('  '. - ''. - &mt('Course Catalog'). - '
'); - } - $r->print('

'); + .''.&mt('Logout').'  ' + .'' + .&mt('Course Catalog') + .'

'); } $r->print(&Apache::loncommon::end_page()); 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 { my ($r,$roleclass,$sortrole,$nochoose) = @_; my $doheaders; @@ -980,7 +992,7 @@ sub print_rolerows { } sub findcourse_advice { - my ($r,$numcourses) = @_; + my ($r) = @_; my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); if (&Apache::lonnet::auto_run(undef,$env{'user.domain'})) { @@ -995,59 +1007,11 @@ sub findcourse_advice { } 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.').'
'); } - my $queuetotal = &queued_selfenrollment($r); - if (($numcourses - $queuetotal) > 0) { - $r->print('

'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','','',$domdesc).'
'); - $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'

'); - } + $r->print('

'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','','',$domdesc).'
'); + $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'

'); 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(''.&mt('Enrollment requests pending Course Coordinator approval').'
'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('Date requested').''.&mt('Course title').''. - ''.&mt('User role').''.&mt('Section').''. - &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(). - ''.&Apache::lonlocal::locallocaltime($item).''. - ''.$courseinfo{'description'}.''. - ''.$rolename.''.$usec.''. - &Apache::loncommon::end_data_table_row()); - $queuetotal ++; - } - } - } - $r->print(&Apache::loncommon::end_data_table()); - } - return $queuetotal; -} - sub privileges_info { my ($which) = @_; my $output; @@ -1157,7 +1121,7 @@ sub build_roletext { } elsif ($advanced) { $roletext.= ''; } elsif ($reinit) { $roletext.= @@ -1167,7 +1131,7 @@ sub build_roletext { } else { $roletext.= ''; } }