[LON-CAPA-cvs] cvs: rat / lonpageflip.pm

raeburn raeburn at source.lon-capa.org
Sun Mar 22 20:03:16 EDT 2015


raeburn		Mon Mar 23 00:03:16 2015 EDT

  Modified files:              
    /rat	lonpageflip.pm 
  Log:
  - When course changed after "Big Hash" last tied for current user's session,
    and course is re-initialized, accommodate:
   (a) removal of the $coursefn_symb.db file
   (b) case where page being flipped from no longer accessible to the user.
  
  
-------------- next part --------------
Index: rat/lonpageflip.pm
diff -u rat/lonpageflip.pm:1.88 rat/lonpageflip.pm:1.89
--- rat/lonpageflip.pm:1.88	Sat Mar 14 22:26:50 2015
+++ rat/lonpageflip.pm	Mon Mar 23 00:03:16 2015
@@ -2,7 +2,7 @@
 #
 # Page flip handler
 #
-# $Id: lonpageflip.pm,v 1.88 2015/03/14 22:26:50 raeburn Exp $
+# $Id: lonpageflip.pm,v 1.89 2015/03/23 00:03:16 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -270,33 +270,56 @@
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']);
   if (($env{'form.postdata'})&&($env{'request.course.fn'})) {
       my ($direction,$currenturl) = ($env{'form.postdata'}=~/(\w+)\:(.*)/);
-
+      if ($currenturl=~m|^/enc/|) {
+          $currenturl=&Apache::lonenc::unencrypted($currenturl);
+      }
+      $currenturl=~s/\.\d+\.(\w+)$/\.$1/;
+      $currenturl=~s/^https?\:\/\///;
+      $currenturl=~s/^[^\/]+//;
+      my ($preupdatepos,$last,$reinitcheck);
+      if ($direction eq 'return') {
+          if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+                    &GDBM_READER(),0640)) {
+              $last=$hash{'last_known'};
+              untie(%hash);
+          }
+      }
       if ($env{'request.course.id'}) {
           # Check if course needs to be re-initialized
           my $loncaparev = $r->dir_config('lonVersion');
-          my ($result, at reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
-          if ($result eq 'switch') {
+          ($reinitcheck,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
+          if ($reinitcheck 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') {
+          } elsif ($reinitcheck eq 'update') {
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+              $preupdatepos = &Apache::lonnet::symbread($currenturl);
+              unless ($direction eq 'return') {
+                  if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+                                &GDBM_READER(),0640)) {
+                      $last=$hash{'last_known'};
+                      untie(%hash);
+                  }
+              }
               my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
               if ($ferr) {
                   my $requrl = $r->uri;
                   $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
                   $env{'user.reinit'} = 1;
                   return HTTP_NOT_ACCEPTABLE;
+              } else {
+                  if ($last) {
+                      my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last);
+                      unless (&Apache::lonnet::symbverify($last,$fn)) {
+                          undef($last);
+                      }
+                  }
               }
           }
       }
-
-      if ($currenturl=~m|^/enc/|) {
-	  $currenturl=&Apache::lonenc::unencrypted($currenturl);
-      }
-      $currenturl=~s/\.\d+\.(\w+)$/\.$1/;
       if ($direction eq 'firstres') {
 	  my $furl=&first_accessible_resource();
 	  &Apache::loncommon::content_type($r,'text/html');
@@ -305,14 +328,8 @@
 	     
 	  return REDIRECT;
       }
-      if ($direction eq 'return') {
+      if ($direction eq 'return') { 
 # -------------------------------------------------------- Return to last known
-         my $last;
-         if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
-                    &GDBM_READER(),0640)) {
-	     $last=$hash{'last_known'};
-             untie(%hash);
-         }
          my $newloc;
          if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db',
                         &GDBM_READER(),0640))) {
@@ -321,45 +338,50 @@
 	    $newloc=$hash{'src_'.$id};
 	    if ($newloc) {
 		if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }
-			      
 	    } else {
 		$newloc='/adm/navmaps';
 	    }
             untie %hash;
          } else {
 	    $newloc='/adm/navmaps';
-         }  
-	     &Apache::loncommon::content_type($r,'text/html');
-	     $r->header_out(Location => 
-			    &Apache::lonnet::absolute_url().$newloc);
+         }
+	 &Apache::loncommon::content_type($r,'text/html');
+	 $r->header_out(Location => 
+			&Apache::lonnet::absolute_url().$newloc);
 	     
-	     return REDIRECT;
+	 return REDIRECT;
       }
-      $currenturl=~s/^https?\:\/\///;
-      $currenturl=~s/^[^\/]+//;
 #
 # Is the current URL on the map? If not, start with last known URL
 #
+
       unless (&Apache::lonnet::is_on_map($currenturl)) {
-	 my $last;
-         if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
-                    &GDBM_READER(),0640)) {
-	     $last=$hash{'last_known'};
+         if ($preupdatepos) {
+             undef($preupdatepos);
+         } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+                            &GDBM_READER(),0640)) {
+             $last=$hash{'last_known'};
              untie(%hash);
          }
+         my $newloc;
          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/noidea.html');
-		 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?
       my $position;
-      if ($position=Apache::lonnet::symbread($currenturl)) {
+      if ($preupdatepos) {
+          $position = $preupdatepos;
+      } else {
+          $position=Apache::lonnet::symbread($currenturl);
+      }
+      if ($position) {
 # ------------------------------------------------------------------------- Yes
 	  my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position);
           $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum];
@@ -429,11 +451,11 @@
 		  }
 # ------------------------------------- Check for and display critical messages
                   my ($redirect, $url) = &Apache::loncommon::critical_redirect(300);
-                  unless ($redirect) { 
+                  unless ($redirect) {
                       $url=&Apache::lonnet::absolute_url().$redirecturl;
-		      $url = &add_get_param($url, { 'symb' => $redirectsymb});
+                      $url = &add_get_param($url, { 'symb' => $redirectsymb});
                   }
-		  &Apache::loncommon::content_type($r,'text/html');
+                  &Apache::loncommon::content_type($r,'text/html');
                   $r->header_out(Location => $url);
                   return REDIRECT;
 	      } else {
@@ -450,7 +472,10 @@
 						     'pick' =>
 						     'Please click on the the resource you intend to access',
 						     'titleheader' => 'Title',
-						     'type' => 'Type');
+						     '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.');
                   if (&Apache::loncommon::course_type() eq 'Community') {
                       $lt{'nav'} = &mt('Community Contents');
                   }
@@ -479,17 +504,38 @@
                      }
                      $r->print('</table>');
                   } else {
+                      if ($reinitcheck) {
+                          if (&Apache::loncommon::course_type() eq 'Community') {
+                              $r->print(
+                                  &Apache::loncommon::start_page('Community Contents Updated'));
+                          } else { 
+                              $r->print(
+                                  &Apache::loncommon::start_page('Course Contents Updated'));
+                          }
+                          $r->print('<h2>'.$lt{'update'}.'</h2>'
+                                  .'<p>'.$lt{'expupdate'}.'<br />'
+                                  .$lt{'gonav'}.'</p>');
+                      } else {
+                          $r->print(
+                              &Apache::loncommon::start_page('No Resource')
+                             .'<h2>'.$lt{'title'}.'</h2>'
+                             .'<p>'.$lt{'explain'}.'</p>');
+                      }
+		  }
+                  if ((!@possibilities) && ($reinitcheck))  {
+                      $r->print(
+                          &Apache::lonhtmlcommon::actionbox(
+                              ['<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'
+                              ]));
+                  } else {
                       $r->print(
-                          &Apache::loncommon::start_page('No Resource')
-                         .'<h2>'.$lt{'title'}.'</h2>'
-                         .'<p>'.$lt{'explain'}.'</p>');
+                          &Apache::lonhtmlcommon::actionbox(
+                              ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a></li>',
+                               '<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'
+                              ]));
                   }
-                  $r->print(
-                      &Apache::lonhtmlcommon::actionbox(
-                          ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a></li>',
-                           '<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'
-                          ])
-                     .&Apache::loncommon::end_page());
+                  $r->print(&Apache::loncommon::end_page());
+      
                   return OK;
 	      }
 	  } else {


More information about the LON-CAPA-cvs mailing list