--- loncom/auth/lonroles.pm 2004/11/09 18:18:02 1.104
+++ loncom/auth/lonroles.pm 2004/12/17 21:44:19 1.115
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.104 2004/11/09 18:18:02 raeburn Exp $
+# $Id: lonroles.pm,v 1.115 2004/12/17 21:44:19 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -82,32 +82,11 @@ sub handler {
my $now=time;
my $then=$ENV{'user.login.time'};
my $envkey;
- my $dcselect='';
-
+ my %dcroles = ();
+ my $numdc = &check_fordc(\%dcroles,$then);
# ================================================================== 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);
@@ -120,6 +99,20 @@ sub handler {
"request.role" => 'cm',
"request.role.adv" => $ENV{'user.adv'},
"request.role.domain" => $ENV{'user.domain'});
+
+# Check if 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;
+ &check_privs($cckey,$then,$now);
+ }
+ last;
+ }
+ }
+ }
+
foreach $envkey (keys %ENV) {
next if ($envkey!~/^user\.role\./);
my ($where,$trolecode,$role,$tstatus,$tend,$tstart);
@@ -128,6 +121,13 @@ sub handler {
if ($tstatus eq 'is') {
$where=~s/^\///;
my ($cdom,$cnum,$csec)=split(/\//,$where);
+# store role if recent_role list being kept
+ if ($ENV{'environment.recentroles'}) {
+ &Apache::lonhtmlcommon::store_recent('roles',
+ $trolecode,' ');
+ }
+
+
# check for keyed access
if (($role eq 'st') &&
($ENV{'course.'.$cdom.'_'.$cnum.'.keyaccess'} eq 'yes')) {
@@ -262,18 +262,6 @@ 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,
@@ -297,12 +285,10 @@ ENDENTERKEY
return OK;
}
if ($role eq 'dc') {
- unless ($dcselect) {
- my $redirect_url = '/adm/menu/';
- &redirect_user($r,&mt('Loading Domain Coordinator Menu'),
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Coordinator Menu'),
$redirect_url);
- return OK;
- }
+ return OK;
}
}
}
@@ -318,7 +304,6 @@ 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
@@ -350,18 +334,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
");
$r->print("
Access : ".
Apache::lonnet::plaintext($priv)."\n");
- $r->print("Resource: $fn\n");
+ $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");
$r->print("Action : $msg\n
");
} else {
if ($ENV{'user.error.msg'}) {
@@ -408,9 +386,6 @@ ENDHEADER
$r->print('>');
}
- my %dcroles = ();
- my $numdc = &check_fordc(\%dcroles,$then);
-
my (%roletext,%sortrole,%roleclass);
my $countactive=0;
my $inrole=0;
@@ -539,8 +514,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;
@@ -565,41 +539,7 @@ ENDHEADER
$sortkey=$role.$twhere;
}
- $roletext.='';
- unless ($nochoose) {
- if (!$button) {
- if ($switchserver) {
- $roletext.=''.&mt('Switch Server').' | ';
- } else {
- $roletext.=(' | ');
- }
- } elsif ($tstatus eq 'is') {
- $roletext.=(' | ');
- } elsif ($tryagain) {
- $roletext.=
- ' | ';
- } elsif ($advanced) {
- $roletext.=
- ' | ';
- } else {
- $roletext.=' | ';
- }
- }
- $tremark.=&Apache::lonannounce::showday(time,1,
- &Apache::lonannounce::readcalendar($tdom.'_'.$trest));
-
- $roletext.=''.$trole.
- ' | '.$ttype.
- ' | '.$twhere.
- ' | '.$tpstart.
- ' | '.$tpend.
- ' | '.$tremark.
- ' |
'."\n";
+ $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$ttype,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver);
$roletext{$envkey}=$roletext;
if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}
$sortrole{$sortkey}=$envkey;
@@ -646,70 +586,52 @@ ENDHEADER
}
if ($haverole) { $doheaders++; }
}
+
+ if ($ENV{'environment.recentroles'}) {
+ my %recent_roles =
+ &Apache::lonhtmlcommon::get_recent('roles',$ENV{'environment.recentrolesn'});
+ my $output='';
+ foreach (sort(keys(%recent_roles))) {
+ if (defined($roletext{'user.role.'.$_})) {
+ $output.=$roletext{'user.role.'.$_};
+ } elsif ($numdc > 0) {
+ unless ($_ =~/^error\:/) {
+ $output.=&display_cc_role('user.role.'.$_);
+ }
+ }
+ }
+ if ($output) {
+ $r->print("".
+ &mt('Recent Roles')." | ");
+ $r->print($output);
+ $r->print("
");
+ $doheaders ++;
+ }
+ }
+
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|cc)\./$dcdom/-) {
- $skiprole = 1;
- last;
+ $r->print(&coursepick_jscript());
+ $r->print(&Apache::loncommon::coursebrowser_javascript());
+ }
+ 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 (($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)." | ");
- }
- $r->print($output);
+ }
+ if ($output) {
+ if ($doheaders > 0) {
+ $r->print("
".
+ "".&mt($type)." |
");
}
- }
+ $r->print($output);
+ }
}
my $tremark='';
my $tfont='#003300';
@@ -810,11 +732,9 @@ 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) {
@@ -827,18 +747,60 @@ sub role_status {
}
}
-sub dc_script {
- my $response = (<<"END");
-function setDCchoice(caller) {
- var dcname = "dc./"+caller+"/"
- document.rolechoice.dcselected.value = caller
- document.rolechoice.elements[3].name = dcname
- document.rolechoice.submit()
+sub build_roletext {
+ my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$ttype,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;
+ my $roletext='';
+ unless ($nochoose) {
+ if (!$button) {
+ if ($switchserver) {
+ $roletext.=''.&mt('Switch Server').' | ';
+ } else {
+ $roletext.=(' | ');
+ }
+ } elsif ($tstatus eq 'is') {
+ $roletext.=(' | ');
+ } elsif ($tryagain) {
+ $roletext.=
+ ' | ';
+ } elsif ($advanced) {
+ $roletext.=
+ ' | ';
+ } else {
+ $roletext.=' | ';
+ }
+ }
+ $tremark.=&Apache::lonannounce::showday(time,1,
+ &Apache::lonannounce::readcalendar($tdom.'_'.$trest));
+
+
+ $roletext.=''.$trole.
+ ' | '.$ttype.
+ ' | '.$twhere.
+ ' | '.$tpstart.
+ ' | '.$tpend.
+ ' | '.$tremark.
+ ' |
'."\n";
+ return $roletext;
}
-END
- return $response;
+
+sub check_privs {
+ my ($cckey,$then,$now) = @_;
+ 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);
+ }
}
-
+
sub check_fordc {
my ($dcroles,$then) = @_;
my $numdc = 0;
@@ -848,19 +810,11 @@ sub check_fordc {
my $dcdom = $1;
my $livedc = 1;
my ($tstart,$tend)=split(/\./,$ENV{$envkey});
- if ($tstart) {
- if ($tstart>$then) {
- $livedc = 0;
- }
- }
- if ($tend) {
- if ($tend<$then) {
- $livedc = 0;
- }
- }
+ if ($tstart && $tstart>$then) { $livedc = 0; }
+ if ($tend && $tend <$then) { $livedc = 0; }
if ($livedc) {
$$dcroles{$dcdom} = $envkey;
- $numdc ++;
+ $numdc++;
}
}
}
@@ -868,151 +822,135 @@ sub check_fordc {
return $numdc;
}
-sub choosecourse_display {
- my ($r,$dcdom,$then,$now) = @_;
- my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'dom');
+sub courselink {
+ my ($dcdom) = @_;
+ my $courseform=&Apache::loncommon::selectcourse_link
+ ('rolechoice','dccourse_'.$dcdom,'dcdomain_'.$dcdom,'coursedesc_'.$dcdom,$dcdom);
+ my $hiddenitems = ''.
+ ''.
+ ''.
+ '';
+ return $courseform.$hiddenitems;
+}
+
+sub coursepick_jscript {
my $verify_script = <<"END";
END
- my $courseform=&Apache::loncommon::selectcourse_link
- ('roles','dccourse','dcdomain','coursedesc');
- $r->print($cb_jscript.$verify_script);
- my $formaction='/adm/roles';
- $formaction=~s/\/+/\//g;
- my $crs;
- &select_recent_courses($r,$dcdom,$then,$now);
- $r->print('
');
- $r->print(''.&mt('Choose a course from domain').': '.$dcdom.'
'.$courseform.'
'.
- ''.
- 'Course Title:
'.
- 'Course ID: '.
- ''.
- ''.
- ''.
- '
'.
- '');
- return;
+ return $verify_script;
+}
+
+sub processpick {
+ my $dcdom = shift;
+ my $process_pick = <<"END";
+
+END
+ return $process_pick;
}
-sub select_recent_courses {
- my ($r,$dcdom,$then,$now)=@_;
+sub display_cc_role {
+ my $rolekey = shift;
+ my $roletext;
my $advanced = $ENV{'user.adv'};
my $tryagain = $ENV{'form.tryagain'};
- my %recent=&Apache::lonnet::dump(&recent_filename('cc_pickby_dc_'.$dcdom));
- my $numrecent = 0;
- my $roletext = ''.&mt('Enter a recently visited course').'
'.
- ''."\n");
- }
+ return $roletext;
+}
+
+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 {
@@ -1020,6 +958,35 @@ sub recent_filename {
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;
__END__