--- rat/lonpageflip.pm 2021/12/14 21:34:45 1.80.8.13 +++ rat/lonpageflip.pm 2017/03/08 02:51:18 1.95 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.80.8.13 2021/12/14 21:34:45 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.95 2017/03/08 02:51:18 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,6 +36,7 @@ use LONCAPA; use Apache::Constants qw(:common :http REDIRECT); use Apache::lonnet; use Apache::loncommon(); +use Apache::lonnavmaps(); use Apache::lonuserstate; use Apache::lonlocal; use HTML::TokeParser; @@ -231,13 +232,9 @@ sub first_accessible_resource { if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { $furl=$hash{'first_url'}; - my (%args,$url,$argstr); - if ($furl =~ m{^/enc/}) { - ($url,$argstr) = split(/\?/,&Apache::lonenc::unencrypted($furl)); - } else { - ($url,$argstr) = split(/\?/,$furl); - } - foreach my $pair (split(/\&/,$argstr)) { + my %args; + my ($url,$args) = split(/\?/,$furl); + foreach my $pair (split(/\&/,$args)) { my ($name,$value) = split(/=/,$pair); $args{&unescape($name)} = &unescape($value); } @@ -245,17 +242,13 @@ sub first_accessible_resource { # Wow, we cannot see this ... move forward to the next one that we can see my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward'); # Build the new URL - if ($newrid eq '') { - $furl = '/adm/navmaps'; - } else { - my ($newmapid,$newresid)=split(/\./,$newrid); - my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); - $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); - if ($hash{'encrypted_'.$newrid}) { - $furl=&Apache::lonenc::encrypted($furl); - } + my ($newmapid,$newresid)=split(/\./,$newrid); + my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); + $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); + if ($hash{'encrypted_'.$newrid}) { + $furl=&Apache::lonenc::encrypted($furl); } - } + } untie(%hash); return $furl; } else { @@ -263,8 +256,31 @@ 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) = @_; + my ($srcref) = @_; return unless (ref($srcref) eq 'SCALAR'); my $usehttp; if ($env{'request.course.id'}) { @@ -273,46 +289,16 @@ sub check_http_req { if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && ($ENV{'SERVER_PORT'} == 443) && ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - unless ((&Apache::lonnet::uses_sts()) || - (&Apache::lonnet::waf_allssl($hostname))) { - $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; - $usehttp = 1; - } + $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; + $usehttp = 1; } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) { - unless ((&Apache::lonnet::uses_sts()) || - (&Apache::lonnet::waf_allssl($hostname))) { - my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/); - $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; - $usehttp = 1; - } + $usehttp = 1; } } return $usehttp; } -sub reinited_js { - my ($url,$cid,$timeout) = @_; - if (!$timeout) { - $timeout = 0; - } - return <<"END"; - -END -} - # ================================================================ Main Handler sub handler { @@ -329,7 +315,6 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my %prog_state=(); my ($redirecturl,$redirectsymb,$enc,$anchor); my $next=''; my $hostname = $r->hostname(); @@ -350,6 +335,22 @@ sub handler { $last=$hash{'last_known'}; untie(%hash); } + } elsif ($direction eq 'firstanswerable') { + my $furl = &first_answerable_ressymb(); + my $usehttp = &check_http_req(\$furl); + 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 @@ -371,20 +372,8 @@ sub handler { untie(%hash); } } - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - $r->print(&Apache::loncommon::start_page('Content Changed')); - my $preamble = '
'. - '
'. - &mt('Your course session is being updated because of recent changes by course personnel.'). - ' '.&mt('Please be patient').'.
'. - '
'; - %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble); - &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course')); my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); - &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!')); if ($ferr) { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); my $requrl = $r->uri; $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; $env{'user.reinit'} = 1; @@ -401,24 +390,17 @@ sub handler { } if ($direction eq 'firstres') { my $furl=&first_accessible_resource(); - my $usehttp = &check_http_req(\$furl,$hostname); + my $usehttp = &check_http_req(\$furl); if (($usehttp) && ($hostname ne '')) { $furl='http://'.$hostname.$furl; } else { $furl=&Apache::lonnet::absolute_url().$furl; } - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($furl,$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 => $furl); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $furl); + return REDIRECT; } - if ($direction eq 'return') { + if ($direction eq 'return') { # -------------------------------------------------------- Return to last known my ($newloc,$usehttp); if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', @@ -427,15 +409,11 @@ sub handler { $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id; $newloc=$hash{'src_'.$id}; if ($newloc) { - $usehttp = &check_http_req(\$newloc,$hostname); - if ($hash{'encrypted_'.$id}) { + $usehttp = &check_http_req(\$newloc); + if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); - } - if ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)(?:|(\#[^\#]+))$}) { - my ($url,$anchor) = ($1,$2); - if ($anchor) { - $newloc = $url.(($url=~/\?/)?'&':'?').'symb='.&escape($last).$anchor; - } + } elsif ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)\#([^\#]+)$}) { + $newloc = $1.&escape('#').$2; } } else { $newloc='/adm/navmaps'; @@ -449,15 +427,9 @@ sub handler { } else { $newloc=&Apache::lonnet::absolute_url().$newloc } - if ($reinitcheck eq 'update') { - $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); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $newloc); + return REDIRECT; } # # Is the current URL on the map? If not, start with last known URL @@ -471,21 +443,15 @@ sub handler { $last=$hash{'last_known'}; untie(%hash); } + my $newloc; if ($last) { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - my $newloc = &Apache::lonnet::absolute_url(). - '/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); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + &Apache::lonnet::absolute_url(). + '/adm/navmaps'); + return REDIRECT; } } # ------------------------------------------- Do we have any idea where we are? @@ -566,7 +532,7 @@ sub handler { # ------------------------------------- Check for and display critical messages my ($redirect, $url) = &Apache::loncommon::critical_redirect(300); unless ($redirect) { - my $usehttp = &check_http_req(\$redirecturl,$hostname); + my $usehttp = &check_http_req(\$redirecturl); if (($usehttp) && ($hostname ne '')) { $url='http://'.$hostname.$redirecturl; } else { @@ -582,16 +548,9 @@ sub handler { $url .= $anchor; } } - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($url,$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 => $url); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $url); + return REDIRECT; } else { # --------------------------------------------------------- There was a problem &Apache::loncommon::content_type($r,'text/html'); @@ -609,7 +568,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'); } @@ -627,7 +587,7 @@ $lt{'pick'}: ENDSTART foreach my $id (@possibilities) { my $src = $multichoicehash{'src_'.$id}; - my $usehttp = &check_http_req(\$src,$hostname); + my $usehttp = &check_http_req(\$src); if (($usehttp) && ($hostname ne '')) { $src = 'http://'.$hostname.$src; } @@ -655,23 +615,37 @@ ENDSTART .'

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

'); } else { - $r->print( - &Apache::loncommon::start_page('No Resource') - .'

'.$lt{'title'}.'

' - .'

'.$lt{'explain'}.'

'); + 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( + &Apache::loncommon::start_page('No Resource') + .'

'.$lt{'title'}.'

' + .'

'.$lt{'explain'}.'

'); + } } } - if ((!@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 ((!@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()); @@ -679,23 +653,12 @@ ENDSTART } } else { # ------------------------------------------------- Problem, could not tie hash - 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; } } else { # ---------------------------------------- No, could not determine where we are - my $newloc = '/adm/ambiguous'; - 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()); - } else { - $r->internal_redirect($newloc); - } + $r->internal_redirect('/adm/ambiguous'); return OK; } } else {