--- rat/lonpageflip.pm 2017/02/20 18:29:33 1.93 +++ rat/lonpageflip.pm 2018/11/13 03:59:17 1.98 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.93 2017/02/20 18:29:33 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.98 2018/11/13 03:59:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -102,6 +102,9 @@ sub move { my ($next,$endupmap,$direction) = @_; my $safecount=0; my $allowed=0; + my $deeplinkonly=0; + my $prev=$next; + my ($prevmapid)=split(/\./,$next); do { ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction); @@ -115,14 +118,35 @@ sub move { my $priv = &Apache::lonnet::allowed('bre',$url,$symb); $allowed = (($priv eq 'F') || ($priv eq '2')); } + $deeplinkonly = 0; + if ($hash{'deeplinkonly_'.$next}) { + my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$next}); + if ($level eq 'resource') { + $deeplinkonly = 1; + } elsif ($level eq 'map') { + if ($mapid != $prevmapid) { + $deeplinkonly = 1; + } + } + } elsif ($hash{'deeplinkonly_'.$prev}) { + my ($value,$level) = split(/:/,$hash{'deeplinkonly_'.$prev}); + if ($level eq 'resource') { + $deeplinkonly = 1; + } elsif ($level eq 'map') { + if ($mapid != $prevmapid) { + $deeplinkonly = 1; + } + } + } $safecount++; } while ( ($next) && ($next!~/\,/) && ( (!$hash{'src_'.$next}) || ( - (!$env{'request.role.adv'}) - && $hash{'randomout_'.$next} + (!$env{'request.role.adv'}) + && (($hash{'randomout_'.$next}) + || ($deeplinkonly)) ) || (!$allowed) ) @@ -279,7 +303,7 @@ sub first_answerable_ressymb { } } -sub check_for_syllabus { +sub check_http_req { my ($srcref) = @_; return unless (ref($srcref) eq 'SCALAR'); my $usehttp; @@ -291,11 +315,36 @@ sub check_for_syllabus { ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; $usehttp = 1; + } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) && + ($ENV{'SERVER_PORT'} == 443)) { + $usehttp = 1; } } return $usehttp; } +sub reinited_js { + my ($url,$cid,$timeout) = @_; + if (!$timeout) { + $timeout = 0; + } + return <<"END"; + +END +} + # ================================================================ Main Handler sub handler { @@ -312,8 +361,10 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my ($redirecturl,$redirectsymb,$enc,$anchor); + my %prog_state=(); + my ($redirecturl,$redirectsymb,$enc,$anchor,$deeplinklevel); my $next=''; + my $hostname = $r->hostname(); my @possibilities=(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']); if (($env{'form.postdata'})&&($env{'request.course.fn'})) { @@ -333,9 +384,9 @@ sub handler { } } elsif ($direction eq 'firstanswerable') { my $furl = &first_answerable_ressymb(); - my $usehttp = &check_for_syllabus(\$furl); - if ($usehttp) { - $furl='http://'.$ENV{'SERVER_NAME'}.$furl; + my $usehttp = &check_http_req(\$furl); + if (($usehttp) && ($hostname ne '')) { + $furl='http://'.$hostname.$furl; } else { $furl=&Apache::lonnet::absolute_url().$furl; } @@ -368,8 +419,20 @@ 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; @@ -386,15 +449,22 @@ sub handler { } if ($direction eq 'firstres') { my $furl=&first_accessible_resource(); - my $usehttp = &check_for_syllabus(\$furl); - if ($usehttp) { - $furl='http://'.$ENV{'SERVER_NAME'}.$furl; + 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; + 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; + } } if ($direction eq 'return') { # -------------------------------------------------------- Return to last known @@ -405,7 +475,7 @@ sub handler { $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id; $newloc=$hash{'src_'.$id}; if ($newloc) { - $usehttp = &check_for_syllabus(\$newloc); + $usehttp = &check_http_req(\$newloc); if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); } elsif ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)\#([^\#]+)$}) { @@ -418,14 +488,20 @@ sub handler { } else { $newloc='/adm/navmaps'; } - if ($usehttp) { - $newloc='http://'.$ENV{'SERVER_NAME'}.$newloc; + if (($usehttp) && ($hostname ne '')) { + $newloc='http://'.$hostname.$newloc; } else { $newloc=&Apache::lonnet::absolute_url().$newloc } - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $newloc); - return REDIRECT; + 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; + } } # # Is the current URL on the map? If not, start with last known URL @@ -443,11 +519,18 @@ sub handler { if ($last) { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => - &Apache::lonnet::absolute_url(). - '/adm/navmaps'); - return REDIRECT; + 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; + } } } # ------------------------------------------- Do we have any idea where we are? @@ -505,6 +588,9 @@ sub handler { } else { # -------------------------------------------------------------- No place to go $multichoice=-1; + if ($hash{'deeplinkonly_'.$rid}) { + (my $value,$deeplinklevel) = split(/:/,$hash{'deeplinkonly_'.$rid}); + } } # ----------------- The program must come past this point to untie the big hash untie(%hash); @@ -526,11 +612,11 @@ sub handler { &Apache::lonnet::linklog($redirecturl,$currenturl); } # ------------------------------------- Check for and display critical messages - my ($redirect, $url) = &Apache::loncommon::critical_redirect(300); + my ($redirect, $url) = &Apache::loncommon::critical_redirect(300,'flip'); unless ($redirect) { - my $usehttp = &check_for_syllabus(\$redirecturl); - if ($usehttp) { - $url='http://'.$ENV{'SERVER_NAME'}.$redirecturl; + my $usehttp = &check_http_req(\$redirecturl); + if (($usehttp) && ($hostname ne '')) { + $url='http://'.$hostname.$redirecturl; } else { $url=&Apache::lonnet::absolute_url().$redirecturl; } @@ -544,14 +630,26 @@ sub handler { $url .= $anchor; } } - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $url); - return REDIRECT; + 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; + } } else { # --------------------------------------------------------- There was a problem &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my %lt=&Apache::lonlocal::texthash('title' => 'End of Sequence', + 'deeplink' => 'No link available', + 'deeplinkres' => + 'Navigation to other content is unavailable when accessing content via deep-linking', + 'deeplinkmap' => + 'You have reached the end of the sequence of available materials for access via deep-linking', 'explain' => 'You have reached the end of the sequence of materials.', 'back' => 'Go Back', @@ -583,9 +681,9 @@ $lt{'pick'}: ENDSTART foreach my $id (@possibilities) { my $src = $multichoicehash{'src_'.$id}; - my $usehttp = &check_for_syllabus(\$src); - if ($usehttp) { - $src = 'http://'.$ENV{'SERVER_NAME'}.$src; + my $usehttp = &check_http_req(\$src); + if (($usehttp) && ($hostname ne '')) { + $src = 'http://'.$hostname.$src; } $r->print( ''.$lt{'back'}.''])); + } elsif ((!@possibilities) && ($reinitcheck)) { $r->print( &Apache::lonhtmlcommon::actionbox( [''.$lt{'nav'}.'' @@ -649,12 +759,23 @@ 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 - $r->internal_redirect('/adm/ambiguous'); + 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); + } return OK; } } else {