--- loncom/auth/lonroles.pm 2004/11/09 18:18:02 1.104 +++ 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.104 2004/11/09 18:18:02 raeburn Exp $ +# $Id: lonroles.pm,v 1.109 2004/11/12 23:29:55 raeburn 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,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); @@ -262,14 +263,12 @@ 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'}) { + # 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('cc_pickby_dc_'.$dcdom, + &Apache::lonhtmlcommon::store_recent('recent_roles', $courseid,$formaction); } } @@ -297,12 +296,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 +315,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,12 +345,6 @@ 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

"); @@ -408,9 +397,6 @@ ENDHEADER $r->print('>'); } - my %dcroles = (); - my $numdc = &check_fordc(\%dcroles,$then); - my (%roletext,%sortrole,%roleclass); my $countactive=0; my $inrole=0; @@ -539,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; @@ -647,69 +632,27 @@ ENDHEADER if ($haverole) { $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; + &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 (($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 +753,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 +768,6 @@ 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() -} -END - return $response; -} - sub check_fordc { my ($dcroles,$then) = @_; my $numdc = 0; @@ -848,19 +777,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,21 +789,34 @@ 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 $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 - 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)=@_; + my ($r,$roletext)=@_; my $advanced = $ENV{'user.adv'}; my $tryagain = $ENV{'form.tryagain'}; - my %recent=&Apache::lonnet::dump(&recent_filename('cc_pickby_dc_'.$dcdom)); + my %recent=&Apache::lonnet::dump(&recent_filename('recent_roles')); my $numrecent = 0; - my $roletext = '

'.&mt('Enter a recently visited course').'

'. - '
'. - ''. - ''."\n". - ''. + my $roledisplay = ''. ''."\n"; foreach my $courseid (sort keys %recent) { unless ($courseid =~/^error\:/) { + print STDERR "$courseid\n"; my ($dom,$crs) = split/_/,$courseid; - if ($dom eq $dcdom) { - $numrecent ++; - my $crskey = 'user.role.cc./'.$dom.'/'.$crs; - my ($where,$trolecode,$role,$tstatus,$tend,$tstart,$tbg,$tfont,$tremark,$inrole,$tpstart,$tpend); - my $button = 1; - &role_status($crskey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); - if ($tstart) { - $tpstart=&Apache::lonlocal::locallocaltime($tstart); - } - if ($tend) { - $tpend=&Apache::lonlocal::locallocaltime($tend); - } - my $ttype = &mt('Course'); - my $twhere; - if ($ENV{'course.'.$courseid.'.description'}) { - $twhere=$ENV{'course.'.$courseid.'.description'}; - } - my ($tdom,$trest,$tsection)= - split(/\//,Apache::lonnet::declutter($where)); - if ($ENV{'request.role'} eq $trolecode) { - $tstatus='selected'; - } - if ($tstatus eq 'is') { - $tbg='#77FF77'; - $tfont='#003300'; - } elsif ($tstatus eq 'future') { - $tbg='#FFFF77'; - $button=0; - } elsif ($tstatus eq 'will') { - $tbg='#FFAA77'; - $tremark.=&mt('Active at next login. '); - } elsif ($tstatus eq 'expired') { - $tbg='#FF7777'; - $tfont='#330000'; - $button=0; - } elsif ($tstatus eq 'will_not') { - $tbg='#AAFF77'; - $tremark.=&mt('Expired after logout. '); - } elsif ($tstatus eq 'selected') { - $tbg='#11CC55'; - $tfont='#002200'; - $inrole=1; - $tremark.=&mt('Currently selected. '); - } - my $trole=Apache::lonnet::plaintext($role); - $roletext.=''; - if (!$button) { - $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.=''."\n"; - } + $numrecent ++; + my $crskey = 'user.role.cc./'.$dom.'/'.$crs; + $roledisplay.=$$roletext{$crskey}; } } if ($numrecent > 0) { - $r->print($roletext.'
 '.&mt('User Role').''.&mt('Extent'). - ''.&mt('Start').''.&mt('End').''. - &mt('Remarks and Calendar Announcements').'
'. - &mt('Domain').' - '.&mt('Recent courses accessed in this domain'). + &mt('Recent courses accessed by DC'). '
  '.$trole. - ''.$ttype. - ''.$twhere. - ''.$tpstart. - ''.$tpend. - ''.$tremark. - ' 
'."\n"); + $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; __END__