--- loncom/auth/lonroles.pm 2009/09/23 19:42:20 1.209.4.2
+++ 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.4.2 2009/09/23 19:42:20 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
$end_page
@@ -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';
@@ -669,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);
@@ -679,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 {
@@ -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.','','').'
');
}
- &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));
@@ -752,35 +839,14 @@ ENDHEADER
} else {
$r->print('
');
}
- $r->print('
'.&mt('No role specified').
- '
'.$tremark.
+ $r->print('
'.&mt('No role specified').
+ '
'.$tremark.
'
'."\n");
$r->print('');
}
$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('
\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)) {
@@ -805,8 +871,8 @@ ENDHEADER
}
}
if ($output) {
- $r->print("
');
}
$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;
@@ -970,8 +982,8 @@ sub print_rolerows {
if ($output) {
if ($doheaders > 0) {
$r->print("
".
- "
".
- &mt($type)."
");
+ "
".
+ &mt($type)."
");
}
$r->print($output);
}
@@ -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().
- '