Diff for /rat/lonsequence.pm between versions 1.7 and 1.20

version 1.7, 2002/04/02 21:17:34 version 1.20, 2004/09/10 06:38:24
Line 42  use strict; Line 42  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 Apache::lonratsrv;
   use Apache::lonpageflip;
   use Apache::loncommon;
   use Apache::lonlocal;
   
   my %selhash;
   my $successtied;
   
 # ----------------------------------------------------------- Could not resolve  # ----------------------------------------- Attempt to read from resource space
   
 sub getlost {  sub attemptread {
     my ($r,$errmsg)=@_;      my $fn=shift;
     $r->content_type('text/html');      &Apache::lonnet::repcopy($fn);
     $r->send_http_header;      if (-e $fn) {
     $r->print(   return &Apache::lonratedt::attemptread($fn);
  '<head><title>Unknown Error</title></head><body bgcolor="#FFFFFF"><h1>'.      } else {
  'LON-CAPA</h1>Could not handle sequence resource reference.<p>'.$errmsg.          return ();
  '</body></html>');      }
 }  }
   
   sub mapread {
       my $fn=shift;
       &Apache::lonnet::repcopy($fn);
       if (-e $fn) {
    return &Apache::lonratedt::mapread($fn,'');
       } else {
           return ();
       }
   }
   
   # ---------------------------------------------------------------- View Handler
   
   sub viewmap {
       my ($r,$url)=@_;
       $r->print('<html>');
       if ($ENV{'form.forceselect'}) { $r->print(<<ENDSCRIPT);
   <script>
   
   function select_group() {
       window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value;
   }
   
   function queue(val) {
       if (eval("document.forms."+val+".filelink.checked")) {
    var l=val.length;
    var v=val.substring(4,l);
    document.forms.fileattr.acts.value+='1a'+v+'b';
       }
       else {
    var l=val.length;
    var v=val.substring(4,l);
    document.forms.fileattr.acts.value+='0a'+v+'b';
       }
   }
   
   </script>
   ENDSCRIPT
       }
       $r->print(&Apache::loncommon::bodytag('Map Contents').'<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=''>
   <input type="button" name="close" value='CLOSE' onClick="self.close()">
   <input type="button" name="groupimport" value='GROUP IMPORT'
   onClick="javascript:select_group()">
   </form>   
   ENDSELECT
       my $diropendb = 
       "/home/httpd/perl/tmp/$ENV{'user.domain'}\_$ENV{'user.name'}_groupsec.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 'groupimport') {
       my $acts=$ENV{'form.acts'};
       my @Acts=split(/b/,$acts);
       my %ahash;
       my %achash;
       my $ac=0;
       # some initial hashes for working with data
       foreach (@Acts) {
    my ($state,$ref)=split(/a/);
    $ahash{$ref}=$state;
    $achash{$ref}=$ac;
    $ac++;
       }
       # sorting through the actions and changing the tied database hash
       foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) {
    my $key=$_;
    if ($ahash{$key} eq '1') {
       $selhash{'store_'.$selhash{'pre_'.$key.'_link'}}=
    $selhash{'pre_'.$key.'_title'};
       $selhash{'storectr_'.$selhash{'pre_'.$key.'_link'}}=
    $selhash{'storectr'}+0;
       $selhash{'storectr'}++;
    }
    if ($ahash{$key} eq '0') {
       if ($selhash{'store_'.$selhash{'pre_'.$key.'_link'}}) {
          delete $selhash{'store_'.$selhash{'pre_'.$key.'_link'}};
       }
    }
       }
       # deleting the previously cached listing
       foreach (keys %selhash) {
    if ($_ =~ /^pre_/ && $_ =~/link$/) {
       my $key = $_;
       $key =~ s/^pre_//;
       $key =~ s/_[^_]*$//;
       delete $selhash{'pre_'.$key.'_title'};
       delete $selhash{'pre_'.$key.'_link'};
    }
       }
    }
   # -
           }
       }
   # ----------------------------- 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;
       foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
    if (defined($_)) {
               $idx++;
               if ($successtied) { 
    $r->print('<form name="form'.$idx.'">');
               }
       my ($title,$url)=split(/\:/,$_);
               $title=~s/\&colon\;/\:/g;
               $url=~s/\&colon\;/\:/g;
               unless ($title) { $title=(split(/\//,$url))[-1] };
               unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }
               if ($url) {
    if ($successtied) {
       my $checked='';
              if ($selhash{'store_'.$url}) {
               $checked=" checked";
              }
              $selhash{"pre_${idx}_link"}=$url;
              $selhash{"pre_${idx}_title"}=$title;
   
       $r->print(<<ENDCHECKBOX);
   <input type='checkbox' name='filelink' 
   value='$url' onClick='javascript:queue("form$idx")'$checked>
   <input type='hidden' name='title' value='$title'>
   ENDCHECKBOX
                   }
    $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');
               }
               $r->print(&Apache::lonratsrv::qtescape($title));
               if ($url) { $r->print('</a>'); }
               if ($successtied) {
    $r->print('</form>');
               } else {
    $r->print('<br>');
               }
           }
       }
       $r->print('</body></html>');
       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'},
                                             ['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
   if ($ENV{'request.course.fn'}) {    my $disurl='';
     my $dismapid='';
     my $exitdisid = '';
     my $arrow_dir = '';
   
     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);
        }         }
Line 86  sub handler { Line 263  sub handler {
        }         }
 # ------------------------------------------------------------- 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';             }
            }   
            my $disurl='';  
            my $dismapid='';  
            if ($disid) {             if ($disid) {
        $disurl=$bighash{'src_'.$disid};         $disurl=$bighash{'src_'.$disid};
                $dismapid=(split(/\./,$disid))[1];                 $dismapid=(split(/\./,$disid))[1];
                  $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];
                      $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);
            if ($disurl) {         }
      }
   
   # now either disurl is set (going to first page), or we need another display
      if ($disurl) {
 # -------------------------------------------------- Has first or last resource  # -------------------------------------------------- Has first or last resource
                &Apache::lonnet::symblist($requrl,$disurl => $dismapid,        &Apache::lonnet::symblist($requrl,$disurl => $dismapid,
                    'last_known' => &Apache::lonnet::declutter($disurl));                      'last_known' => &Apache::lonnet::declutter($disurl)); 
        $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 {
 # ---------- Does not have first or last resource, try to find out where we are         &Apache::loncommon::content_type($r,'text/html');
                unless ($symb) {         $r->send_http_header;
    $r->internal_redirect('/adm/ambiguous');         if ($exitdisid eq '') {
                }             my %lt =&Apache::lonlocal::texthash(
                $r->content_type('text/html');                     'back' => 'beginning',
                $r->send_http_header;                     'forward' => 'end',
                $r->print(<<ENDSYMB);                     'emfo' => 'Empty Folder/Sequence',
 <html><body bgcolor="#FFFFFF">                     'nere' => 'Next resource could not be displayed',
 <h2>$whatend of</h2>                     'goba' => 'Go Back',
 <h1>$sequencetitle</h1>                     'nacc' => 'Navigate Course Content',
 </body></html>                            );
 ENDSYMB             my $warnmsg = 'As all folders and sequences ';
                return OK             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 $bodytag=&Apache::loncommon::bodytag('Empty Folder/Sequence');
              $r->print(<<ENDNONE);
   <head><title>$lt{'emfo'}</title></head>
   $bodytag
   <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>
   </body>
    </html>
   ENDNONE
        } else {         } else {
           &getlost($r,'Could not access course structure.');             &viewmap($r,$requrl);
           return OK;  
        }         }
    } else {         return OK;
       $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";  
       return HTTP_NOT_ACCEPTABLE;   
    }     }
   
    return OK;  
 }  }
   
 1;  1;

Removed from v.1.7  
changed lines
  Added in v.1.20


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