From raeburn at source.lon-capa.org Thu Nov 16 08:31:29 2017 From: raeburn at source.lon-capa.org (raeburn) Date: Thu, 16 Nov 2017 13:31:29 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonhtmlcommon.pm Message-ID: raeburn Thu Nov 16 13:31:29 2017 EDT Modified files: /loncom/interface lonhtmlcommon.pm loncommon.pm Log: - jquery-ui progressbar -- use indeterminate progressbar display if the maximum number of items to do is omitted from the call to Create_PrgWin(). - an optional HTML preamble can be included in the cal to Create_PrgWin() to display before the progressbar. Index: loncom/interface/lonhtmlcommon.pm diff -u loncom/interface/lonhtmlcommon.pm:1.389 loncom/interface/lonhtmlcommon.pm:1.390 --- loncom/interface/lonhtmlcommon.pm:1.389 Mon Nov 6 03:08:40 2017 +++ loncom/interface/lonhtmlcommon.pm Thu Nov 16 13:31:29 2017 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.389 2017/11/06 03:08:40 raeburn Exp $ +# $Id: lonhtmlcommon.pm,v 1.390 2017/11/16 13:31:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1025,11 +1025,15 @@ =item $number_to_do The total number of items being processed. +=item $preamble Optional HTML to display before the progress bar. + =back =back Returns a hash containing the progress state data structure. +If $number_to_do is zero or null, an indeterminate progress bar will +be used. =item &Update_PrgWin() @@ -1118,20 +1122,20 @@ # Create progress sub Create_PrgWin { - my ($r,$number_to_do)=@_; + my ($r,$number_to_do,$preamble)=@_; my %prog_state; $prog_state{'done'}=0; $prog_state{'firststart'}=&Time::HiRes::time(); $prog_state{'laststart'}=&Time::HiRes::time(); $prog_state{'max'}=$number_to_do; - &Apache::loncommon::LCprogressbar($r); + &Apache::loncommon::LCprogressbar($r,$prog_state{'max'},$preamble); return %prog_state; } # update progress sub Update_PrgWin { my ($r,$prog_state,$displayString)=@_; - &Apache::loncommon::LCprogressbarUpdate($r,undef,$displayString); + &Apache::loncommon::LCprogressbarUpdate($r,undef,$displayString,$$prog_state{'max'}); $$prog_state{'laststart'}=&Time::HiRes::time(); } @@ -1181,7 +1185,7 @@ if ($$prog_state{'max'}) { $percent=int(100.*$current/$$prog_state{'max'}); } - &Apache::loncommon::LCprogressbarUpdate($r,$percent,$timeinfo); + &Apache::loncommon::LCprogressbarUpdate($r,$percent,$timeinfo,$$prog_state{'max'}); $$prog_state{'laststart'}=&Time::HiRes::time(); } Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.1301 loncom/interface/loncommon.pm:1.1302 --- loncom/interface/loncommon.pm:1.1301 Sun Nov 12 13:15:25 2017 +++ loncom/interface/loncommon.pm Thu Nov 16 13:31:29 2017 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.1301 2017/11/12 13:15:25 raeburn Exp $ +# $Id: loncommon.pm,v 1.1302 2017/11/16 13:31:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -8893,8 +8893,9 @@ } sub LCprogressbar_script { - my ($id)=@_; - return(< // ENDPROGRESS + } else { + return(< +// + +ENDPROGRESS + } } sub LCprogressbarUpdate_script { return(< .ui-progressbar { position:relative; } +.progress-label {position: absolute; width: 100%; text-align: center; top: 1px; font-weight: bold; text-shadow: 1px 1px 0 #fff;margin: 0; line-height: 200%; } .pblabel { position: absolute; width: 100%; text-align: center; line-height: 1.9em; } ENDUPDATE From raeburn at source.lon-capa.org Thu Nov 16 07:44:48 2017 From: raeburn at source.lon-capa.org (raeburn) Date: Thu, 16 Nov 2017 12:44:48 -0000 Subject: [LON-CAPA-cvs] cvs: rat / lonuserstate.pm Message-ID: raeburn Thu Nov 16 12:44:48 2017 EDT Modified files: /rat lonuserstate.pm Log: - Use three-argument open() to separate file mode from the filename. Index: rat/lonuserstate.pm diff -u rat/lonuserstate.pm:1.153 rat/lonuserstate.pm:1.154 --- rat/lonuserstate.pm:1.153 Sun Sep 3 18:52:23 2017 +++ rat/lonuserstate.pm Thu Nov 16 12:44:48 2017 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.153 2017/09/03 18:52:23 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.154 2017/11/16 12:44:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1209,7 +1209,7 @@ } @cond=('true:normal'); - unless (open(LOCKFILE,">$fn.db.lock")) { + unless (open(LOCKFILE,">","$fn.db.lock")) { # # Most likely a permissions problem on the lockfile or its directory. # @@ -1522,7 +1522,7 @@ # ---------------------------------------------------- Store away initial state { my $cfh; - if (open($cfh,">$fn.state")) { + if (open($cfh,">","$fn.state")) { print $cfh join("\n", at cond); $gotstate = 1; } else { @@ -1559,7 +1559,7 @@ if (-e $fn) { my @conditions=(); { - open(my $fh,"<$fn"); + open(my $fh,"<",$fn); @conditions=<$fh>; close($fh); } From raeburn at source.lon-capa.org Thu Nov 16 08:42:01 2017 From: raeburn at source.lon-capa.org (raeburn) Date: Thu, 16 Nov 2017 13:42:01 -0000 Subject: [LON-CAPA-cvs] cvs: rat / lonpageflip.pm loncom/interface lonnavdisplay.pm lonquickgrades.pm Message-ID: raeburn Thu Nov 16 13:42:01 2017 EDT Modified files: /loncom/interface lonquickgrades.pm lonnavdisplay.pm /rat lonpageflip.pm Log: - If user's course session is stale, and needs updating when page flip, student's view of grades or course contents page were requested, show message and "indeterminate" progressbar until reinitialization complete. -------------- next part -------------- Index: loncom/interface/lonquickgrades.pm diff -u loncom/interface/lonquickgrades.pm:1.110 loncom/interface/lonquickgrades.pm:1.111 --- loncom/interface/lonquickgrades.pm:1.110 Mon Jun 26 01:56:58 2017 +++ loncom/interface/lonquickgrades.pm Thu Nov 16 13:41:56 2017 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Quick Student Grades Display # -# $Id: lonquickgrades.pm,v 1.110 2017/06/26 01:56:58 raeburn Exp $ +# $Id: lonquickgrades.pm,v 1.111 2017/11/16 13:41:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -77,6 +77,11 @@ } my $cangrade=&Apache::lonnet::allowed('mgr'); + my $showPoints = + (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard') + || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories')); + + my $reinitresult; unless ($cangrade) { # Check for critical messages and redirect if present. @@ -89,22 +94,46 @@ # Check if course needs to be re-initialized my $loncaparev = $r->dir_config('lonVersion'); - my ($result, at reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + ($reinitresult,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); - if ($result eq 'switch') { + if ($reinitresult eq 'switch') { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&Apache::loncommon::check_release_result(@reinit)); return OK; - } elsif ($result eq 'update') { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } elsif ($reinitresult eq 'update') { + my $cid = $env{'request.course.id'}; + my $cnum = $env{'course.'.$cid.'.num'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + &startpage($r,$showPoints); + 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')); + $r->rflush(); my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); + &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished')); + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + my $closure = < +// + +ENDCLOSE if ($ferr) { + $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; + } else { + $r->print($closure); } } elsif ((&Apache::loncommon::course_type() eq 'Placement') && (!$env{'request.role.adv'})) { @@ -115,27 +144,13 @@ } } - # Send header, don't cache this page - &Apache::loncommon::no_cache($r); - $r->send_http_header; - - my $showPoints = - (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard') - || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories')); - my $notshowSPRSlink = - (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external') - || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals')); - my $notshowTotals= - $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'; - my $showCategories= - $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'; - - - my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display"; - my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}]; - $r->print(&Apache::loncommon::start_page($title,undef, - {'bread_crumbs' => $brcrum}) - ); + unless ($reinitresult eq 'update') { + # Send header, don't cache this page + &Apache::loncommon::no_cache($r); + $r->send_http_header; + &startpage($r,$showPoints); + } + $r->rflush(); &startGradeScreen($r,'quick'); @@ -204,6 +219,14 @@ } $r->rflush(); + my $notshowSPRSlink = + (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external') + || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals')); + my $notshowTotals= + $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'; + my $showCategories= + $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'; + my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)= &getData($showPoints,$uname,$udom); @@ -248,6 +271,14 @@ } } +sub startpage { + my ($r,$showPoints) = @_; + my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display"; + my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}]; + $r->print(&Apache::loncommon::start_page($title,undef, + {'bread_crumbs' => $brcrum}) + ); +} sub startGradeScreen { my ($r,$mode)=@_; Index: loncom/interface/lonnavdisplay.pm diff -u loncom/interface/lonnavdisplay.pm:1.34 loncom/interface/lonnavdisplay.pm:1.35 --- loncom/interface/lonnavdisplay.pm:1.34 Mon Jun 26 01:56:58 2017 +++ loncom/interface/lonnavdisplay.pm Thu Nov 16 13:41:56 2017 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Display Handler # -# $Id: lonnavdisplay.pm,v 1.34 2017/06/26 01:56:58 raeburn Exp $ +# $Id: lonnavdisplay.pm,v 1.35 2017/11/16 13:41:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,9 +62,15 @@ return REDIRECT; } +# ------------------------------------------------------------ Get query string + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sort', + 'showOnlyHomework', + 'postsymb','register']); # Check if course needs to be re-initialized my $loncaparev = $r->dir_config('lonVersion'); my ($result, at reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); + my %prog_state=(); + my $closure; if ($result eq 'switch') { &Apache::loncommon::content_type($r,'text/html'); @@ -72,10 +78,32 @@ $r->print(&Apache::loncommon::check_release_result(@reinit)); return OK; } elsif ($result eq 'update') { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); + my $cid = $env{'request.course.id'}; + my $cnum = $env{'course.'.$cid.'.num'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + &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; @@ -86,52 +114,47 @@ my $course_type = &Apache::loncommon::course_type(); if (($course_type eq 'Placement') && (!$env{'request.role.adv'})) { my $furl = &Apache::lonpageflip::first_accessible_resource(); - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $furl); - return REDIRECT; + 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; + } } # 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; } - # Send header, don't cache this page - &Apache::loncommon::content_type($r,'text/html'); - $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); } - $r->print($start_page. - ''); + &startContentScreen($r,'navmaps'); - $r->rflush(); + unless ($result eq 'update') { + $r->rflush(); + } # Check that it's defined if (!($navmap->courseMapDefined())) { @@ -316,6 +339,33 @@ return OK; } +sub startpage { + my ($r) = @_; +# ----------------------------------------------------- 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); + } 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); + } + $r->print($start_page. + ''); + return; +} + sub startContentScreen { my ($r,$mode)=@_; Index: rat/lonpageflip.pm diff -u rat/lonpageflip.pm:1.96 rat/lonpageflip.pm:1.97 --- rat/lonpageflip.pm:1.96 Mon Jun 26 01:57:11 2017 +++ rat/lonpageflip.pm Thu Nov 16 13:42:01 2017 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.96 2017/06/26 01:57:11 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.97 2017/11/16 13:42:01 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -299,6 +299,28 @@ return $usehttp; } +sub reinited_js { + my ($url,$cid,$timeout) = @_; + if (!$timeout) { + $timeout = 0; + } + return <<"END"; + +END +} + # ================================================================ Main Handler sub handler { @@ -315,6 +337,7 @@ my %cachehash=(); my $multichoice=0; my %multichoicehash=(); + my %prog_state=(); my ($redirecturl,$redirectsymb,$enc,$anchor); my $next=''; my $hostname = $r->hostname(); @@ -372,8 +395,20 @@ 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; @@ -396,9 +431,16 @@ } 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 @@ -427,9 +469,15 @@ } 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 @@ -447,11 +495,18 @@ 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? @@ -548,9 +603,16 @@ $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'); @@ -653,12 +715,23 @@ } } 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 {