--- loncom/interface/lonnavdisplay.pm 2010/03/29 14:50:46 1.17 +++ loncom/interface/lonnavdisplay.pm 2022/10/19 00:03:10 1.40 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA -# Navigate Maps Handler +# Navigate Maps Display Handler # -# $Id: lonnavdisplay.pm,v 1.17 2010/03/29 14:50:46 raeburn Exp $ +# $Id: lonnavdisplay.pm,v 1.40 2022/10/19 00:03:10 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,14 +30,16 @@ package Apache::lonnavdisplay; use strict; -use Apache::Constants qw(:common :http); +use Apache::Constants qw(:common :http REDIRECT); use Apache::lonmenu(); use Apache::loncommon(); use Apache::lonnavmaps(); use Apache::lonhtmlcommon(); use Apache::lonnet; use Apache::lonlocal; -use Time::HiRes qw( gettimeofday tv_interval ); +use Apache::londocs(); +use Apache::lonuserstate; +use LONCAPA::ltiutils; sub handler { my $r = shift; @@ -46,61 +48,142 @@ sub handler { sub real_handler { my $r = shift; - #my $t0=[&gettimeofday()]; # Handle header-only request if ($r->header_only) { - if ($env{'browser.mathml'}) { - &Apache::loncommon::content_type($r,'text/xml'); - } else { - &Apache::loncommon::content_type($r,'text/html'); - } + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } - # Send header, don't cache this page - if ($env{'browser.mathml'}) { - &Apache::loncommon::content_type($r,'text/xml'); - } else { + # Check for critical messages and redirect if present. + my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'contents'); + if ($redirect) { &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $url); + return REDIRECT; } - &Apache::loncommon::no_cache($r); - my %toplinkitems=(); +# ------------------------------------------------------------ Get query string + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sort', + 'showOnlyHomework', + 'postsymb']); + # Check if course needs to be re-initialized + my $loncaparev = $r->dir_config('lonVersion'); + my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + my %prog_state=(); + my $closure; + + if ($result eq 'switch') { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + $r->print(&Apache::loncommon::check_release_result(@reinit)); + return OK; + } + my ($cid,$cnum,$cdom); + if ($result) { + $cid = $env{'request.course.id'}; + $cnum = $env{'course.'.$cid.'.num'}; + $cdom = $env{'course.'.$cid.'.domain'}; + } + if (($result eq 'main') || ($result eq 'both')) { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + &startpage($r); + my $preamble = '
'. + '
'. + &mt('Your course session is being updated because of recent changes by course personnel.'). + ' '.&mt('Please be patient').'.
'. + '
'; + $closure = < +// + +ENDCLOSE + %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble); + &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course')); + $r->rflush(); + my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum",\%prog_state,$r); + &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!')); + if ($ferr) { + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print($closure.&Apache::loncommon::end_page()); + my $requrl = $r->uri; + $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; + $env{'user.reinit'} = 1; + return HTTP_NOT_ACCEPTABLE; + } + } + if (($result eq 'both') || ($result eq 'supp')) { + my $possdel; + if ($result 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,$possdel); + } + } + + my $course_type = &Apache::loncommon::course_type(); + if (($course_type eq 'Placement') && (!$env{'request.role.adv'})) { + my $furl = &Apache::lonpageflip::first_accessible_resource(); + if ($result eq 'update') { + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print($closure.&Apache::loncommon::end_page()); + return OK; + } else { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $furl); + return REDIRECT; + } + } + + if ($env{'request.lti.login'}) { + if ($env{'request.lti.uri'} ne '') { + my $cid = $env{'request.course.id'}; + my $cnum = $env{'course.'.$cid.'.num'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + my ($scope,$url) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + if (($scope eq 'map') || ($scope eq 'resource')) { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $url); + return REDIRECT; + } + } + } # Create the nav map my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { + if ($result eq 'update') { + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print($closure.&Apache::loncommon::end_page()); + } my $requrl = $r->uri; $env{'user.error.msg'} = "$requrl:bre:0:0:Course not initialized"; $env{'user.reinit'} = 1; return HTTP_NOT_ACCEPTABLE; } - $r->send_http_header; -# ------------------------------------------------------------ Get query string - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sort','showOnlyHomework','postsymb','register']); - -# ----------------------------------------------------- Force menu registration - # Header - my $course_type = &Apache::loncommon::course_type(); - my $title = $course_type . ' Contents'; - my ($start_page,$args); - if ($env{'form.register'}) { - $args = {'force_register' => $env{'form.register'}}; - $start_page = &Apache::loncommon::start_page($title,undef,$args); + if ($result eq 'update') { + $r->rflush(); + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $r->print($closure); + $r->rflush(); } else { - my $brcrum = [{href => '/adm/navmaps', - text => &mt($course_type . ' Contents'), - no_mt => 1}, - ]; - $args = {'bread_crumbs' => $brcrum}; - $start_page = &Apache::loncommon::start_page($title,undef,$args); + # Send header, don't cache this page + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + &startpage($r); + } + + &startContentScreen($r,'navmaps'); + unless ($result eq 'update') { + $r->rflush(); } - $r->print($start_page. - ''); - $r->rflush(); # Check that it's defined if (!($navmap->courseMapDefined())) { @@ -111,21 +194,32 @@ sub real_handler { return OK; } - # See if there's only one map in the top-level, if we don't - # already have a filter... if so, automatically display it - # (older code; should use retrieveResources) - if ($ENV{QUERY_STRING} !~ /filter/) { - my $iterator = $navmap->getIterator(undef, undef, undef, 0); - my $curRes; - my $sequenceCount = 0; - my $sequenceId; - while ($curRes = $iterator->next()) { - if (ref($curRes) && $curRes->is_sequence()) { + my %toplinkitems=(); + my @resources = $navmap->retrieveResources(); + my $sequenceCount = 0; + my $problemCount = 0; + my $notaprobCount = 0; + my $sequenceId; + my $notools; + foreach my $curRes (@resources) { + if (ref($curRes)) { + if ($curRes->is_sequence()) { $sequenceCount++; $sequenceId = $curRes->map_pc(); + } elsif ($curRes->is_problem()) { + $problemCount ++; + } else { + $notaprobCount ++; } } - + } + if (($sequenceCount == 1) && (!$problemCount) && ($notaprobCount <= 1)) { + $notools = 1; + } + + # If there's only one map in the top-level and we don't + # already have a filter, automatically display it + if ($ENV{QUERY_STRING} !~ /filter/) { if ($sequenceCount == 1) { # The automatic iterator creation in the render call # will pick this up. We know the condition because @@ -177,13 +271,12 @@ sub real_handler { .""); } } else { - my $link = 'navmaps?jumpToFirstHomework'; - if ($env{'form.register'}) { - $link .= '&register='.$env{'form.register'}; + my $link = '/adm/navmaps?jumpToFirstHomework'; + unless ($notools) { + &Apache::lonnavmaps::add_linkitem(\%toplinkitems,'firsthomework', + 'location.href="'.$link.'"', + "Show my first due problem"); } - &Apache::lonnavmaps::add_linkitem(\%toplinkitems,'firsthomework', - 'location.href="'.$link.'"', - "Show my first due problem"); } my $suppressEmptySequences = 0; @@ -198,10 +291,7 @@ sub real_handler { $filterFunc = sub { my $res = shift; return $res->completable() || $res->is_map(); }; - my $link = 'navmaps?sort='.$env{'form.sort'}; - if ($env{'form.register'}) { - $link .= '&register='.$env{'form.register'}; - } + my $link = '/adm/navmaps?sort='.$env{'form.sort'}; &Apache::lonnavmaps::add_linkitem(\%toplinkitems,'everything', 'location.href="'.$link.'"', 'Show everything'); @@ -210,29 +300,31 @@ sub real_handler { $env{'form.condition'} = 1; $resource_no_folder_link = 1; } else { - my $link = 'navmaps?sort='.$env{'form.sort'}.'&showOnlyHomework=1'; - if ($env{'form.register'}) { - $link .= '&register='.$env{'form.register'}; + my $link = '/adm/navmaps?sort='.$env{'form.sort'}.'&showOnlyHomework=1'; + unless ($notools) { + &Apache::lonnavmaps::add_linkitem(\%toplinkitems,'uncompleted', + 'location.href="'.$link.'"', + 'Show only uncompleted problems'); } - &Apache::lonnavmaps::add_linkitem(\%toplinkitems,'uncompleted', - 'location.href="'.$link.'"', - 'Show only uncompleted problems'); } my %selected=($env{'form.sort'} => ' selected="selected"'); - my $sort_html=('
+ my $sort_html; + unless ($notools) { + $sort_html=( + ' '.&mt('Sort by:').' - - + -
'); + } # renderer call my $renderArgs = { 'cols' => [0,1,2,3], 'sort' => $env{'form.sort'}, @@ -245,7 +337,9 @@ sub real_handler { 'sort_html'=> $sort_html, 'r' => $r, 'caller' => 'navmapsdisplay', - 'linkitems' => \%toplinkitems}; + 'linkitems' => \%toplinkitems, + 'notools' => $notools}; + my $render = &Apache::lonnavmaps::render($renderArgs); # If no resources were printed, print a reassuring message so the @@ -257,15 +351,61 @@ sub real_handler { $r->print("

".&mt("This course is empty.")."

"); } } - #my $td=&tv_interval($t0); - #$r->print("
$td"); - + &endContentScreen($r); $r->print(&Apache::loncommon::end_page()); $r->rflush(); return OK; } +sub startpage { + my ($r) = @_; +# ----------------------------------------------------- Force menu registration + # Header + my $course_type = &Apache::loncommon::course_type(); + my $title = $course_type . ' Contents'; + my $brcrum = [{href => '/adm/navmaps', + text => &mt($course_type . ' Contents'), + no_mt => 1}, + ]; + my $args = {'bread_crumbs' => $brcrum}; + my $start_page = &Apache::loncommon::start_page($title,undef,$args); + $r->print($start_page. + ''); + return; +} + +sub startContentScreen { + my ($r,$mode)=@_; + + $r->print("\n".''."\n"); + $r->print('
'); +} + +sub endContentScreen { + my ($r)=@_; + $r->print('
'); +} + 1; __END__ 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.