--- loncom/auth/lonroles.pm 2008/03/10 23:47:24 1.185 +++ loncom/auth/lonroles.pm 2008/05/15 01:00:37 1.192 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.185 2008/03/10 23:47:24 raeburn Exp $ +# $Id: lonroles.pm,v 1.192 2008/05/15 01:00:37 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -106,6 +106,10 @@ sub handler { # ================================================================== Roles Init if ($env{'form.selectrole'}) { + + my $locknum=&Apache::lonnet::get_locks(); + if ($locknum) { return 409; } + if ($env{'form.newrole'}) { $env{'form.'.$env{'form.newrole'}}=1; } @@ -120,19 +124,31 @@ sub handler { &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" => '', - "request.course.sec" => '', - "request.role" => 'cm', - "request.role.adv" => $env{'user.adv'}, - "request.role.domain" => $env{'user.domain'}); + &Apache::lonnet::appenv({"request.course.id" => '', + "request.course.fn" => '', + "request.course.uri" => '', + "request.course.sec" => '', + "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 or author space and needs privs to be created if ($numdc > 0) { foreach my $envkey (keys %env) { # Is this an ad-hoc CC-role? if (my ($domain,$coursenum) = ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) { + # See if that is even allowed + my %crsenv=&Apache::lonnet::get('environment',['internal.courseowner'],$domain,$coursenum); + # First find course owner + my ($owneruser,$ownerdomain)=split(/\:/,$crsenv{'internal.courseowner'}); + # Check if course owner blocked cc-access + if (($owneruser) && ($ownerdomain)) { + my %blocked=&Apache::lonnet::get('environment',['domcoord.cc'],$ownerdomain,$owneruser); + if ($blocked{'domcoord.cc'} eq 'blocked') { + $env{'user.error.msg'}=':::1:Course owner '.$owneruser.' in domain '.$ownerdomain.' blocked domain coordinator access'; + last; + } + } if ($dcroles{$domain}) { &check_privs($domain,$coursenum,$then,$now,'cc'); } @@ -141,6 +157,13 @@ sub handler { # Is this a recent ad-hoc CA-role? if (my ($domain,$user) = ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) { + # See if still allowed + 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; + } if (($dcroles{$domain}) && (&is_author_homeserver($user,$domain))) { &check_privs($domain,$user,$then,$now,'ca'); } else { @@ -151,9 +174,15 @@ sub handler { # Is this a new ad-hoc CA-role? if (my ($domain) = ($envkey =~ m-^form\.adhocca\./($match_domain)$-)) { + my $user=$env{'form.adhoccauname.'.$domain}; + if (!$user) { $user=$env{'form.adhoccaunamerecent.'.$domain} }; + # See if that is even allowed + my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user); + if ($blocked{'domcoord.author'} eq 'blocked') { + $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access'; + last; + } if ($dcroles{$domain}) { - my $user=$env{'form.adhoccauname.'.$domain}; - if (!$user) { $user=$env{'form.adhoccaunamerecent.'.$domain} }; if (($user) && ($user=~/$match_username/) && (&is_author_homeserver($user,$domain))) { &check_privs($domain,$user,$then,$now,'ca'); $env{'form.ca./'.$domain.'/'.$user}=1; @@ -274,10 +303,10 @@ ENDENTERKEY "Role ".$trolecode); &Apache::lonnet::appenv( - 'request.role' => $trolecode, - 'request.role.domain' => $cdom, - 'request.course.sec' => $csec, - 'request.course.groups' => $cgrps); + {'request.role' => $trolecode, + 'request.role.domain' => $cdom, + 'request.course.sec' => $csec, + 'request.course.groups' => $cgrps}); my $tadv=0; if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) { @@ -288,7 +317,7 @@ ENDENTERKEY ($env{'form.orgurl'}!~/^\/adm\/flip/)) { my $dest=$env{'form.orgurl'}; if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv('request.role.adv'=>$tadv); + &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); if (($ferr) && ($tadv)) { &error_page($r,$ferr,$dest); } else { @@ -298,7 +327,7 @@ ENDENTERKEY } else { if (!$env{'request.course.id'}) { &Apache::lonnet::appenv( - "request.course.id" => $cdom.'_'.$cnum); + {"request.course.id" => $cdom.'_'.$cnum}); $furl='/adm/roles?tryagain=1'; $msg= '

'. @@ -307,7 +336,7 @@ ENDENTERKEY '

'.&mt('Please try again.').'

'.$ferr; } if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv('request.role.adv'=>$tadv); + &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); if (($ferr) && ($tadv)) { &error_page($r,$ferr,$furl); @@ -447,16 +476,16 @@ ENDHEADER # -------------------------------------------------------- Generate Page Output # --------------------------------------------------------------- Error Header? if ($error) { - $r->print("

LON-CAPA Access Control

"); + $r->print("

".&mt('LON-CAPA Access Control')."

"); $r->print("
");
 	if ($priv ne '') {
-	    $r->print("Access  : ".&Apache::lonnet::plaintext($priv)."\n");
+            $r->print(&mt('Access  : ').&Apache::lonnet::plaintext($priv)."\n");
 	}
 	if ($fn ne '') {
-	    $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");
+            $r->print(&mt('Resource: ').&Apache::lonenc::check_encrypt($fn)."\n");
 	}
 	if ($msg ne '') {
-	    $r->print("Action  : $msg\n");
+            $r->print(&mt('Action  : ').$msg."\n");
 	}
 	$r->print("

"); my $url=$fn; @@ -501,8 +530,12 @@ ENDHEADER my (%roletext,%sortrole,%roleclass); my $countactive=0; + my $countfuture=0; + my $countwill=0; my $inrole=0; my $possiblerole=''; + my %futureroles; + my %roles_nextlogin; foreach $envkey (sort keys %env) { my $button = 1; my $switchserver=''; @@ -539,9 +572,13 @@ ENDHEADER } elsif ($tstatus eq 'future') { $tbg='#FFFF77'; $button=0; + $futureroles{$trolecode} = $tstart.':'.$tend; + $countfuture ++; } elsif ($tstatus eq 'will') { $tbg='#FFAA77'; $tremark.=&mt('Active at next login. '); + $roles_nextlogin{$trolecode} = $tstart.':'.$tend; + $countwill ++; } elsif ($tstatus eq 'expired') { $tbg='#FF7777'; $tfont='#330000'; @@ -664,7 +701,30 @@ ENDHEADER } else { $r->print('

'.&mt('Currently no active roles or courses').'

'); } - $r->print(''.&Apache::loncommon::end_page()); + &findcourse_advice($r); + $r->print(''); + if ($countfuture) { + $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture)); + my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole, + $nochoose); + &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles, + \%roletext); + my $tremark=''; + my $tfont='#003300'; + if ($env{'request.role'} eq 'cm') { + $r->print(''); + $tremark=&mt('Currently selected. '); + $tfont='#002200'; + } else { + $r->print(''); + } + $r->print(''.&mt('No role specified'). + ''.$tremark. + ' '."\n"); + + $r->print(''); + } + $r->print(&Apache::loncommon::end_page()); return OK; # Is there only one choice? } elsif (($countactive==1) && ($env{'request.role'} eq 'cm')) { @@ -682,21 +742,7 @@ ENDHEADER unless ((!&Apache::lonmenu::show_course()) || ($nochoose)) { $r->print("

".&mt('Select a Course to Enter')."

\n"); } - $r->print('
'); - unless ($nochoose) { $r->print(''); } - $r->print(''."\n"); - my $doheaders=-1; - foreach my $type ('Domain','Construction Space','Course','Unavailable','System') { - my $haverole=0; - foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { - if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) { - $haverole=1; - } - } - if ($haverole) { $doheaders++; } - } - + my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose); if ($env{'environment.recentroles'}) { my %recent_roles = &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'}); @@ -706,8 +752,7 @@ ENDHEADER $output.=$roletext{'user.role.'.$_}; if ($_ =~ m-dc\./($match_domain)/- && $dcroles{$1}) { - $output .= &allcourses_row($1,'recent'). - &allcoauthors_row($1,'recent'); + $output .= &adhoc_roles_row($1,'recent'); } } elsif ($numdc > 0) { unless ($_ =~/^error\:/) { @@ -717,9 +762,8 @@ ENDHEADER } if ($output) { $r->print(""); + &mt('Recent Roles').""); $r->print($output); - $r->print(""); $doheaders ++; } } @@ -728,27 +772,7 @@ ENDHEADER $r->print(&coursepick_jscript()); $r->print(&Apache::loncommon::coursebrowser_javascript()); } - foreach my $type ('Construction Space','Domain','Course','Unavailable','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\./($match_domain)/-) { - if ($dcroles{$1}) { - $output .= &allcourses_row($1,''). - &allcoauthors_row($1,''); - } - } - } - } - if ($output) { - if ($doheaders > 0) { - $r->print("". - ""); - } - $r->print($output); - } - } + &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext); my $tremark=''; my $tfont='#003300'; if ($env{'request.role'} eq 'cm') { @@ -761,13 +785,13 @@ ENDHEADER unless ($nochoose) { if ($env{'request.role'} ne 'cm') { $r->print(''); + &mt('Select').'" name="cm" />'); } else { $r->print(''); } } $r->print(''."\n"); $r->print('
 '.&mt('User Role').''.&mt('Extent'). - ''.&mt('Start').''.&mt('End').'
". - &mt('Recent Roles')."
".&mt($type)."
 '.&mt('No role specified'). - ''.$tremark. + ''.$tremark. ' 
'); @@ -789,6 +813,87 @@ ENDHEADER return OK; } +sub roletable_headers { + my ($r,$roleclass,$sortrole,$nochoose) = @_; + my $doheaders; + if ((ref($sortrole) eq 'HASH') && (ref($roleclass) eq 'HASH')) { + $r->print('
'); + if (!$nochoose) { $r->print(''); } + $r->print(''."\n"); + $doheaders=-1; + my @roletypes = &roletypes(); + foreach my $type (@roletypes) { + my $haverole=0; + foreach my $which (sort {uc($a) cmp uc($b)} (keys(%{$sortrole}))) { + if ($roleclass->{$sortrole->{$which}} =~ /^\Q$type\E/) { + $haverole=1; + } + } + if ($haverole) { $doheaders++; } + } + } + return $doheaders; +} + +sub roletypes { + my @types = ('Domain','Construction Space','Course','Unavailable','System'); + return @types; +} + +sub print_rolerows { + my ($r,$doheaders,$roleclass,$sortrole,$dcroles,$roletext) = @_; + if ((ref($roleclass) eq 'HASH') && (ref($sortrole) eq 'HASH')) { + my @types = &roletypes(); + foreach my $type (@types) { + my $output; + foreach my $which (sort {uc($a) cmp uc($b)} (keys(%{$sortrole}))) { + if ($roleclass->{$sortrole->{$which}} =~ /^\Q$type\E/) { + if (ref($roletext) eq 'HASH') { + $output.=$roletext->{$sortrole->{$which}}; + if ($sortrole->{$which} =~ m-dc\./($match_domain)/-) { + if (ref($dcroles) eq 'HASH') { + if ($dcroles->{$1}) { + $output .= &adhoc_roles_row($1,''); + } + } + } + } + } + } + if ($output) { + if ($doheaders > 0) { + $r->print("". + ""); + } + $r->print($output); + } + } + } +} + +sub findcourse_advice { + my ($r) = @_; + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + if (&check_autoenroll($env{'user.domain'})) { + $r->print(&mt('If you were expecting to see an active role listed for a particular course in the [_1] domain, it may be missing for one of the following reasons:',$domdesc).' +'); + } 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.').'
'); + } + $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 privileges_info { my ($which) = @_; my $output; @@ -889,17 +994,17 @@ sub build_roletext { } elsif ($tstatus eq 'is') { $roletext.=''; + $trolecode."','".$buttonname.'\');" />'; } elsif ($tryagain) { $roletext.= ''; + $trolecode."','".$buttonname.'\');" />'; } elsif ($advanced) { $roletext.= ''; + $trolecode."','".$buttonname.'\');" />'; } else { $roletext.=' '; } @@ -1008,7 +1113,7 @@ sub adhoc_course_role { &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups); my $adhocstart = $then-1; $userroles{'user.role.'.$spec} = $adhocstart.'.'; - &Apache::lonnet::appenv(%userroles); + &Apache::lonnet::appenv(\%userroles,[$role,'cm']); } } } @@ -1117,28 +1222,23 @@ sub display_cc_role { return ($roletext); } -sub allcourses_row { +sub adhoc_roles_row { my ($dcdom,$rowtype) = @_; my $output = ''. - ' '. + ''."\n"; return $output; } @@ -1158,19 +1258,19 @@ sub set_privileges { my %ccrole = (); &Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area); my ($author,$adv)= &Apache::lonnet::set_userprivs(\%userroles,\%ccrole); - &Apache::lonnet::appenv(%userroles); + &Apache::lonnet::appenv(\%userroles,[$role,'cm']); &Apache::lonnet::log($env{'user.domain'}, $env{'user.name'}, $env{'user.home'}, "Role ".$role); &Apache::lonnet::appenv( - 'request.role' => $spec, + {'request.role' => $spec, 'request.role.domain' => $dcdom, - 'request.course.sec' => ''); + 'request.course.sec' => ''}); my $tadv=0; if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv('request.role.adv' => $tadv); + &Apache::lonnet::appenv({'request.role.adv' => $tadv}); } sub courseloadpage { @@ -1190,6 +1290,24 @@ 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__
 '.&mt('User Role').''.&mt('Extent') + .''.&mt('Start').''.&mt('End') + .'
". + &mt($type)."
'; + ' '."\n"; - return $output; -} - -sub allcoauthors_row { - my ($dcdom,$rowtype) = @_; - my $output = ''. - ' '."\n"; + &mt('[_1]: [_2]',$ccrole,$selectlink). + '
' + .&mt('[_1]Ad hoc[_2] roles in domain [_3] --', + '','',$dcdom).''; my $selectlink = &courselink($dcdom,$rowtype); my $ccrole = &Apache::lonnet::plaintext('cc'); - $output.= ''. - &mt('[_1]: [_2] from domain [_3]',$ccrole,$selectlink,$dcdom). - '
'; my $carole = &Apache::lonnet::plaintext('ca'); my $inputlink=''; my $gobutton=''; $output.= ''. - &mt('[_1]: [_2] in domain [_3] [_4]',$carole,$inputlink,$dcdom,$gobutton). - '
  '. + &mt('[_1]: [_2] [_3]',$carole,$inputlink,$gobutton). + '