[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface loncommon.pm

raeburn raeburn at source.lon-capa.org
Tue Mar 10 21:55:42 EDT 2015


raeburn		Wed Mar 11 01:55:42 2015 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	loncommon.pm 
  Log:
  - For 2.11
    Backport 1.1207
  
  
-------------- next part --------------
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.1075.2.87 loncom/interface/loncommon.pm:1.1075.2.88
--- loncom/interface/loncommon.pm:1.1075.2.87	Fri Mar  6 23:05:07 2015
+++ loncom/interface/loncommon.pm	Wed Mar 11 01:55:41 2015
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.1075.2.87 2015/03/06 23:05:07 raeburn Exp $
+# $Id: loncommon.pm,v 1.1075.2.88 2015/03/11 01:55:41 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -15345,8 +15345,206 @@
 
 =back
 
+=head1 Routines for version requirements for current course.
+
+=over 4
+
+=item * &check_release_required()
+
+Compares required LON-CAPA version with version on server, and
+if required version is newer looks for a server with the required version.
+
+Looks first at servers in user's owen domain; if none suitable, looks at
+servers in course's domain are permitted to host sessions for user's domain.
+
+Inputs:
+
+$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp)
+
+$courseid - Course ID of current course
+
+$rolecode - User's current role in course (for switchserver query string).
+
+$required - LON-CAPA version needed by course (format: Major.Minor).
+
+
+Returns:
+
+$switchserver - query string tp append to /adm/switchserver call (if
+                current server's LON-CAPA version is too old.
+
+$warning - Message is displayed if no suitable server could be found.
+
+=cut
+
+sub check_release_required {
+    my ($loncaparev,$courseid,$rolecode,$required) = @_;
+    my ($switchserver,$warning);
+    if ($required ne '') {
+        my ($reqdmajor,$reqdminor) = ($required =~ /^(\d+)\.(\d+)$/);
+        my ($major,$minor) = ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
+        if ($reqdmajor ne '' && $reqdminor ne '') {
+            my $otherserver;
+            if (($major eq '' && $minor eq '') ||
+                (($reqdmajor > $major) || (($reqdmajor == $major) && ($reqdminor > $minor)))) {
+                my ($userdomserver) = &Apache::lonnet::choose_server($env{'user.domain'},undef,$required,1);
+                my $switchlcrev =
+                    &Apache::lonnet::get_server_loncaparev($env{'user.domain'},
+                                                           $userdomserver);
+                my ($swmajor,$swminor) = ($switchlcrev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?$/);
+                if (($swmajor eq '' && $swminor eq '') || ($reqdmajor > $swmajor) ||
+                    (($reqdmajor == $swmajor) && ($reqdminor > $swminor))) {
+                    my $cdom = $env{'course.'.$courseid.'.domain'};
+                    if ($cdom ne $env{'user.domain'}) {
+                        my ($coursedomserver,$coursehostname) = &Apache::lonnet::choose_server($cdom,undef,$required,1);
+                        my $serverhomeID = &Apache::lonnet::get_server_homeID($coursehostname);
+                        my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
+                        my %defdomdefaults = &Apache::lonnet::get_domain_defaults($serverhomedom);
+                        my %udomdefaults = &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+                        my $remoterev = &Apache::lonnet::get_server_loncaparev($serverhomedom,$coursedomserver);
+                        my $canhost =
+                            &Apache::lonnet::can_host_session($env{'user.domain'},
+                                                              $coursedomserver,
+                                                              $remoterev,
+                                                              $udomdefaults{'remotesessions'},
+                                                              $defdomdefaults{'hostedsessions'});
+
+                        if ($canhost) {
+                            $otherserver = $coursedomserver;
+                        } else {
+                            $warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).'<br />'. &mt("No suitable server could be found amongst servers in either your own domain or in the course's domain.");
+                        }
+                    } else {
+                        $warning = &mt('Requires LON-CAPA version [_1].',$env{'course.'.$courseid.'.internal.releaserequired'}).'<br />'.&mt("No suitable server could be found amongst servers in your own domain (which is also the course's domain).");
+                    }
+                } else {
+                    $otherserver = $userdomserver;
+                }
+            }
+            if ($otherserver ne '') {
+                $switchserver = 'otherserver='.$otherserver.'&role='.$rolecode;
+            }
+        }
+    }
+    return ($switchserver,$warning);
+}
+
+=pod
+
+=item * &check_release_result()
+
+Inputs:
+
+$switchwarning - Warning message if no suitable server found to host session.
+
+$switchserver - query string to append to /adm/switchserver containing lonHostID
+                and current role.
+
+Returns: HTML to display with information about requirement to switch server.
+         Either displaying warning with link to Roles/Courses screen or
+         display link to switchserver.
+
 =cut
 
+sub check_release_result {
+    my ($switchwarning,$switchserver) = @_;
+    my $output = &start_page('Selected course unavailable on this server').
+                 '<p class="LC_warning">';
+    if ($switchwarning) {
+        $output .= $switchwarning.'<br /><a href="/adm/roles">';
+        if (&show_course()) {
+            $output .= &mt('Display courses');
+        } else {
+            $output .= &mt('Display roles');
+        }
+        $output .= '</a>';
+    } elsif ($switchserver) {
+        $output .= &mt('This course requires a newer version of LON-CAPA than is installed on this server.').
+                   '<br />'.
+                   '<a href="/adm/switchserver?'.$switchserver.'">'.
+                   &mt('Switch Server').
+                   '</a>';
+    }
+    $output .= '</p>'.&end_page();
+    return $output;
+}
+
+=pod
+
+=item * &needs_coursereinit()
+
+Determine if course contents stored for user's session needs to be
+refreshed, because content has changed since "Big Hash" last tied.
+
+Check for change is made if time last checked is more than 10 minutes ago
+(by default).
+
+Inputs:
+
+$loncaparev - Version on current server (format: Major.Minor.Subrelease-datestamp)
+
+$interval (optional) - Time which may elapse (in s) between last check for content
+                       change in current course. (default: 600 s).
+
+Returns: an array; first element is:
+
+=over 4
+
+'switch' - if content updates mean user's session
+           needs to be switched to a server running a newer LON-CAPA version
+
+'update' - if course session needs to be refreshed (i.e., Big Hash needs to be reloaded)
+           on current server hosting user's session
+
+''       - if no action required.
+
+=back
+
+If first item element is 'switch':
+
+second item is $switchwarning - Warning message if no suitable server found to host session.
+
+third item is $switchserver - query string to append to /adm/switchserver containing lonHostID
+                              and current role.
+
+otherwise: no other elements returned.
+
+=back
+
+=cut
+
+sub needs_coursereinit {
+    my ($loncaparev,$interval) = @_;
+    return() unless ($env{'request.course.id'} && $env{'request.course.tied'});
+    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+    my $now = time;
+    if ($interval eq '') {
+        $interval = 600;
+    }
+    if (($now-$env{'request.course.timechecked'})>$interval) {
+        my $lastchange = &Apache::lonnet::get_coursechange($cdom,$cnum);
+        &Apache::lonnet::appenv({'request.course.timechecked'=>$now});
+        if ($lastchange > $env{'request.course.tied'}) {
+            my %curr_reqd_hash = &Apache::lonnet::userenvironment($cdom,$cnum,'internal.releaserequired');
+            if ($curr_reqd_hash{'internal.releaserequired'} ne '') {
+                my $required = $env{'course.'.$cdom.'_'.$cnum.'.internal.releaserequired'};
+                if ($curr_reqd_hash{'internal.releaserequired'} ne $required) {
+                    &Apache::lonnet::appenv({'course.'.$cdom.'_'.$cnum.'.internal.releaserequired' =>
+                                             $curr_reqd_hash{'internal.releaserequired'}});
+                    my ($switchserver,$switchwarning) =
+                        &check_release_required($loncaparev,$cdom.'_'.$cnum,$env{'request.role'},
+                                                $curr_reqd_hash{'internal.releaserequired'});
+                    if ($switchwarning ne '' || $switchserver ne '') {
+                        return ('switch',$switchwarning,$switchserver);
+                    }
+                }
+            }
+            return ('update');
+        }
+    }
+    return ();
+}
 
 sub update_content_constraints {
     my ($cdom,$cnum,$chome,$cid) = @_;


More information about the LON-CAPA-cvs mailing list