--- rat/lonpageflip.pm 2021/12/31 20:03:33 1.80.8.13.2.1 +++ rat/lonpageflip.pm 2022/10/19 18:09:03 1.113 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.80.8.13.2.1 2021/12/31 20:03:33 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.113 2022/10/19 18:09:03 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 @@ -463,9 +502,13 @@ sub handler { $r->send_http_header; $r->print(&Apache::loncommon::check_release_result(@reinit)); return OK; - } elsif ($reinitcheck eq 'update') { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } + my ($cnum,$cdom); + if ($reinitcheck) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } + if (($reinitcheck eq 'main') || ($reinitcheck eq 'both')) { $preupdatepos = &Apache::lonnet::symbread($currenturl); unless ($direction eq 'return') { if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', @@ -501,6 +544,16 @@ sub handler { } } } + if (($reinitcheck eq 'both') || ($reinitcheck eq 'supp')) { + my $possdel; + if ($reinitcheck eq 'supp') { + $possdel = 1; + } + my ($supplemental,$refs_updated) = &Apache::lonnet::get_supplemental($cnum,$cdom,'',$possdel); + unless ($refs_updated) { + &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental); + } + } } if ($direction eq 'firstres') { my $furl=&first_accessible_resource(); @@ -531,7 +584,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/[^\#]+)(?:|(\#[^\#]+))$}) { @@ -557,9 +610,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; } } # @@ -578,15 +631,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; } } @@ -651,7 +704,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); } } @@ -676,7 +729,7 @@ sub handler { &Apache::lonnet::linklog($redirecturl,$currenturl); } # ------------------------------------- Check for and display critical messages - my ($redirect, $url) = &Apache::loncommon::critical_redirect(300.'flip'); + my ($redirect, $url) = &Apache::loncommon::critical_redirect(300,'flip'); unless ($redirect) { my $usehttp = &check_http_req(\$redirecturl,$hostname); if (($usehttp) && ($hostname ne '')) { @@ -696,7 +749,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 { @@ -726,7 +779,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'); } @@ -772,35 +826,49 @@ ENDSTART .'

'.$lt{'expupdate'}.'
' .$lt{'gonav'}.'

'); } else { - $r->print( - &Apache::loncommon::start_page('No Resource')); - if ($deeplinklevel eq 'resource') { - $r->print('

'.$lt{'deeplink'}.'

' - .'

'.$lt{'deeplinkres'}.'

'); - } elsif ($deeplinklevel eq 'map') { - $r->print('

'.$lt{'title'}.'

' - .'

'.$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{'title'}.'

' - .'

'.$lt{'explain'}.'

'); + $r->print( + &Apache::loncommon::start_page('No Resource')); + if ($deeplinklevel eq 'resource') { + $r->print('

'.$lt{'deeplink'}.'

' + .'

'.$lt{'deeplinkres'}.'

'); + } elsif ($deeplinklevel eq 'map') { + $r->print('

'.$lt{'title'}.'

' + .'

'.$lt{'deeplinkmap'}.'

'); + } else { + $r->print('

'.$lt{'title'}.'

' + .'

'.$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()); @@ -811,7 +879,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; } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.