[LON-CAPA-cvs] cvs: rat(version_2_11_X) / lonpage.pm

raeburn raeburn at source.lon-capa.org
Thu Mar 5 15:46:04 EST 2020


raeburn		Thu Mar  5 20:46:04 2020 EDT

  Modified files:              (Branch: version_2_11_X)
    /rat	lonpage.pm 
  Log:
  - For 2.11
    Backport 1.130, 1.131, 1.132, 1.133, 1.134, 1.135, 1.136, 1.137
  
  
-------------- next part --------------
Index: rat/lonpage.pm
diff -u rat/lonpage.pm:1.111.2.10 rat/lonpage.pm:1.111.2.11
--- rat/lonpage.pm:1.111.2.10	Wed Jan 22 14:55:13 2020
+++ rat/lonpage.pm	Thu Mar  5 20:46:04 2020
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Page Handler
 #
-# $Id: lonpage.pm,v 1.111.2.10 2020/01/22 14:55:13 raeburn Exp $
+# $Id: lonpage.pm,v 1.111.2.11 2020/03/05 20:46:04 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -43,6 +43,7 @@
 use Apache::lonhomework;
 use Apache::lonenc();
 use HTML::TokeParser;
+use HTML::Entities();
 use GDBM_File;
 use Apache::lonsequence;
 use lib '/home/httpd/lib/perl/';
@@ -186,6 +187,8 @@
       if (-e "$fn.db") {
           my %buttonshide;
           my $hostname = $r->hostname();
+          my $lonhost = $r->dir_config('lonHostID');
+          my $ip = &Apache::lonnet::get_host_ip($lonhost);
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640)) {
 # ------------------------------------------------------------------- Hash tied
               my $firstres=$hash{'map_start_'.$requrl};
@@ -264,23 +267,74 @@
                       foreach (@colcont) {
                           my $src=$hash{'src_'.$_};
                           my $plainsrc = $src;
+                          my $anchor;
+                          if ($hash{'ext_'.$_} eq 'true:') {
+                              $cellexternal{$_}=($hash{'ext_'.$_} eq 'true:');
+                              $src =~ s{^/ext/}{http://};
+                              $src =~ s{http://https://}{https://};
+                              if ($src =~ /(\#[^#]+)$/) {
+                                  $anchor = $1;
+                                  $src =~ s/\#[^#]+$//;
+                              }
+                          }
+                          my $unencsrc = $src;
                           my ($extension)=($src=~/\.(\w+)$/);
-			  $cellexternal{$_}=($hash{'ext_'.$_} eq 'true:');
 			  if ($hash{'encrypted_'.$_}) {
 			      $src=&Apache::lonenc::encrypted($src);
 			  }
                           my ($mapid,$resid)=split(/\./,$_);
-                          my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$src);
+                          my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$plainsrc);
                           unless ($env{'request.role.adv'}) {
                               $buttonshide{$symb} = &Apache::lonnet::EXT("resource.0.buttonshide",$symb);
                           }
                           $cellemb{$_}=
 			      &Apache::loncommon::fileembstyle($extension);
                           if ($cellexternal{$_}) {
-                              unless (($target eq 'tex') || ($target eq 'tex_answer')) {
-                                  $ssibody{$_} = <<ENDEXT;
-<iframe src="$src" width="100%">No iframe support!</iframe>
+                              if (($target eq 'tex') || ($target eq 'tex_answer')) {
+                                  my $shown = $src.$anchor;
+                                  if (($hash{'encrypted_'.$_}) && (!$env{'request.role.adv'})) {
+                                      $shown = &mt('URL not shown (encrypted)');
+                                  }
+                                  my $title=&Apache::lonnet::gettitle($symb);
+                                  $title = &Apache::lonxml::latex_special_symbols($title);
+                                  $shown = &Apache::lonxml::latex_special_symbols($shown);
+                                  $ssibody{$_} = ' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.'\\\\';
+                              } else {
+                                  my $showsrc = $src;
+                                  my ($is_pdf,$title,$linktext);
+                                  if ($unencsrc =~ /\.pdf$/i) {
+                                      $is_pdf = 1;
+                                  }
+                                  if (($hash{'encrypted_'.$_}) && ($symb)) {
+                                      $title=&Apache::lonnet::gettitle(&Apache::lonenc::encrypted($symb));
+                                  } else {
+                                      $title=&Apache::lonnet::gettitle($symb);
+                                  }
+                                  if ($env{'browser.mobile'}) {
+                                      if ($is_pdf) {
+                                          $linktext = &mt('Link to PDF (for mobile devices)');
+                                          $ssibody{$_} = &create_extlink($unencsrc,$anchor,$title,$linktext);
+                                      } else {
+                                          $linktext = &mt('Link to resource');
+                                          $ssibody{$_} = &create_extlink($unencsrc,$anchor,$title,$linktext);
+                                      }
+                                  } else {
+                                      my $absolute = $env{'request.use_absolute'};
+                                      my $uselink = &Apache::loncommon::is_nonframeable($unencsrc,$absolute,$hostname,$ip);
+                                      if (($uselink) || (($ENV{'SERVER_PORT'} == 443) && ($unencsrc =~ m{^http://}))) {
+                                          $linktext = &mt('Link to resource');
+                                          $ssibody{$_} =  &create_extlink($unencsrc,$anchor,$title,$linktext);
+                                      } else {
+                                          if (($hash{'encrypted_'.$_}) && ($symb) && (!$env{'request.role.adv'})) {
+                                              $showsrc .= '?symb='.&Apache::lonenc::encrypted($symb);
+                                          } elsif ($anchor) {
+                                              $showsrc .= $anchor
+                                          }
+                                          $ssibody{$_} = <<ENDEXT;
+<iframe src="$showsrc" width="100%" height="300px">No iframe support!</iframe>
 ENDEXT
+                                      }
+                                  }
                               }
                           } elsif ($cellemb{$_} eq 'ssi') {
 # --------------------------------------------------------- This is an SSI cell
@@ -565,6 +619,7 @@
                                             '// ]]>'.
                                             "\n</script>\n";
                           }
+                          &Apache::lonhtmlcommon::clear_breadcrumb_tools();
                           if (keys(%hastimeleft)) {
                               my (%uniquetimes,%uniquedisplays);
                               foreach my $item (values(%hastimeleft)) {
@@ -684,10 +739,7 @@
 				      }             
 				      $r->print('>');
 				  }
-                                  unless (($cellexternal{$rid}) && 
-                                          ($target eq 'tex') && ($target eq 'tex_answer')) {
-                                      $r->print($ssibody{$rid});
-                                  }
+                                  $r->print($ssibody{$rid});
 				  unless (($target eq 'tex') || ($target eq 'tex_answer')) {
 				      $r->print('</font>');
                                   }
@@ -790,35 +842,43 @@
 sub get_buttons {
     my ($hash,$rid,$buttonshide,$hostname) = @_;
 
-    my $metainfo = '';
-    my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid});
     my ($mapid,$resid)=split(/\./,$rid);
     my $symb=&Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},
 					  $resid,
 					  $hash->{'src_'.$rid});
+    my $aname;
+    if (($hash->{'encrypted_'.$rid}) && (!$env{'request.role.adv'})) {
+        $aname = 'LC_'.$rid;
+    } else {
+        $aname = &escape($symb);
+    }
+    my $metainfo = '<a name="'.$aname.'"></a>';
     unless ($env{'request.role.adv'}) {
         if ($buttonshide->{$symb} eq 'yes') {
-            return;
+            return $metainfo;
         }
     }
+    my $crs_sec = $env{'request.course.id'} . (($env{'request.course.sec'} ne '')
+                                               ? "/$env{'request.course.sec'}"
+                                               : '');
+    my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid});
     if ($hash->{'encrypted_'.$rid}) {
-	$symb=&Apache::lonenc::encrypted($symb);
 	$esrc=&Apache::lonenc::encrypted($esrc);
     }
     if ($hash->{'src_'.$rid} !~ m-^/uploaded/-
-        && $hash->{'src_'.$rid} !~ m{^https?://}
+        && $hash->{'src_'.$rid} !~ m{^/ext/}
 	&& !$env{'request.enc'}
 	&& ($env{'request.role.adv'}
 	    || !$hash->{'encrypted_'.$rid})) { 
-	$metainfo .='<a name="'.&escape($symb).'" />'.
-	    '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" target="LONcatInfo">'.
+	$metainfo .= '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" '.
+	    'target="LONcatInfo">'.
             '<img src="/res/adm/pages/catalog.png" class="LC_icon"'.
             ' alt="'.&mt('Show Metadata').'"'.
             ' title="'.&mt('Show Metadata').'" />'.
 	    '</a>';
     }
     if (($hash->{'src_'.$rid} !~ m{^/uploaded/}) &&
-        ($hash->{'src_'.$rid} !~ m{^https?://})) {
+        ($hash->{'src_'.$rid} !~ m{^/ext/})) {
         $metainfo .= '<a href="/adm/evaluate?postdata='.
 	    &escape($esrc).
 	    '" target="LONcatInfo">'.
@@ -830,7 +890,8 @@
     if (($hash->{'src_'.$rid}=~/$LONCAPA::assess_re/) &&
 	($hash->{'src_'.$rid} !~ m-^/uploaded/-)) {
 
-	if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {
+	if ((&Apache::lonnet::allowed('mgr',$crs_sec)) ||
+            (&Apache::lonnet::allowed('vgr',$crs_sec))) {
 	    $metainfo.=
 		'<a href="/adm/grades?symb='.&escape($symb).
 #               '&command=submission" target="LONcatInfo">'.
@@ -838,7 +899,10 @@
                 '<img src="/adm/lonMisc/subm_button.png" class="LC_icon"'.
                 ' alt="'.&mt('View Submissions for a Student or a Group of Students').'"'.
                 ' title="'.&mt('View Submissions for a Student or a Group of Students').'" />'.
-		'</a>'.
+		'</a>';
+        }
+        if (&Apache::lonnet::allowed('mgr',$crs_sec)) {
+            $metainfo.=
 		'<a href="/adm/grades?symb='.&escape($symb).
 #               '&command=gradingmenu" target="LONcatInfo">'.
 		'&command=gradingmenu">'.
@@ -847,7 +911,8 @@
                 ' title="'.&mt('Content Grades').'" />'.
 		'</a>';
 	}
-	if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
+	if ((&Apache::lonnet::allowed('opa',$crs_sec)) ||
+            (&Apache::lonnet::allowed('vpa',$crs_sec))) {
 	    $metainfo.=
 		'<a href="/adm/parmset?symb='.&escape($symb).
 #               '" target="LONcatInfo">'.
@@ -888,12 +953,15 @@
             if ((&Apache::lonnet::allowed('cre','/')) &&
                 (&Apache::lonnet::metadata($url,'sourceavail') eq 'open')) {
                 $viewsrcbutton = 1;
-            } elsif (&Apache::lonnet::allowed('vxc',$env{'request.course.id'})) {
+            } elsif (&Apache::lonnet::allowed('vxc',$crs_sec)) {
                 if ($url =~ m{^\Q/res/$cdom/\E($LONCAPA::match_username)/}) {
                     my $auname = $1;
                     if (($env{'request.course.adhocsrcaccess'} ne '') &&
                         (grep(/^\Q$auname\E$/,split(/,/,$env{'request.course.adhocsrcaccess'})))) {
                         $viewsrcbutton = 1;
+                    } elsif ((&Apache::lonnet::metadata($url,'sourceavail') eq 'open') &&
+                             (&Apache::lonnet::allowed('bre',$crs_sec))) {
+                        $viewsrcbutton = 1;
                     }
                 }
             }
@@ -942,11 +1010,20 @@
 <span id="ddcountexpand" class="LC_menubuttons_inline_text" >$expand</span>
 <img src="/res/adm/pages/timer.png" title="$desc" class="LC_icon" alt="$alttxt" /><span class="LC_menubuttons_inline_text">$title</span></a>
 END
-    &Apache::lonhtmlcommon::clear_breadcrumb_tools();
     &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$output);
     return;
 }
 
+sub create_extlink {
+    my ($url,$anchor,$title,$linktext) = @_;
+    my $shownlink;
+    unless ($title eq '') {
+        $shownlink = '<span style="font-weight:bold;">'.$title.'</span><br />';
+    }
+    my $dest = &HTML::Entities::encode($url.$anchor,'&<>"');
+    $shownlink .= '<a href="'.$dest.'">'.$linktext.'</a>';
+    return $shownlink;
+}
 
 1;
 __END__


More information about the LON-CAPA-cvs mailing list