--- loncom/auth/lonroles.pm 2010/06/02 16:26:21 1.251 +++ loncom/auth/lonroles.pm 2010/09/02 17:06:38 1.259 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.251 2010/06/02 16:26:21 raeburn Exp $ +# $Id: lonroles.pm,v 1.259 2010/09/02 17:06:38 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -210,6 +210,7 @@ sub handler { my %dcroles = (); my $numdc = &check_fordc(\%dcroles,$then); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); + my $loncaparev = $Apache::lonnet::perlvar{'lonVersion'}; # ================================================================== Roles Init if ($env{'form.selectrole'}) { @@ -223,7 +224,16 @@ 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'}})) { + 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 < $refresh) { + $switch_is_active = 1; + } + } + } + unless ($switch_is_active) { &adhoc_course_role($refresh,$then); } } @@ -314,6 +324,42 @@ sub handler { 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); @@ -449,6 +495,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; @@ -678,11 +730,12 @@ ENDHEADER $r->print(''); $r->print(''); } + $r->rflush(); my (%roletext,%sortrole,%roleclass,%futureroles,%timezones); my ($countactive,$countfuture,$inrole,$possiblerole) = &gather_roles($then,$refresh,$now,$reinit,$nochoose,\%roletext,\%sortrole,\%roleclass, - \%futureroles,\%timezones); + \%futureroles,\%timezones,$loncaparev); $refresh = $now; &Apache::lonnet::appenv({'user.refresh.time' => $refresh}); @@ -793,12 +846,16 @@ ENDHEADER } elsif ($numdc > 0) { unless ($role =~/^error\:/) { my ($roletext,$role_text_end) = &display_cc_role('user.role.'.$role); - $output.= &Apache::loncommon::start_data_table_row(). - $roletext. - &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::continue_data_table_row(). - $role_text_end. - &Apache::loncommon::end_data_table_row(); + if ($roletext) { + $output.= &Apache::loncommon::start_data_table_row(). + $roletext. + &Apache::loncommon::end_data_table_row(); + if ($role_text_end) { + $output .= &Apache::loncommon::continue_data_table_row(). + $role_text_end. + &Apache::loncommon::end_data_table_row(); + } + } } } } @@ -864,29 +921,24 @@ ENDHEADER } sub gather_roles { - my ($then,$refresh,$now,$reinit,$nochoose,$roletext,$sortrole,$roleclass,$futureroles,$timezones) = @_; + my ($then,$refresh,$now,$reinit,$nochoose,$roletext,$sortrole,$roleclass,$futureroles,$timezones,$loncaparev) = @_; my ($countactive,$countfuture,$inrole,$possiblerole) = (0,0,0,''); my $advanced = $env{'user.adv'}; my $tryagain = $env{'form.tryagain'}; + my @ids = &Apache::lonnet::current_machine_ids(); foreach my $envkey (sort(keys(%env))) { my $button = 1; my $switchserver=''; + my $switchwarning; my ($role_text,$role_text_end,$sortkey); if ($envkey=~/^user\.role\./) { my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); &Apache::lonnet::role_status($envkey,$then,$refresh,$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'; } @@ -895,6 +947,13 @@ sub gather_roles { || ($tstatus eq 'selected') || ($tstatus eq 'future') || ($env{'form.showall'})) { + my $timezone = &role_timezone($where,$timezones); + if ($tstart) { + $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone); + } + if ($tend) { + $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone); + } if ($tstatus eq 'is') { $tbg='LC_roles_is'; $possiblerole=$trolecode; @@ -920,7 +979,7 @@ sub gather_roles { if ($role =~ /^cr\//) { my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role); if ($tremark) { $tremark.='
'; } - $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain); + $tremark.=&mt('Customrole defined by [_1].',$rauthor.':'.$rdomain); } $trole=Apache::lonnet::plaintext($role); my $ttype; @@ -931,7 +990,6 @@ sub gather_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; @@ -951,7 +1009,6 @@ sub gather_roles { 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; @@ -970,6 +1027,7 @@ sub gather_roles { $ttype = &Apache::loncommon::course_type($tcourseid); $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); if ($env{'course.'.$tcourseid.'.description'}) { + my $home=$env{'course.'.$tcourseid.'.home'}; $twhere=$env{'course.'.$tcourseid.'.description'}; $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; $twhere = &HTML::Entities::encode($twhere,'"<>&'); @@ -977,6 +1035,16 @@ sub gather_roles { $twhere.=' '. &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). ''; + unless ($home && grep(/^\Q$home\E$/,@ids) && $loncaparev eq '') { + my $required = $env{'course.'.$tcourseid.'.internal.releaserequired'}; + if ($required ne '') { + ($switchserver,$switchwarning) = + &check_release_required($loncaparev,$tcourseid,$trolecode,$required); + if ($switchserver || $switchwarning) { + $button = 0; + } + } + } } } else { my %newhash=&Apache::lonnet::coursedescription($tcourseid); @@ -989,6 +1057,17 @@ sub gather_roles { ''; $ttype = $newhash{'type'}; $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); + my $home = $newhash{'home'}; + unless ($home && grep(/^\Q$home\E$/,@ids) && $loncaparev eq '') { + my $required = $newhash{'internal.releaserequired'}; + if ($required ne '') { + ($switchserver,$switchwarning) = + &check_release_required($loncaparev,$tcourseid,$trolecode,$required); + if ($switchserver || $switchwarning) { + $button = 0; + } + } + } } else { $twhere=&mt('Currently not available'); $env{'course.'.$tcourseid.'.description'}=$twhere; @@ -1012,7 +1091,7 @@ sub gather_roles { ($role_text,$role_text_end) = &build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain, $advanced,$tremark,$tbg,$trole,$twhere,$tpstart, - $tpend,$nochoose,$button,$switchserver,$reinit); + $tpend,$nochoose,$button,$switchserver,$reinit,$switchwarning); $roletext->{$envkey}=[$role_text,$role_text_end]; if (!$sortkey) {$sortkey=$twhere."\0".$envkey;} $sortrole->{$sortkey}=$envkey; @@ -1032,9 +1111,15 @@ sub role_timezone { my $cnum = $2; if ($cdom && $cnum) { if (!exists($timezones->{$cdom.'_'.$cnum})) { - my %timehash = - &Apache::lonnet::get('environment',['timezone'],$cdom,$cnum); - if ($timehash{'timezone'} eq '') { + my $tz; + if ($env{'course.'.$cdom.'_'.$cnum.'.description'}) { + $tz = $env{'course.'.$cdom.'_'.$cnum.'.timezone'}; + } else { + my %timehash = + &Apache::lonnet::get('environment',['timezone'],$cdom,$cnum); + $tz = $timehash{'timezone'}; + } + if ($tz eq '') { if (!exists($timezones->{$cdom})) { my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); @@ -1047,7 +1132,7 @@ sub role_timezone { $timezones->{$cdom.'_'.$cnum} = $timezones->{$cdom}; } else { $timezones->{$cdom.'_'.$cnum} = - &Apache::lonlocal::gettimezone($timehash{'timezone'}); + &Apache::lonlocal::gettimezone($tz); } } $timezone = $timezones->{$cdom.'_'.$cnum}; @@ -1284,7 +1369,7 @@ sub privileges_info { } sub build_roletext { - my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_; + my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit,$switchwarning) = @_; my ($roletext,$roletext_end); my $is_dc=($trolecode =~ m/^dc\./); my $rowspan=($is_dc) ? '' @@ -1302,6 +1387,13 @@ sub build_roletext { } else { $roletext.=(' '); } + if ($switchwarning) { + if ($tremark eq '') { + $tremark = $switchwarning; + } else { + $tremark .= '
'.$switchwarning; + } + } } elsif ($tstatus eq 'is') { $roletext.=''. ''.&mt("No suitable server could be found amongst servers in your own domain (which is also the course's domain)."); + } + } else { + $otherserver = $userdomserver; + } + } + if ($otherserver ne '') { + $switchserver = 'otherserver='.$otherserver.'&role='.$trolecode; + } + } + } + return ($switchserver,$warning); +} + +sub update_content_constraints { + my ($cdom,$cnum,$chome,$cid) = @_; + my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired'); + my ($reqdmajor,$reqdminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); + my %checkresponsetypes; + foreach my $key (keys(%Apache::lonnet::needsrelease)) { + my ($item,$name,$value) = split(/:/,$key); + if ($item eq 'resourcetag') { + if ($name eq 'responsetype') { + $checkresponsetypes{$value} = $Apache::lonnet::needsrelease{$key} + } + } + } + my $navmap = Apache::lonnavmaps::navmap->new(); + if (defined($navmap)) { + my %allresponses; + foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) { + my %responses = $res->responseTypes(); + foreach my $key (keys(%responses)) { + next unless(exists($checkresponsetypes{$key})); + $allresponses{$key} += $responses{$key}; + } + } + foreach my $key (keys(%allresponses)) { + my ($major,$minor) = split(/\./,$checkresponsetypes{$key}); + if (($major > $reqdmajor) || ($major == $reqdmajor && $minor > $reqdminor)) { + ($reqdmajor,$reqdminor) = ($major,$minor); + } + } + undef($navmap); + } + unless (($reqdmajor eq '') && ($reqdminor eq '')) { + &Apache::lonnet::update_released_required($reqdmajor.'.'.$reqdminor,$cdom,$cnum,$chome,$cid); + } + return; +} + sub courselink { my ($dcdom,$rowtype) = @_; my $courseform=&Apache::loncommon::selectcourse_link @@ -1571,7 +1752,7 @@ sub display_cc_role { $env{'course.'.$tcourseid.'.description'}=$twhere; } my $trole = &Apache::lonnet::plaintext($ccrole,$ttype,$tcourseid); - $twhere.="
".&mt('Domain').":".$1; + $twhere.="
".&mt('Domain').":".$tdom; ($roletext,$roletext_end) = &build_roletext($trolecode,$tdom,$trest,'is',$tryagain,$advanced,'',$tbg,$trole,$twhere,'','','',1,''); } }