--- loncom/auth/lonroles.pm 2009/01/05 16:50:02 1.209.2.1 +++ loncom/auth/lonroles.pm 2008/12/04 08:53:04 1.211 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.209.2.1 2009/01/05 16:50:02 raeburn Exp $ +# $Id: lonroles.pm,v 1.211 2008/12/04 08:53:04 tempelho 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; @@ -272,7 +369,7 @@ $swinfo
-$message
+$message
$end_page @@ -548,7 +645,6 @@ ENDHEADER my $possiblerole=''; my %futureroles; my %roles_nextlogin; - my %timezones; foreach $envkey (sort keys %env) { my $button = 1; my $switchserver=''; @@ -558,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'; @@ -664,9 +759,9 @@ ENDHEADER $twhere=$env{'course.'.$tcourseid.'.description'}; $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; unless ($twhere eq &mt('Currently not available')) { - $twhere.=' '. + $twhere.=' '. &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont). - ''; + ''; } } else { my %newhash=&Apache::lonnet::coursedescription($tcourseid); @@ -674,9 +769,9 @@ ENDHEADER $sortkey=$role."\0".$tdom."\0".$newhash{'description'}. "\0".$envkey; $twhere=$newhash{'description'}. - ' '. + ' '. &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont). - ''; + ''; $ttype = $newhash{'type'}; $trole = &Apache::lonnet::plaintext($role,$ttype); } else { @@ -744,8 +839,8 @@ ENDHEADER } else { $r->print(''); } - $r->print(''.&mt('No role specified'). - ''.$tremark. + $r->print(''.&mt('No role specified'). + ''.$tremark. ' '."\n"); $r->print(''); @@ -776,8 +871,8 @@ ENDHEADER } } if ($output) { - $r->print("". - &mt('Recent Roles').""); + $r->print("". + &mt('Recent Roles').""); $r->print($output); $doheaders ++; } @@ -807,9 +902,9 @@ ENDHEADER $r->print(' '); } } - $r->print(''.&mt('No role specified'). - ''.$tremark. - ' '."\n"); + $r->print(''.&mt('No role specified'). + ''.$tremark. + ' '."\n"); } $r->print(''); unless ($nochoose) { @@ -835,56 +930,6 @@ ENDHEADER 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; @@ -937,8 +982,8 @@ sub print_rolerows { if ($output) { if ($doheaders > 0) { $r->print("". - "". - &mt($type).""); + "". + &mt($type).""); } $r->print($output); } @@ -1094,14 +1139,14 @@ sub build_roletext { $tremark.=&Apache::lonannounce::showday(time,1, &Apache::lonannounce::readcalendar($tdom.'_'.$trest)); } - $roletext.=''.$trole. - ''.$twhere. - ''.$tpstart. - ''.$tpend. - ''; + $roletext.=''.$trole. + ''.$twhere. + ''.$tpstart. + ''.$tpend. + ''; if (!$is_dc) { - $roletext.=''.$tremark. - ' '."\n"; + $roletext.=''.$tremark. + ' '."\n"; } return $roletext; } @@ -1323,9 +1368,9 @@ sub display_cc_role { my %newhash=&Apache::lonnet::coursedescription($tcourseid); if (%newhash) { $twhere=$newhash{'description'}. - ' '. + ' '. &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$2,$1,$tfont). - ''; + ''; $ttype = $newhash{'type'}; } else { $twhere=&mt('Currently not available');