--- rat/lonpageflip.pm 2023/01/20 23:34:08 1.80.8.13.2.3 +++ rat/lonpageflip.pm 2022/10/19 00:03:12 1.112 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.80.8.13.2.3 2023/01/20 23:34:08 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.112 2022/10/19 00:03:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -121,8 +121,8 @@ sub move { if ($hash{'is_map_'.$next}) { $nodeeplinkcheck = 1; } - my $priv = &Apache::lonnet::allowed('bre',$url,$symb,'','','','',$nodeeplinkcheck); - $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A')); + my $priv = &Apache::lonnet::allowed('bre',$url,$symb,'','','','',$nodeeplinkcheck); + $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A')); } $deeplinkonly = 0; if ($hash{'deeplinkonly_'.$next}) { @@ -200,8 +200,8 @@ sub move { && ( (!$hash{'src_'.$next}) || ( - (!$env{'request.role.adv'}) - && (($hash{'randomout_'.$next}) + (!$env{'request.role.adv'}) + && (($hash{'randomout_'.$next}) || ($deeplinkonly) || ($hash{'deeplinkout_'.$next})) ) @@ -337,9 +337,9 @@ sub first_accessible_resource { $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); if ($hash{'encrypted_'.$newrid}) { $furl=&Apache::lonenc::encrypted($furl); - } + } } - } + } untie(%hash); return $furl; } else { @@ -347,6 +347,29 @@ sub first_accessible_resource { } } +sub first_answerable_ressymb { + my $navmap = Apache::lonnavmaps::navmap->new; + return unless (ref($navmap)); + my $iterator = $navmap->getIterator(undef,undef,undef,1); + return unless (ref($iterator)); + my ($curRes,$result); + while ($curRes = $iterator->next()) { + if (ref($curRes) && $curRes->is_problem()) { + foreach my $part (@{$curRes->parts()}) { + if ($curRes->tries($part) < $curRes->maxtries($part)) { + $result = $curRes->link().'?symb='.$curRes->shown_symb(); + last; + } + } + } + } + if ($result) { + return $result; + } else { + return &first_accessible_resource(); + } +} + sub check_http_req { my ($srcref,$hostname) = @_; return unless (ref($srcref) eq 'SCALAR'); @@ -367,7 +390,7 @@ sub check_http_req { unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/); - $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; + $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; $usehttp = 1; } } @@ -453,6 +476,22 @@ sub handler { $last=$hash{'last_known'}; untie(%hash); } + } elsif ($direction eq 'firstanswerable') { + my $furl = &first_answerable_ressymb(); + my $usehttp = &check_http_req(\$furl,$hostname); + if (($usehttp) && ($hostname ne '')) { + $furl='http://'.$hostname.$furl; + } else { + $furl=&Apache::lonnet::absolute_url().$furl; + } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $furl); + return REDIRECT; + } elsif ($direction eq 'endplacement') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $r->print(&Apache::lonplacementtest::showresult()); + return OK; } if ($env{'request.course.id'}) { # Check if course needs to be re-initialized @@ -506,11 +545,7 @@ sub handler { } } if (($reinitcheck eq 'both') || ($reinitcheck eq 'supp')) { - my $possdel; - if ($reinitcheck eq 'supp') { - $possdel = 1; - } - my ($supplemental,$refs_updated) = &Apache::loncommon::get_supplemental($cnum,$cdom,'',$possdel); + my ($supplemental,$refs_updated) = &Apache::lonnet::get_supplemental($cnum,$cdom); unless ($refs_updated) { &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental); } @@ -545,7 +580,7 @@ sub handler { $newloc=$hash{'src_'.$id}; if ($newloc) { $usehttp = &check_http_req(\$newloc,$hostname); - if ($hash{'encrypted_'.$id}) { + if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); } if ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)(?:|(\#[^\#]+))$}) { @@ -571,9 +606,9 @@ sub handler { $r->print(&Apache::loncommon::end_page()); return OK; } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $newloc); - return REDIRECT; + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $newloc); + return REDIRECT; } } # @@ -592,15 +627,15 @@ sub handler { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { my $newloc = &Apache::lonnet::absolute_url(). - '/adm/navmaps'; + '/adm/navmaps'; if ($reinitcheck eq 'update') { &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $r->print(&reinited_js($newloc,$env{'request.course.id'},100)); $r->print(&Apache::loncommon::end_page()); return OK; } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $newloc); + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $newloc); return REDIRECT; } } @@ -665,7 +700,7 @@ sub handler { my $mapid = $hash{'map_pc_'.&Apache::lonnet::clutter($map)}; my $position_deeplink = $hash{'deeplinkonly_'.$mapid.'.'.$resid}; if ($position_deeplink) { - (my $value,$deeplinklevel) = map { &unescape($_); } + (my $value,$deeplinklevel) = map { &unescape($_); } split(/:/,$position_deeplink); } } @@ -710,7 +745,7 @@ sub handler { } if ($reinitcheck eq 'update') { &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($url,$env{'request.course.id'},100)); + $r->print(&reinited_js($url,$env{'request.course.id'},100)); $r->print(&Apache::loncommon::end_page()); return OK; } else { @@ -740,7 +775,8 @@ sub handler { 'type' => 'Type', 'update' => 'Content updated', 'expupdate' => 'As a result of a recent update to the sequence of materials, it is not possible to complete the page flip.', - 'gonav' => 'Go to the Contents page to select a resource to display.'); + 'gonav' => 'Go to the Contents page to select a resource to display.', + ); if (&Apache::loncommon::course_type() eq 'Community') { $lt{'nav'} = &mt('Community Contents'); } @@ -786,35 +822,49 @@ ENDSTART .'
'.$lt{'expupdate'}.'
'
.$lt{'gonav'}.'
'.$lt{'deeplinkres'}.'
'); - } elsif ($deeplinklevel eq 'map') { - $r->print(''.$lt{'deeplinkmap'}.'
'); + if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && + (!$env{'request.role.adv'})) { + my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1); + if ($incomplete) { + $r->print(&Apache::lonplacementtest::showincomplete($incomplete)); + } else { + $r->print(&Apache::lonplacementtest::showresult(1)); + } } else { - $r->print(''.$lt{'explain'}.'
'); + $r->print( + &Apache::loncommon::start_page('No Resource')); + if ($deeplinklevel eq 'resource') { + $r->print(''.$lt{'deeplinkres'}.'
'); + } elsif ($deeplinklevel eq 'map') { + $r->print(''.$lt{'deeplinkmap'}.'
'); + } else { + $r->print(''.$lt{'explain'}.'
'); + } } } } - if ($deeplinklevel) { - $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'back'}.''])); - } elsif ((!@possibilities) && ($reinitcheck)) { - $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'nav'}.'' - ])); - } else { - $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'back'}.'', - ''.$lt{'nav'}.'' - ])); + unless (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && + (!$env{'request.role.adv'})) { + if ($deeplinklevel) { + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'back'}.''])); + } elsif ((!@possibilities) && ($reinitcheck)) { + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'nav'}.'' + ])); + } else { + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'back'}.'', + ''.$lt{'nav'}.'' + ])); + } + } $r->print(&Apache::loncommon::end_page()); @@ -825,7 +875,7 @@ ENDSTART if ($reinitcheck eq 'update') { &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $r->print(&Apache::loncommon::end_page()); - } + } $env{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing"; return HTTP_NOT_ACCEPTABLE; }