--- loncom/auth/lonroles.pm 2004/11/09 15:52:29 1.102
+++ loncom/auth/lonroles.pm 2004/11/12 23:29:55 1.109
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.102 2004/11/09 15:52:29 raeburn Exp $
+# $Id: lonroles.pm,v 1.109 2004/11/12 23:29:55 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,6 +36,7 @@ use Apache::Constants qw(:common);
use Apache::File();
use Apache::lonmenu;
use Apache::loncommon;
+use Apache::lonhtmlcommon;
use Apache::lonannounce;
use Apache::lonlocal;
@@ -81,7 +82,8 @@ sub handler {
my $now=time;
my $then=$ENV{'user.login.time'};
my $envkey;
-
+ my %dcroles = ();
+ my $numdc = &check_fordc(\%dcroles,$then);
# ================================================================== Roles Init
if ($ENV{'form.selectrole'}) {
@@ -97,6 +99,28 @@ 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 and needs privs to be created
+ if ($numdc > 0) {
+ foreach my $envkey (keys %ENV) {
+ if ($envkey =~ m-^form\.cc\./(\w+)/(\w+)$-) {
+ if ($dcroles{$1}) {
+ my $cckey = 'user.role.cc./'.$1.'/'.$2;
+ if ($ENV{$cckey}) {
+ my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);
+ &role_status($cckey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
+ unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) {
+ &set_privileges($1,$2);
+ }
+ } else {
+ &set_privileges($1,$2);
+ }
+ }
+ last;
+ }
+ }
+ }
+
foreach $envkey (keys %ENV) {
next if ($envkey!~/^user\.role\./);
my ($where,$trolecode,$role,$tstatus,$tend,$tstart);
@@ -239,6 +263,15 @@ ENDENTERKEY
'.course.helper.not.run'}) {
$furl = "/adm/helper/course.initialization.helper";
}
+ # Check to see if the user is a DC selecting a course
+ if (($numdc > 0) && ($role eq 'cc')) {
+ my $formaction = '/adm/roles/';
+ my ($dcdom,$pickedcourse) = split/_/,$courseid;
+ if ($ENV{'user.role.dc./'.$dcdom.'/'}) {
+ &Apache::lonhtmlcommon::store_recent('recent_roles',
+ $courseid,$formaction);
+ }
+ }
#
# Send the user to the course they selected
&redirect_user($r,&mt('Entering Course'),
@@ -262,6 +295,12 @@ ENDENTERKEY
$redirect_url);
return OK;
}
+ if ($role eq 'dc') {
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Coordinator Menu'),
+ $redirect_url);
+ return OK;
+ }
}
}
}
@@ -376,18 +415,9 @@ ENDHEADER
$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) {
@@ -495,8 +525,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;
@@ -602,11 +631,19 @@ ENDHEADER
}
if ($haverole) { $doheaders++; }
}
+ if ($numdc > 0) {
+ &select_recent_courses($r,\%roletext);
+ }
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 ($sortrole{$which} =~ m-dc\./(\w+)/-) {
+ if ($dcroles{$1}) {
+ $output .= &allcourses_row($1);
+ }
+ }
}
}
if ($output) {
@@ -614,7 +651,7 @@ ENDHEADER
$r->print("
".
"".&mt($type)." | ");
}
- $r->print($output);
+ $r->print($output);
}
}
my $tremark='';
@@ -716,20 +753,202 @@ sub role_status {
$$trolecode=$$role.'.'.$$where;
($$tstart,$$tend)=split(/\./,$ENV{$rolekey});
$$tstatus='is';
- if ($$tstart) {
- if ($$tstart>$then) {
- $$tstatus='future';
- if ($$tstart<$now) { $$tstatus='will'; }
- }
+ if ($$tstart && $$tstart>$then) {
+ $$tstatus='future';
+ if ($$tstart<$now) { $$tstatus='will'; }
}
if ($$tend) {
if ($$tend<$then) {
$$tstatus='expired';
- if ($$tend<$now) { $$tstatus='will_not'; }
+ } elsif ($$tend<$now) {
+ $$tstatus='will_not';
+ }
+ }
+ }
+ }
+}
+
+sub check_fordc {
+ my ($dcroles,$then) = @_;
+ my $numdc = 0;
+ if ($ENV{'user.adv'}) {
+ foreach my $envkey (sort keys %ENV) {
+ if ($envkey=~/^user\.role\.dc\.\/(\w+)\/$/) {
+ my $dcdom = $1;
+ my $livedc = 1;
+ my ($tstart,$tend)=split(/\./,$ENV{$envkey});
+ if ($tstart && $tstart>$then) { $livedc = 0; }
+ if ($tend && $tend <$then) { $livedc = 0; }
+ if ($livedc) {
+ $$dcroles{$dcdom} = $envkey;
+ $numdc++;
}
}
}
}
+ return $numdc;
+}
+
+sub courselink {
+ my ($dcdom) = @_;
+ my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,$dcdom);
+ my $verify_script = &coursepick_jscript($dcdom);
+ my $courseform=&Apache::loncommon::selectcourse_link
+ ('rolechoice','dccourse_'.$dcdom,'dcdomain_'.$dcdom,'coursedesc_'.$dcdom);
+ my $hiddenitems = ''.
+ ''.
+ ''.
+ '';
+ return $cb_jscript.$verify_script.$courseform.$hiddenitems;
+}
+
+sub coursepick_jscript {
+ my ($dcdom) = @_;
+ my $verify_script = <<"END";
+
+END
+ return $verify_script;
+}
+
+sub processpick {
+ my $dcdom = shift;
+ my $process_pick = <<"END";
+
+END
+ return $process_pick;
+}
+
+sub select_recent_courses {
+ my ($r,$roletext)=@_;
+ my $advanced = $ENV{'user.adv'};
+ my $tryagain = $ENV{'form.tryagain'};
+ my %recent=&Apache::lonnet::dump(&recent_filename('recent_roles'));
+ my $numrecent = 0;
+ my $roledisplay = '
'.
+ ''.
+ &mt('Recent courses accessed by DC').
+ ' |
'."\n";
+ foreach my $courseid (sort keys %recent) {
+ unless ($courseid =~/^error\:/) {
+ print STDERR "$courseid\n";
+ my ($dom,$crs) = split/_/,$courseid;
+ $numrecent ++;
+ my $crskey = 'user.role.cc./'.$dom.'/'.$crs;
+ $roledisplay.=$$roletext{$crskey};
+ }
+ }
+ if ($numrecent > 0) {
+ $r->print("$roledisplay\n");
+ }
+}
+
+sub allcourses_row {
+ my $dcdom = shift;
+ my $ccrole = Apache::lonnet::plaintext('cc');
+ my $selectlink = &courselink($dcdom);
+ my $output = ''.
+ ''.
+ ' | '.
+ ''.
+ $ccrole.' | '.&mt('Course').' | '.
+ ''.&mt('All courses').': '.
+ $selectlink.''.
+ ' '.&mt('Domain').':'.$dcdom.''.
+ ' | '.
+ &mt('Course Coordinator access to all courses in domain').
+ ': '.$dcdom.' |
'."\n";
+ return $output;
+}
+
+sub recent_filename {
+ my $area=shift;
+ return 'nohist_recent_'.&Apache::lonnet::escape($area);
+}
+
+sub set_privileges {
+ my ($dcdom,$pickedcourse) = @_;
+ my $area = '/'.$dcdom.'/'.$pickedcourse;
+ my $role = 'cc';
+ my $spec = $role.'.'.$area;
+ my $userroles = &Apache::lonnet::set_arearole($role,$area,'','',$dcdom,$ENV{'user.name'});
+ my %ccrole = ();
+ &Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area);
+ my ($author,$adv)= &Apache::lonnet::set_userprivs(\$userroles,\%ccrole);
+ my @newprivs = split/\n/,$userroles;
+ my %newccroles = ();
+ foreach (@newprivs) {
+ my ($key,$val) = split/=/,$_;
+ $newccroles{$key} = $val;
+ }
+ &Apache::lonnet::appenv(%newccroles);
+ &Apache::lonnet::log($ENV{'user.domain'},
+ $ENV{'user.name'},
+ $ENV{'user.home'},
+ "Role ".$role);
+ &Apache::lonnet::appenv(
+ 'request.role' => $role,
+ 'request.role.domain' => $dcdom,
+ 'request.course.sec' => '');
+ my $tadv=0;
+ if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
+ &Apache::lonnet::appenv('request.role.adv' => $tadv);
}
1;