--- loncom/auth/lonroles.pm 2008/06/04 19:14:20 1.195
+++ loncom/auth/lonroles.pm 2008/10/20 03:25:48 1.209
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.195 2008/06/04 19:14:20 bisitz Exp $
+# $Id: lonroles.pm,v 1.209 2008/10/20 03:25:48 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -43,6 +43,7 @@ use Apache::lonpageflip();
use Apache::lonnavdisplay();
use GDBM_File;
use LONCAPA qw(:DEFAULT :match);
+use HTML::Entities;
sub redirect_user {
@@ -145,12 +146,35 @@ sub handler {
# Is this an ad-hoc CA-role?
if (my ($domain,$user) =
($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {
- # Check if author blocked ca-access
+ if (($domain eq $env{'user.domain'}) && ($user eq $env{'user.name'})) {
+ delete($env{$envkey});
+ $env{'form.au./'.$domain.'/'} = 1;
+ my ($server_status,$home) = &check_author_homeserver($user,$domain);
+ if ($server_status eq 'switchserver') {
+ my $trolecode = 'au./'.$domain.'/';
+ my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
+ $r->internal_redirect($switchserver);
+ }
+ last;
+ }
+ if (my ($castart,$caend) = ($env{'user.role.ca./'.$domain.'/'.$user} =~ /^(\d*)\.(\d*)$/)) {
+ if (((($castart) && ($castart < $now)) || !$castart) &&
+ ((!$caend) || (($caend) && ($caend > $now)))) {
+ my ($server_status,$home) = &check_author_homeserver($user,$domain);
+ if ($server_status eq 'switchserver') {
+ my $trolecode = 'ca./'.$domain.'/'.$user;
+ my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
+ $r->internal_redirect($switchserver);
+ }
+ last;
+ }
+ }
+ # Check if author blocked ca-access
my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);
if ($blocked{'domcoord.author'} eq 'blocked') {
- delete($env{$envkey});
- $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
- last;
+ delete($env{$envkey});
+ $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
+ last;
}
if ($dcroles{$domain}) {
my ($server_status,$home) = &check_author_homeserver($user,$domain);
@@ -228,8 +252,11 @@ sub handler {
$cdom,$cnum,
$env{'user.domain'},
$env{'user.name'},
- 'Assigned from '.$ENV{'REMOTE_ADDR'}.' at '.localtime().' for '.
- $trolecode);
+ &mt('Assigned from [_1] at [_2] for [_3]'
+ ,$ENV{'REMOTE_ADDR'}
+ ,&Apache::lonlocal::locallocaltime()
+ ,$trolecode)
+ );
unless ($assignresult eq 'ok') {
$assignresult=~s/^error\:\s*//;
$message=&mt($assignresult).
@@ -335,6 +362,10 @@ ENDENTERKEY
} elsif ($env{'request.course.id'}) {
if ($env{'form.destinationurl'}) {
my $dest = $env{'form.destinationurl'};
+ if ($env{'form.destsymb'} ne '') {
+ my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&');
+ $dest .= '?symb='.$esc_symb;
+ }
&redirect_user($r,&mt('Entering [_1]',
$env{'course.'.$courseid.'.description'}),
$dest,$msg,
@@ -349,7 +380,7 @@ ENDENTERKEY
) {
my $startpage = &courseloadpage($courseid);
unless ($startpage eq 'firstres') {
- $msg = &mt('Entering [_1] ....',
+ $msg = &mt('Entering [_1] ...',
$env{'course.'.$courseid.'.description'});
&redirect_user($r,&mt('New in course'),
'/adm/whatsnew?refpage=start',$msg,
@@ -452,6 +483,8 @@ ENDHEADER
my $advanced=$env{'user.adv'};
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);
my $tryagain=$env{'form.tryagain'};
+ my $reinit=$env{'user.reinit'};
+ delete $env{'user.reinit'};
# -------------------------------------------------------- Generate Page Output
# --------------------------------------------------------------- Error Header?
@@ -481,10 +514,16 @@ ENDHEADER
&Apache::lonenc::check_encrypt($fn));
} else {
if ($env{'user.error.msg'}) {
- $r->print(
+ if ($reinit) {
+ $r->print(
+ '
'.
+ &mt('As your session file for the course has expired, you will need to re-select the course.').'
');
+ } else {
+ $r->print(
'
'.
&mt('You need to choose another user role or enter a specific course for this function').'
');
- }
+ }
+ }
}
# -------------------------------------------------------- Choice or no choice?
if ($nochoose) {
@@ -501,13 +540,6 @@ ENDHEADER
$r->print('');
$r->print('');
}
- if ($env{'user.adv'}) {
- $r->print(
- ' ');
- }
-
my (%roletext,%sortrole,%roleclass);
my $countactive=0;
my $countfuture=0;
@@ -556,7 +588,7 @@ ENDHEADER
$countfuture ++;
} elsif ($tstatus eq 'will') {
$tbg='#FFAA77';
- $tremark.=&mt('Active at next login. ');
+ $tremark.=&mt('Active at next login.').' ';
$roles_nextlogin{$trolecode} = $tstart.':'.$tend;
$countwill ++;
} elsif ($tstatus eq 'expired') {
@@ -565,20 +597,19 @@ ENDHEADER
$button=0;
} elsif ($tstatus eq 'will_not') {
$tbg='#AAFF77';
- $tremark.=&mt('Expired after logout. ');
+ $tremark.=&mt('Expired after logout.').' ';
} elsif ($tstatus eq 'selected') {
$tbg='#11CC55';
$tfont='#002200';
$inrole=1;
$countactive++;
- $tremark.=&mt('Currently selected. ');
+ $tremark.=&mt('Currently selected.').' ';
}
my $trole;
if ($role =~ /^cr\//) {
my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
if ($tremark) { $tremark.=' '; }
- $tremark.=&mt('Defined by ').$rauthor.
- &mt(' at ').$rdomain.'.';
+ $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain);
}
$trole=Apache::lonnet::plaintext($role);
my $ttype;
@@ -666,7 +697,7 @@ ENDHEADER
$twhere=&mt('system wide');
$sortkey=$role.$twhere;
}
- $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver);
+ $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit);
$roletext{$envkey}=$roletext;
if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}
$sortrole{$sortkey}=$envkey;
@@ -674,6 +705,19 @@ ENDHEADER
}
}
}
+ if ($env{'user.adv'}) {
+ $r->print(
+ ' ');
+ } else {
+ if ($countactive > 0) {
+ 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.','','').'
');
+ }
+ }
+
# No active roles
if ($countactive==0) {
if ($inrole) {
@@ -693,7 +737,7 @@ ENDHEADER
my $tfont='#003300';
if ($env{'request.role'} eq 'cm') {
$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.').'
";
foreach my $priv (sort(split(/:/,$env{$envkey}))) {
next if (!$priv);
@@ -957,7 +996,7 @@ sub role_status {
}
sub build_roletext {
- my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;
+ my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_;
my $roletext='
';
my $is_dc=($trolecode =~ m/^dc\./);
my $rowspan=($is_dc) ? ''
@@ -987,8 +1026,16 @@ sub build_roletext {
'
';
+ } elsif ($reinit) {
+ $roletext.=
+ '
';
} else {
- $roletext.='
';
+ $roletext.=
+ '
';
}
}
if ($trolecode !~ m/^(dc|ca|au|aa)\./) {
@@ -1007,6 +1054,24 @@ sub build_roletext {
return $roletext;
}
+sub check_needs_switchserver {
+ my ($possiblerole) = @_;
+ my $needs_switchserver;
+ my ($role,$where) = split(/\./,$possiblerole,2);
+ my (undef,$tdom,$twho) = split(/\//,$where);
+ my ($server_status,$home);
+ if (($role eq 'ca') || ($role eq 'aa')) {
+ ($server_status,$home) = &check_author_homeserver($twho,$tdom);
+ } else {
+ ($server_status,$home) = &check_author_homeserver($env{'user.name'},
+ $env{'user.domain'});
+ }
+ if ($server_status eq 'switchserver') {
+ $needs_switchserver = 1;
+ }
+ return $needs_switchserver;
+}
+
sub check_author_homeserver {
my ($uname,$udom)=@_;
if (($uname eq '') || ($udom eq '')) {
@@ -1062,32 +1127,40 @@ sub check_fordc {
sub adhoc_course_role {
my ($then) = @_;
my ($cdom,$cnum);
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
if (&check_forcc($cdom,$cnum,$then)) {
my $setprivs;
- if (!defined($env{'user.role.'.$env{'form.selectrole'}})) {
+ if (!defined($env{'user.role.'.$env{'form.switchrole'}})) {
$setprivs = 1;
} else {
- my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.selectrole'}});
+ my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}});
if (($start && ($start>$then || $start == -1)) ||
($end && $end<$then)) {
$setprivs = 1;
}
}
if ($setprivs) {
- if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E(/?\w*)$-) {
+ if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) {
my $role = $1;
my $custom_role = $2;
my $usec = $3;
if ($role eq 'cr') {
- if ($custom_role =~ m-^$match_domain/$match_courseid/\w+$-) {
+ if ($custom_role =~ m-^/$match_domain/$match_username/\w+$-) {
$role .= $custom_role;
} else {
return;
}
}
- my (%userroles,%newrole,%newgroups);
+ my (%userroles,%newrole,%newgroups,%group_privs);
+ my %cgroups =
+ &Apache::lonnet::get_active_groups($env{'user.domain'},
+ $env{'user.name'},$cdom,$cnum);
+ foreach my $group (keys(%cgroups)) {
+ $group_privs{$group} =
+ $env{'user.priv.cc./'.$cdom.'/'.$cnum.'./'.$cdom.'/'.$cnum.'/'.$group};
+ }
+ $newgroups{'/'.$cdom.'/'.$cnum} = \%group_privs;
my $area = '/'.$cdom.'/'.$cnum;
my $spec = $role.'.'.$area;
if ($usec ne '') {
@@ -1095,7 +1168,7 @@ sub adhoc_course_role {
$area .= '/'.$usec;
}
&Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);
- &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups);
+ &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups);
my $adhocstart = $then-1;
$userroles{'user.role.'.$spec} = $adhocstart.'.';
&Apache::lonnet::appenv(\%userroles,[$role,'cm']);
@@ -1281,24 +1354,6 @@ sub courseloadpage {
return $startpage;
}
-sub check_autoenroll {
- my ($dom) = @_;
- my $run_enroll = 0;
- my $settings;
- my %domconfig =
- &Apache::lonnet::get_dom('configuration',['autoenroll'],$dom);
- if (ref($domconfig{'autoenroll'}) eq 'HASH') {
- $settings = $domconfig{'autoenroll'};
- if ($settings->{'run'} eq '1') {
- $run_enroll = 1;
- }
- } else {
- $run_enroll = &localenroll::run($dom);
- }
- return $run_enroll;
-}
-
-
1;
__END__