--- loncom/auth/lonroles.pm 2004/10/11 18:27:49 1.94.2.2
+++ loncom/auth/lonroles.pm 2004/11/11 22:18:23 1.106
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.94.2.2 2004/10/11 18:27:49 albertel Exp $
+# $Id: lonroles.pm,v 1.106 2004/11/11 22:18:23 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,16 +36,23 @@ use Apache::Constants qw(:common);
use Apache::File();
use Apache::lonmenu;
use Apache::loncommon;
+use Apache::lonhtmlcommon;
use Apache::lonannounce;
use Apache::lonlocal;
sub redirect_user {
- my ($r,$title,$url,$msg) = @_;
+ my ($r,$title,$url,$msg,$launch_nav) = @_;
$msg = $title if (! defined($msg));
&Apache::loncommon::content_type($r,'text/html');
&Apache::loncommon::no_cache($r);
$r->send_http_header;
my $swinfo=&Apache::lonmenu::rawconfig();
+ my $navwindow;
+ if ($launch_nav eq 'on') {
+ $navwindow.=&Apache::lonnavmaps::launch_win('now');
+ } else {
+ $navwindow.=&Apache::lonnavmaps::close();
+ }
my $bodytag=&Apache::loncommon::bodytag('Switching Role');
# Note to style police:
# This must only replace the spaces, nothing else, or it bombs elsewhere.
@@ -56,9 +63,10 @@ sub redirect_user {
$bodytag
-
+$navwindow
$msg
Continue
@@ -74,15 +82,37 @@ sub handler {
my $now=time;
my $then=$ENV{'user.login.time'};
my $envkey;
+ my $dcselect='';
# ================================================================== Roles Init
-
if ($ENV{'form.selectrole'}) {
+ if ($ENV{'form.dcselected'}) {
+ my $dcdom = $ENV{'form.dcselected'};
+ my $dckey = 'user.role.dc./'.$dcdom.'/';
+ if ($ENV{$dckey}) {
+ my ($dcstart,$dcend)=split(/\./,$ENV{$dckey});
+ my $active_dc = 1;
+ if ($dcstart) {
+ if ($dcstart>$then) {
+ $active_dc = 0;
+ }
+ }
+ if ($dcend) {
+ if ($dcend < $then) {
+ $active_dc = 0;
+ }
+ }
+ if ($active_dc) {
+ $dcselect = $dcdom;
+ }
+ }
+ }
if ($ENV{'request.course.id'}) {
my %temp=('logout_'.$ENV{'request.course.id'} => time);
&Apache::lonnet::put('email_status',\%temp);
- }
+ &Apache::lonnet::delenv('user.state.'.$ENV{'request.course.id'});
+ }
&Apache::lonnet::appenv("request.course.id" => '',
"request.course.fn" => '',
"request.course.uri" => '',
@@ -90,23 +120,38 @@ sub handler {
"request.role" => 'cm',
"request.role.adv" => $ENV{'user.adv'},
"request.role.domain" => $ENV{'user.domain'});
+
+# Check to see if the user is a DC trying to enter a course
+# course selection page
+ my $dcflag = 0;
+ if ($ENV{'form.dccourse'}) {
+ my $dcdom = $ENV{'form.dcdomain'};
+ my $pickedcourse = $ENV{'form.dccourse'};
+ if ($dcdom && $pickedcourse) {
+ unless ($ENV{'user.role.cc./'.$dcdom.'/'.$pickedcourse}) {
+ if ($ENV{'user.role.dc./'.$dcdom.'/'}) {
+ &set_privileges($dcdom,$pickedcourse);
+ my $msg=&mt('Entering course ...');
+ my ($furl,$ferr)=&Apache::lonuserstate::readmap($dcdom.'/'.$pickedcourse);
+ my $formaction = '/adm/roles/';
+ my $courseid = $dcdom.'_'.$pickedcourse;
+ &Apache::lonhtmlcommon::store_recent('cc_pickby_dc_'.$dcdom,
+ $courseid,$formaction);
+ # Send the user to the course they selected
+ &redirect_user($r,&mt('Entering Course'),
+ $furl,$msg,
+ $ENV{'environment.remotenavmap'});
+ return OK;
+ }
+ }
+ }
+ }
+
foreach $envkey (keys %ENV) {
next if ($envkey!~/^user\.role\./);
- my (undef,undef,$role,@pwhere)=split(/\./,$envkey);
- my $where=join('.',@pwhere);
- my $trolecode=$role.'.'.$where;
+ my ($where,$trolecode,$role,$tstatus,$tend,$tstart);
+ &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
if ($ENV{'form.'.$trolecode}) {
- my ($tstart,$tend)=split(/\./,$ENV{$envkey});
- my $tstatus='is';
- if ($tstart) {
- if ($tstart>$then) {
- $tstatus='future';
- }
- }
- if ($tend) {
- if ($tend<$then) { $tstatus='expired'; }
- if ($tend<$now) { $tstatus='will_not'; }
- }
if ($tstatus eq 'is') {
$where=~s/^\///;
my ($cdom,$cnum,$csec)=split(/\//,$where);
@@ -200,15 +245,15 @@ ENDENTERKEY
$ENV{'user.name'},
$ENV{'user.home'},
"Role ".$trolecode);
- my $tadv=0;
- if (($trolecode!~/^st/) &&
- ($trolecode!~/^ta/) &&
- ($trolecode!~/^cm/)) { $tadv=1; }
+
&Apache::lonnet::appenv(
- 'request.role' => $trolecode,
- 'request.role.adv' => $tadv,
+ 'request.role' => $trolecode,
'request.role.domain' => $cdom,
'request.course.sec' => $csec);
+ my $tadv=0;
+ if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
+ &Apache::lonnet::appenv('request.role.adv' => $tadv);
+
my $msg=&mt('Entering course ...');
if (($cnum) && ($role ne 'ca')) {
@@ -244,10 +289,22 @@ ENDENTERKEY
'.course.helper.not.run'}) {
$furl = "/adm/helper/course.initialization.helper";
}
+ # Check to see if the user is a DC coming from the
+ # course selection page
+ my $dcflag = 0;
+ if ($ENV{'form.dccourse'}) {
+ my $formaction = '/adm/roles/';
+ my ($dcdom,$pickedcourse) = split/_/,$courseid;
+ if ($ENV{'user.role.dc./'.$dcdom.'/'}) {
+ &Apache::lonhtmlcommon::store_recent('cc_pickby_dc_'.$dcdom,
+ $courseid,$formaction);
+ }
+ }
#
# Send the user to the course they selected
&redirect_user($r,&mt('Entering Course'),
- $furl,$msg);
+ $furl,$msg,
+ $ENV{'environment.remotenavmap'});
return OK;
}
}
@@ -266,6 +323,14 @@ ENDENTERKEY
$redirect_url);
return OK;
}
+ if ($role eq 'dc') {
+ unless ($dcselect) {
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Coordinator Menu'),
+ $redirect_url);
+ return OK;
+ }
+ }
}
}
}
@@ -280,6 +345,7 @@ ENDENTERKEY
return OK if $r->header_only;
my $swinfo=&Apache::lonmenu::rawconfig();
+ my $setDCchoice = &dc_script();
my $bodytag=&Apache::loncommon::bodytag('User Roles');
my $helptag=''.&Apache::loncommon::help_open_menu('','General Intro','General_Intro','User Roles',1,undef,undef,undef,undef,,&mt("Click here for help")).' |
';
$r->print(<
ENDHEADER
@@ -310,6 +377,12 @@ ENDHEADER
my $tryagain=$ENV{'form.tryagain'};
# -------------------------------------------------------- Generate Page Output
+# -------------------------------------------------------- Domain Coordinator?
+ if ($dcselect ne '') {
+ &choosecourse_display($r,$dcselect,$then,$now);
+ return OK;
+ }
+
# --------------------------------------------------------------- Error Header?
if ($error) {
$r->print("LON-CAPA Access Control
");
@@ -362,6 +435,9 @@ ENDHEADER
$r->print('>');
}
+ my %dcroles = ();
+ my $numdc = &check_fordc(\%dcroles,$then);
+
my (%roletext,%sortrole,%roleclass);
my $countactive=0;
my $inrole=0;
@@ -372,29 +448,17 @@ ENDHEADER
my $roletext;
my $sortkey;
if ($envkey=~/^user\.role\./) {
- my (undef,undef,$role,@pwhere)=split(/\./,$envkey);
+ 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 '');
- my $where=join('.',@pwhere);
- my $trolecode=$role.'.'.$where;
- my ($tstart,$tend)=split(/\./,$ENV{$envkey});
- my $tremark='';
- my $tstatus='is';
- my $tpstart=' ';
- my $tpend=' ';
- my $tfont='#000000';
+ $tremark='';
+ $tpstart=' ';
+ $tpend=' ';
+ $tfont='#000000';
if ($tstart) {
- if ($tstart>$then) {
- $tstatus='future';
- if ($tstart<$now) { $tstatus='will'; }
- }
$tpstart=&Apache::lonlocal::locallocaltime($tstart);
}
if ($tend) {
- if ($tend<$then) {
- $tstatus='expired';
- } elsif ($tend<$now) {
- $tstatus='will_not';
- }
$tpend=&Apache::lonlocal::locallocaltime($tend);
}
if ($ENV{'request.role'} eq $trolecode) {
@@ -502,8 +566,7 @@ ENDHEADER
'';
}
} else {
- my %newhash=Apache::lonnet::coursedescription
- ($tcourseid);
+ my %newhash=&Apache::lonnet::coursedescription($tcourseid);
if (%newhash) {
$sortkey=$role."\0".$tdom."\0".$newhash{'description'}.
"\0".$envkey;
@@ -598,7 +661,7 @@ ENDHEADER
unless ($nochoose) { $r->print(' | '); }
$r->print(''.&mt('User Role').' | '.&mt('Extent').
' | '.&mt('Start').' | '.&mt('End').' | '.
- &mt('Remark').' | '."\n");
+ &mt('Remarks and Calendar Announcements').''."\n");
my $doheaders=-1;
foreach my $type ('Construction Space','Course','Domain','System') {
my $haverole=0;
@@ -609,20 +672,70 @@ ENDHEADER
}
if ($haverole) { $doheaders++; }
}
- foreach my $type ('Construction Space','Course','Domain','System') {
- my $output;
- foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
- if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {
- $output.=&mt($roletext{$sortrole{$which}});
+ if ($numdc > 0) {
+ $r->print(''.
+ ''.
+ ''.
+ ''.
+ &mt('Domain').' | ');
+ foreach my $dcdom (keys %dcroles) {
+ my $output = $roletext{$dcroles{$dcdom}};
+ my $ccrole = Apache::lonnet::plaintext('cc');
+ if ($ENV{'request.role'} =~ m-cc\./$dcdom/-) {
+ $output.=$roletext{'user.role.'.$ENV{'request.role'}};
+ }
+ $r->print($output);
+ $r->print('
');
+ $r->print(' | '.
+ ''.
+ $ccrole.' | '.&mt('Course').' | '.
+ ''.&mt('All courses').''.
+ ' '.&mt('Domain').':'.$dcdom.''.
+ ' | '.
+ &mt('Course Coordinator access to all courses in domain').
+ ': '.$dcdom.' |
'."\n");
+ }
+ foreach my $type ('Construction Space','Course','Domain','System') {
+ my $output;
+ foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
+ my $skiprole = 0;
+ foreach my $dcdom (keys %dcroles) {
+ if ($sortrole{$which} =~ m-(dc)\./$dcdom/-) {
+ $skiprole = 1;
+ last;
+ }
+ }
+ if (($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) && (!$skiprole)) {
+ $output.=$roletext{$sortrole{$which}};
+ }
+ }
+ if ($output) {
+ if ($doheaders > 0) {
+ $r->print("".
+ "".&mt($type)." |
+");
+ }
+ $r->print($output);
+ }
+ }
+ } else {
+ foreach my $type ('Construction Space','Course','Domain','System') {
+ my $output;
+ foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
+ if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {
+ $output.=$roletext{$sortrole{$which}};
+ }
}
- }
- if ($output) {
- if ($doheaders > 0) {
- $r->print("
".
- "".&mt($type)." | ");
+ if ($output) {
+ if ($doheaders > 0) {
+ $r->print("
".
+ "".&mt($type)." | ");
+ }
+ $r->print($output);
}
- $r->print($output);
- }
+ }
}
my $tremark='';
my $tfont='#003300';
@@ -711,7 +824,246 @@ ENDHEADER
}
$r->print("