--- loncom/auth/lonroles.pm 2009/05/18 17:30:34 1.224 +++ loncom/auth/lonroles.pm 2012/02/09 01:11:52 1.256.2.6.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.224 2009/05/18 17:30:34 raeburn Exp $ +# $Id: lonroles.pm,v 1.256.2.6.2.3 2012/02/09 01:11:52 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -57,8 +57,7 @@ course they should act on, etc. Both in handler determines via C's C<&allowed> function that a certain action is not allowed, C is used as error handler. This allows the user to select another role which may have permission to do -what they were trying to do. C can also be accessed via the -B button in the Remote Control. +what they were trying to do. =begin latex @@ -138,10 +137,11 @@ use Apache::lonannounce; use Apache::lonlocal; use Apache::lonpageflip(); use Apache::lonnavdisplay(); +use Apache::loncoursequeueadmin; use GDBM_File; use LONCAPA qw(:DEFAULT :match); use HTML::Entities; - + sub redirect_user { my ($r,$title,$url,$msg,$launch_nav) = @_; @@ -152,13 +152,18 @@ sub redirect_user { my $swinfo=&Apache::lonmenu::rawconfig(); my $navwindow; if ($launch_nav eq 'on') { - $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef, - ($url =~ m-^/adm/whatsnew-)); + $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef, + ($url =~ m-^/adm/whatsnew-)); } else { - $navwindow.=&Apache::lonnavmaps::close(); + $navwindow.=&Apache::lonnavmaps::close(); } + + # Breadcrumbs + my $brcrum = [{'href' => $url, + 'text' => 'Switching Role'},]; my $start_page = &Apache::loncommon::start_page('Switching Role',undef, - {'redirect' => [1,$url],}); + {'redirect' => [1,$url], + 'bread_crumbs' => $brcrum,}); my $end_page = &Apache::loncommon::end_page(); # Note to style police: @@ -167,7 +172,9 @@ sub redirect_user { $r->print(< +// $navwindow

$msg

@@ -182,13 +189,25 @@ sub error_page { &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; - $r->print(&Apache::loncommon::start_page('Problems during Course Initialization'). - ''. - '

'.&mt('The following problems occurred:'). + # Breadcrumbs + my $brcrum = [{'href' => $dest, + 'text' => 'Problems during Course Initialization'},]; + $r->print(&Apache::loncommon::start_page('Problems during Course Initialization', + undef, + {'bread_crumbs' => $brcrum,}) + ); + $r->print( + ''. + '

'.&mt('The following problems occurred:'). + '
'. $error. - '


'.&mt('Continue').''. - &Apache::loncommon::end_page()); + '


'.&mt('Continue').'' + ); + $r->print(&Apache::loncommon::end_page()); } sub handler { @@ -197,10 +216,36 @@ sub handler { my $now=time; my $then=$env{'user.login.time'}; + my $refresh=$env{'user.refresh.time'}; + my $update=$env{'user.update.time'}; + if (!$refresh) { + $refresh = $then; + } + if (!$update) { + $update = $then; + } + +# -------------------------------------------------------- Check for new roles + my $updateresult; + if ($env{'form.doupdate'}) { + my $show_course=&Apache::loncommon::show_course(); + my $checkingtxt; + if ($show_course) { + $checkingtxt = &mt('Checking for new courses ...'); + } else { + $checkingtxt = &mt('Checking for new roles ...'); + } + $updateresult = ''.$checkingtxt.''; + $updateresult .= &update_session_roles(); + &Apache::lonnet::appenv({'user.update.time' => $now}); + $update = $now; + } + my $envkey; my %dcroles = (); - my $numdc = &check_fordc(\%dcroles,$then); + my $numdc = &check_fordc(\%dcroles,$update,$then); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); + my $loncaparev = $Apache::lonnet::perlvar{'lonVersion'}; # ================================================================== Roles Init if ($env{'form.selectrole'}) { @@ -214,8 +259,17 @@ sub handler { if ($env{'request.course.id'}) { # Check if user is CC trying to select a course role if ($env{'form.switchrole'}) { - if (!defined($env{'user.role.'.$env{'form.switchrole'}})) { - &adhoc_course_role($then); + my $switch_is_active; + if (defined($env{'user.role.'.$env{'form.switchrole'}})) { + my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}}); + if (!$end || $end > $now) { + if (!$start || $start < $update) { + $switch_is_active = 1; + } + } + } + unless ($switch_is_active) { + &adhoc_course_role($refresh,$update,$then); } } my %temp=('logout_'.$env{'request.course.id'} => time); @@ -232,12 +286,12 @@ sub handler { # 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)$-)) { +# Is this an ad-hoc Coordinator role? + if (my ($ccrole,$domain,$coursenum) = + ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) { if ($dcroles{$domain}) { &Apache::lonnet::check_adhoc_privs($domain,$coursenum, - $then,$now,'cc'); + $update,$refresh,$now,$ccrole); } last; } @@ -250,7 +304,7 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if ($server_status eq 'switchserver') { my $trolecode = 'au./'.$domain.'/'; - my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; + my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } last; @@ -261,7 +315,7 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if ($server_status eq 'switchserver') { my $trolecode = 'ca./'.$domain.'/'.$user; - my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; + my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } last; @@ -277,12 +331,12 @@ sub handler { if ($dcroles{$domain}) { my ($server_status,$home) = &check_author_homeserver($user,$domain); if (($server_status eq 'ok') || ($server_status eq 'switchserver')) { - &Apache::lonnet::check_adhoc_privs($domain,$user,$then, - $now,'ca'); + &Apache::lonnet::check_adhoc_privs($domain,$user,$update, + $refresh,$now,'ca'); if ($server_status eq 'switchserver') { my $trolecode = 'ca./'.$domain.'/'.$user; my $switchserver = '/adm/switchserver?' - .'otherserver='.$home.'&role='.$trolecode; + .'otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } } else { @@ -299,12 +353,48 @@ sub handler { foreach $envkey (keys %env) { next if ($envkey!~/^user\.role\./); my ($where,$trolecode,$role,$tstatus,$tend,$tstart); - &Apache::lonnet::role_status($envkey,$then,$now,\$role,\$where, + &Apache::lonnet::role_status($envkey,$update,$refresh,$now,\$role,\$where, \$trolecode,\$tstatus,\$tstart,\$tend); if ($env{'form.'.$trolecode}) { if ($tstatus eq 'is') { $where=~s/^\///; my ($cdom,$cnum,$csec)=split(/\//,$where); + if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) { + my $home = $env{'course.'.$cdom.'_'.$cnum.'.home'}; + my @ids = &Apache::lonnet::current_machine_ids(); + unless ($loncaparev eq '' && $home && grep(/^\Q$home\E$/,@ids)) { + my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); + if ($curr_reqd_hash{'internal.releaserequired'} ne '') { + my ($switchserver,$switchwarning) = + &check_release_required($loncaparev,$cdom.'_'.$cnum,$trolecode,$curr_reqd_hash{'internal.releaserequired'}); + if ($switchwarning ne '' || $switchserver ne '') { + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); + $r->send_http_header; + my $end_page=&Apache::loncommon::end_page(); + $r->print(&Apache::loncommon::start_page('Selected course unavailable on this server'). + '

'); + if ($switchwarning) { + $r->print($switchwarning.'
'); + if (&Apache::loncommon::show_course()) { + $r->print(&mt('Display courses')); + } else { + $r->print(&mt('Display roles')); + } + $r->print(''); + } elsif ($switchserver) { + $r->print(&mt('This course requires a newer version of LON-CAPA than is installed on this server.'). + '
'. + ''. + &mt('Switch Server'). + ''); + } + $r->print('

'.&Apache::loncommon::end_page()); + return OK; + } + } + } + } # check for course groups my %coursegroups = &Apache::lonnet::get_active_groups( $env{'user.domain'},$env{'user.name'},$cdom, $cnum); @@ -367,9 +457,11 @@ sub handler { $r->print(< +// -
+ $message
@@ -390,9 +482,11 @@ ENDENTEREDKEY $r->print(< +// - + @@ -420,6 +514,11 @@ ENDENTERKEY my $msg; my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + unless (($ferr) || ($env{'form.switchrole'})) { + &Apache::lonnet::put('nohist_crslastlogin', + {$env{'user.name'}.':'.$env{'user.domain'}. + ':'.$csec.':'.$role => $now},$cdom,$cnum); + } if (($env{'form.orgurl'}) && ($env{'form.orgurl'}!~/^\/adm\/flip/)) { my $dest=$env{'form.orgurl'}; @@ -436,6 +535,12 @@ ENDENTERKEY if (($ferr) && ($tadv)) { &error_page($r,$ferr,$dest); } else { + if ($dest =~ m{^/adm/coursedocs\?folderpath}) { + if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { + my $chome = &Apache::lonnet::homeserver($cnum,$cdom); + &update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum); + } + } $r->internal_redirect($dest); } return OK; @@ -464,8 +569,8 @@ ENDENTERKEY $courseid = substr($courseid, 1); } $courseid =~ s/\//_/; - if ($role eq 'cc' && $env{'course.' . $courseid . - '.course.helper.not.run'}) { + if ((($role eq 'cc') || ($role eq 'co')) + && ($env{'course.' . $courseid .'.course.helper.not.run'})) { $furl = "/adm/helper/course.initialization.helper"; # Send the user to the course they selected } elsif ($env{'request.course.id'}) { @@ -475,10 +580,10 @@ ENDENTERKEY my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&'); $dest .= '?symb='.$esc_symb; } - &redirect_user($r,&mt('Entering [_1]', - $env{'course.'.$courseid.'.description'}), - $dest,$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r, &mt('Entering [_1]', + $env{'course.'.$courseid.'.description'}), + $dest, $msg, + $env{'environment.remotenavmap'}); return OK; } if (&Apache::lonnet::allowed('whn', @@ -491,24 +596,26 @@ ENDENTERKEY unless ($startpage eq 'firstres') { $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); - &redirect_user($r,&mt('New in course'), - '/adm/whatsnew?refpage=start',$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r,&mt('New in course'), + '/adm/whatsnew?refpage=start',$msg, + $env{'environment.remotenavmap'}); return OK; } } } # Are we allowed to look at the first resource? - if ($furl !~ m|^/adm/|) { + if (($furl !~ m|^/adm/|) || + (($env{'environment.remotenavmap'} eq 'on') && + ($furl =~ m{^/adm/navmaps}))) { # Guess not ... $furl=&Apache::lonpageflip::first_accessible_resource(); } $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); - &redirect_user($r,&mt('Entering [_1]', - $env{'course.'.$courseid.'.description'}), - $furl,$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r,&mt('Entering [_1]', + $env{'course.'.$courseid.'.description'}), + $furl,$msg, + $env{'environment.remotenavmap'}); } return OK; } @@ -576,6 +683,7 @@ $start_page $noscript ENDHEADER @@ -642,218 +758,98 @@ ENDHEADER if ($reinit) { $r->print( '

'. - &mt('As your session file for the course has expired, you will need to re-select the course.').'

'); + &mt('As your session file for the course or community has expired, you will need to re-select it.').''); } else { $r->print( '

'. - &mt('You need to choose another user role or enter a specific course for this function').'

'); + &mt('You need to choose another user role or enter a specific course or community for this function.'). + ''); } } } # -------------------------------------------------------- Choice or no choice? if ($nochoose) { - $r->print("

".&mt('Sorry ...')."

\n". - &mt('This action is currently not authorized.').''. - &Apache::loncommon::end_page()); - return OK; + $r->print("

".&mt('Sorry ...')."

\n". + &mt('This action is currently not authorized.').''. + &Apache::loncommon::end_page()); + return OK; } else { + $r->print($updateresult); if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) { - $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'}; + $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'}; } $r->print(''); $r->print(''); $r->print(''); $r->print(''); } - my (%roletext,%sortrole,%roleclass); - my $countactive=0; - my $countfuture=0; - my $countwill=0; - my $inrole=0; - my $possiblerole=''; - my %futureroles; - my %roles_nextlogin; - my %timezones; - foreach $envkey (sort keys %env) { - my $button = 1; - my $switchserver=''; - my ($roletext,$roletext_end); - my $sortkey; - if ($envkey=~/^user\.role\./) { - my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); - &Apache::lonnet::role_status($envkey,$then,$now,\$role,\$where, - \$trolecode,\$tstatus,\$tstart,\$tend); - next if (!defined($role) || $role eq '' || $role =~ /^gr/); - my $timezone = &role_timezone($where,\%timezones); - $tremark=''; - $tpstart=' '; - $tpend=' '; - if ($tstart) { - $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone); - } - if ($tend) { - $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone); - } - if ($env{'request.role'} eq $trolecode) { - $tstatus='selected'; - } - my $tbg; - if (($tstatus eq 'is') - || ($tstatus eq 'selected') - || ($tstatus eq 'will') - || ($tstatus eq 'future') - || ($env{'form.showall'})) { - if ($tstatus eq 'is') { - $tbg='LC_roles_is'; - $possiblerole=$trolecode; - $countactive++; - } elsif ($tstatus eq 'future') { - $tbg='LC_roles_future'; - $button=0; - $futureroles{$trolecode} = $tstart.':'.$tend; - $countfuture ++; - } elsif ($tstatus eq 'will') { - $tbg='LC_roles_will'; - $tremark.=&mt('Active at next login.').' '; - $roles_nextlogin{$trolecode} = $tstart.':'.$tend; - $countwill ++; - } elsif ($tstatus eq 'expired') { - $tbg='LC_roles_expired'; - $button=0; - } elsif ($tstatus eq 'will_not') { - $tbg='LC_roles_will_not'; - $tremark.=&mt('Expired after logout.').' '; - } elsif ($tstatus eq 'selected') { - $tbg='LC_roles_selected'; - $inrole=1; - $countactive++; - $tremark.=&mt('Currently selected.').' '; - } - my $trole; - if ($role =~ /^cr\//) { - my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role); - if ($tremark) { $tremark.='
'; } - $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain); - } - $trole=Apache::lonnet::plaintext($role); - my $ttype; - my $twhere; - my ($tdom,$trest,$tsection)= - split(/\//,Apache::lonnet::declutter($where)); - # First, Co-Authorship roles - if (($role eq 'ca') || ($role eq 'aa')) { - my $home = &Apache::lonnet::homeserver($trest,$tdom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; - } - #next if ($home eq 'no_host'); - $home = &Apache::lonnet::hostname($home); - $ttype='Construction Space'; - $twhere=&mt('User').': '.$trest.'
'.&mt('Domain'). - ': '.$tdom.'
'. - ' '.&mt('Server').': '.$home; - $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; - $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/'); - $sortkey=$role."$trest:$tdom"; - } elsif ($role eq 'au') { - # Authors - my $home = &Apache::lonnet::homeserver - ($env{'user.name'},$env{'user.domain'}); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; - } - #next if ($home eq 'no_host'); - $home = &Apache::lonnet::hostname($home); - $ttype='Construction Space'; - $twhere=&mt('Domain').': '.$tdom.'
'.&mt('Server'). - ': '.$home; - $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; - $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/'); - $sortkey=$role; - } elsif ($trest) { - my $tcourseid=$tdom.'_'.$trest; - $ttype = &Apache::loncommon::course_type($tcourseid); - $trole = &Apache::lonnet::plaintext($role,$ttype); - if ($env{'course.'.$tcourseid.'.description'}) { - $twhere=$env{'course.'.$tcourseid.'.description'}; - $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; - unless ($twhere eq &mt('Currently not available')) { - $twhere.=' '. - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). - ''; - } - } else { - my %newhash=&Apache::lonnet::coursedescription($tcourseid); - if (%newhash) { - $sortkey=$role."\0".$tdom."\0".$newhash{'description'}. - "\0".$envkey; - $twhere=$newhash{'description'}. - ' '. - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). - ''; - $ttype = $newhash{'type'}; - $trole = &Apache::lonnet::plaintext($role,$ttype); - } else { - $twhere=&mt('Currently not available'); - $env{'course.'.$tcourseid.'.description'}=$twhere; - $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; - $ttype = 'Unavailable'; - } - } - if ($tsection) { - $twhere.='
'.&mt('Section').': '.$tsection; - } - if ($role ne 'st') { $twhere.="
".&mt('Domain').":".$tdom; } - } elsif ($tdom) { - $ttype='Domain'; - $twhere=$tdom; - $sortkey=$role.$twhere; - } else { - $ttype='System'; - $twhere=&mt('system wide'); - $sortkey=$role.$twhere; - } - ($roletext,$roletext_end) = - &build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain, - $advanced,$tremark,$tbg,$trole,$twhere,$tpstart, - $tpend,$nochoose,$button,$switchserver,$reinit); - $roletext{$envkey}=[$roletext,$roletext_end]; - if (!$sortkey) {$sortkey=$twhere."\0".$envkey;} - $sortrole{$sortkey}=$envkey; - $roleclass{$envkey}=$ttype; - } - } + $r->rflush(); + + my (%roletext,%sortrole,%roleclass,%futureroles,%timezones); + my ($countactive,$countfuture,$inrole,$possiblerole) = + &gather_roles($update,$refresh,$now,$reinit,$nochoose,\%roletext,\%sortrole,\%roleclass, + \%futureroles,\%timezones,$loncaparev); + $refresh = $now; + &Apache::lonnet::appenv({'user.refresh.time' => $refresh}); + my $updatebutton = &mt('Check for role changes'); + my $show_course=&Apache::loncommon::show_course(); + if ($show_course) { + $updatebutton = &mt('Check for new courses'); + } + my $do_update; + unless (($env{'form.source'} eq 'login') || ($env{'form.doupdate'})) { + $do_update = ''. + ''; } if ($env{'user.adv'}) { - $r->print( - '

'); + my $showall = '