Diff for /rat/lonsequence.pm between versions 1.9 and 1.32

version 1.9, 2002/05/23 10:58:05 version 1.32, 2007/12/01 01:59:54
Line 26 Line 26
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Handler to resolve ambiguous file locations  
 #  
 # (TeX Content Handler  
 #  
 # 05/29/00,05/30,10/11 Gerd Kortemeyer)  
 #  
 # 10/11,10/12 Gerd Kortemeyer)  
 #  
 # 10/16 Gerd Kortemeyer  
   
 package Apache::lonsequence;  package Apache::lonsequence;
   
Line 42  use strict; Line 33  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use GDBM_File;  use GDBM_File;
 use Apache::lonratedt;  use LONCAPA::map();
 use Apache::lonratsrv;  use Apache::lonpageflip();
   use Apache::loncommon();
 # ----------------------------------------------------------- Could not resolve  use Apache::groupsort();
   use Apache::lonlocal;
 sub getlost {  use HTML::Entities();
     my ($r,$errmsg)=@_;  
     $r->content_type('text/html');  
     $r->send_http_header;  
     $r->print(  
  '<head><title>Unknown Error</title></head><body bgcolor="#FFFFFF"><h1>'.  
  'LON-CAPA</h1>Could not handle sequence resource reference.<p>'.$errmsg.  
  '</body></html>');  
 }  
   
   my %selhash;
   my $successtied;
   
 # ----------------------------------------- Attempt to read from resource space  # ----------------------------------------- Attempt to read from resource space
   
 sub attemptread {  sub attemptread {
       my ($fn,$unsorted)=@_;
       &Apache::lonnet::repcopy($fn);
       if (-e $fn) {
    return &LONCAPA::map::attemptread($fn,$unsorted);
       } else {
           return ();
       }
   }
   
   sub mapread {
     my $fn=shift;      my $fn=shift;
     &Apache::lonnet::repcopy($fn);      &Apache::lonnet::repcopy($fn);
     if (-e $fn) {      if (-e $fn) {
  return &Apache::lonratedt::attemptread($fn);   return &LONCAPA::map::mapread($fn,'');
     } else {      } else {
         return ();          return ();
     }      }
Line 74  sub attemptread { Line 69  sub attemptread {
   
 sub viewmap {  sub viewmap {
     my ($r,$url)=@_;      my ($r,$url)=@_;
     $r->print('<html>');  
     if ($ENV{'form.forceselect'}) { $r->print(<<ENDSCRIPT);      my $js;
 <script>      if ($env{'form.forceselect'}) {
    $js = (<<ENDSCRIPT);
   <script type="text/javascript">
   
 function select_group() {  function select_group() {
     window.location="/adm/groupsort?catalogmode=groupimport&mode=rat&acts="+document.forms.fileattr.acts.value;      window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value;
 }  }
   
 function queue(val) {  function queue(val) {
Line 98  function queue(val) { Line 95  function queue(val) {
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     }      }
     $r->print('<body bgcolor="#FFFFFF">');  
     if ($ENV{'form.forceselect'}) { $r->print(<<ENDSELECT);      $r->print(&Apache::loncommon::start_page('Map Contents',$js).
         '<h1>'.$url.'</h1>');
   # ------------------ This is trying to select. Provide buttons and tie %selhash
       if ($env{'form.forceselect'}) { $r->print(<<ENDSELECT);
 <form name=fileattr><input type=hidden name=acts value=''>  <form name=fileattr><input type=hidden name=acts value=''>
 <input type="button" name="close" value='CLOSE' onClick="self.close()">  <input type="button" name="close" value='CLOSE' onClick="self.close()">
 <input type="button" name="groupimport" value='GROUP IMPORT'  <input type="button" name="groupimport" value='GROUP IMPORT'
 onClick="javascript:select_group()">  onClick="javascript:select_group()">
 </form>     </form>   
 ENDSELECT  ENDSELECT
       my $diropendb = 
       "/home/httpd/perl/tmp/$env{'user.domain'}\_$env{'user.name'}_sel_res.db";
           if (tie(%selhash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
       if ($env{'form.launch'} eq '1') {
          &start_fresh_session();
       }
               $successtied=1;
   
   # - Evaluate actions from previous page (both cumulatively and chronologically)
       if ($env{'form.catalogmode'} eq 'import') {
    &Apache::groupsort::update_actions_hash(\%selhash);
       }
   # -
           }
       }
   # ----------------------------- successtied is now '1' if in working selectmode
       my ($errtext,$fatal)=&mapread(&Apache::lonnet::filelocation('',$url),'');
       if ($fatal==1) {
          $r->print('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />');
     }      }
     my $idx=0;      my $idx=0;
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {      foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($_)) {
             $idx++;              $idx++;
             if ($ENV{'form.forceselect'}) {               if ($successtied) { 
  $r->print('<form name="form'.$idx.'">');   $r->print('<form name="form'.$idx.'">');
             }              }
     my ($title,$url)=split(/\:/,$_);      my ($title,$url)=split(/\:/,$_);
             $title=~s/\&colon\;/\:/g;      $title = &LONCAPA::map::qtescape($title);
             $url=~s/\&colon\;/\:/g;      unless ($title) { $title=(split(/\//,$url))[-1] };
             unless ($title) { $title=(split(/\//,$url))[-1] };              my $enc_title = &HTML::Entities::encode($title,'\'"<>&');
             unless ($title) { $title='<i>Empty</i>'; }      unless ($title) {
    $title='<i>'.&mt('Empty').'</i>';
    $enc_title = &mt('Empty');
       }
       $url  = &LONCAPA::map::qtescape($url);
               my $enc_url = &HTML::Entities::encode($url,'\'"<>&');
             if ($url) {              if ($url) {
  if ($ENV{'form.forceselect'}) {   if ($successtied) {
       my $checked='';
              if ($selhash{'store_'.$url}) {
               $checked=" checked";
              }
              $selhash{"pre_${idx}_link"}=$url;
              $selhash{"pre_${idx}_title"}=$title;
       
       $url  = &HTML::Entities::encode($url, '\'"<>&');
     $r->print(<<ENDCHECKBOX);      $r->print(<<ENDCHECKBOX);
 <input type='checkbox' name='filelink'   <input type='checkbox' name='filelink' 
 value='$url' onClick='javascript:queue("form$idx")' >  value='$enc_url' onClick='javascript:queue("form$idx")'$checked />
 <input type='hidden' name='title' value='$title'>  <input type='hidden' name='title' value='$enc_title' />
 ENDCHECKBOX  ENDCHECKBOX
                 }                  }
  $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');   $r->print('<a href="'.$enc_url.'">');
             }              }
             $r->print(&Apache::lonratsrv::qtescape($title));              $r->print($enc_title);
             if ($url) { $r->print('</a>'); }              if ($url) { $r->print('</a>'); }
             if ($ENV{'form.forceselect'}) {              if ($successtied) {
  $r->print('</form>');   $r->print('</form>');
             } else {              } else {
  $r->print('<br>');   $r->print('<br>');
             }              }
         }          }
     }      }
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_page());
       if ($successtied) {
    untie %selhash;
       }
   }
   
   # ----------------------------------------------------------- Clean out selhash
   sub start_fresh_session {
       foreach (keys %selhash) {
    if ($_ =~ /^pre_/) {
       delete $selhash{$_};
    }
    if ($_ =~ /^store/) {
       delete $selhash{$_};
    }
       }
 }  }
   
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
    my $r=shift;     my $r=shift;
   
    if ($r->header_only) {     if ($r->header_only) {
       $r->content_type('text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;        $r->send_http_header;
       return OK;        return OK;
    }     }
     
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                           ['forceselect']);                                            ['forceselect','launch']);
   
    my %hash;     my %hash;
    my %bighash;     my %bighash;
    my $requrl=$r->uri;     my $requrl=$r->uri;
   
      $successtied=0;
 # ------------------------------------------------------------ Tie symb db file  # ------------------------------------------------------------ Tie symb db file
   my $disurl='';    my $disurl='';
   my $dismapid='';    my $dismapid='';
     my $exitdisid = '';
     my $arrow_dir = '';
   
   if (($ENV{'request.course.fn'}) && (!$ENV{'form.forceselect'})) {    if (($env{'request.course.fn'}) && (!$env{'form.forceselect'})) {
        my $last;         my $last;
        if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',         if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                     &GDBM_READER,0640)) {                      &GDBM_READER(),0640)) {
    $last=$hash{'last_direction'};     $last=$hash{'last_direction'};
            untie(%hash);             untie(%hash);
        }         }
        my $direction='';         my $direction='';
        my $prevmap='';         my $prevmap='';
        if ($last) {         if ($last) {
   ($prevmap,$direction)=(split(/\_\_\_/,$last));     ($prevmap,undef,$direction)=&Apache::lonnet::decode_symb($last);
        }         }
 # ------------------------------------------------------------- Tie big db file  # ------------------------------------------------------------- Tie big db file
        if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',         if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
                     &GDBM_READER,0640)) {                      &GDBM_READER(),0640)) {
    my $disid='';     my $disid='';
            my $whatend='';             my $randomout ='';
   
            if ($direction eq 'back') {             if ($direction eq 'back') {
        $disid=$bighash{'map_finish_'.$requrl};         $disid=$bighash{'map_finish_'.$requrl};
                $whatend='End';  
            } else {             } else {
                $disid=$bighash{'map_start_'.$requrl};                 $disid=$bighash{'map_start_'.$requrl};
                $whatend='Beginning';             }
            }   
            if ($disid) {             if ($disid) {
        $disurl=$bighash{'src_'.$disid};         $disurl=$bighash{'src_'.$disid};
                $dismapid=(split(/\./,$disid))[1];                 $dismapid=(split(/\./,$disid))[1];
          if (!$env{'request.role.adv'}) {
      $randomout = $bighash{'randomout_'.$disid};
          }
              } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                       &GDBM_READER(),0640)) {
                  $last=$hash{'last_known'};
                  untie(%hash);
            }             }
            my $symb='';  
            my $sequencetitle='';  
            unless($disurl) {  # ----------- If this is an empty one, or hidden, skip to next non-empty or non-hidden one
                if ($symb=&Apache::lonnet::symbread()) {             while ( ((!$disurl) && ($disid)) || ($randomout && $disid) ) {
    my ($mapurl,$mapid)=split(/\_\_\_/,$symb);         $direction=($direction?$direction:'forward');
                    $sequencetitle=$bighash{'title_'.                 ($disid,$requrl)=
           $bighash{'map_pc_/res/'.$mapurl}.'.'.                           &Apache::lonpageflip::fullmove($disid,
   $mapid};                             &Apache::lonnet::declutter($requrl),$direction);
                  if ($disid) {
              $disurl=$bighash{'src_'.$disid};
                      $dismapid=(split(/\./,$disid))[1];
      if (!$env{'request.role.adv'}) {
          $randomout = $bighash{'randomout_'.$disid};
      }
                }                 }
            }      }
              $exitdisid = $disid;
              $arrow_dir = $direction;
   
 # --------------------------------------- Untie hash, make sure to come by here  # --------------------------------------- Untie hash, make sure to come by here
            untie(%bighash);             untie(%bighash);
        }         }
    }     }
   
 # now either disurl is set (going to first page), or we need another display  # now either disurl is set (going to first page), or we need another display
   
    if ($disurl) {     if ($disurl) {
 # -------------------------------------------------- Has first or last resource  # -------------------------------------------------- Has first or last resource
       &Apache::lonnet::symblist($requrl,$disurl => $dismapid,        &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid],
                    'last_known' => &Apache::lonnet::declutter($disurl));    'last_known' => [$disurl,$dismapid]); 
       $r->content_type('text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl);        $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl);
       return REDIRECT;        return REDIRECT;
    } else {     } else {
        $r->content_type('text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        &viewmap($r,$requrl);         if ($exitdisid eq '' && $arrow_dir ne '') {
              my %lt =&Apache::lonlocal::texthash(
                      'back' => 'beginning',
                      'forward' => 'end',
                      'nere' => 'Next resource could not be displayed',
                      'goba' => 'Go Back',
                      'nacc' => 'Navigate Course Content',
                             );
              my $warnmsg = &mt('As all folders and sequences ');
              if ($arrow_dir eq 'forward') {
                  $warnmsg .= &mt('following the current resource were empty').',';
              } elsif ($arrow_dir eq 'back') {
                  $warnmsg .= &mt('preceding the current resource were empty').',';
              }
              $warnmsg .= &mt('you have now reached the').' '.$lt{$arrow_dir}.' '.&mt('of the course.');
              my $start_page=
          &Apache::loncommon::start_page('Empty Folder/Sequence');
              my $end_page=
          &Apache::loncommon::end_page();
              $r->print(<<ENDNONE);
   $start_page
   <h3>$lt{'nere'}</h3>
   <p>$warnmsg</p>
   <ul>
     <li><a href="javascript:history.go(-1)">$lt{'goba'}</a></li>
     <li><a href="/adm/navmaps">$lt{'nacc'}</a></li>
   </ul>
   $end_page
   ENDNONE
          } else {
              &viewmap($r,$requrl);
          }
        return OK;         return OK;
    }     }
 }  }

Removed from v.1.9  
changed lines
  Added in v.1.32


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>