Diff for /rat/lonsequence.pm between versions 1.32.2.1 and 1.52

version 1.32.2.1, 2008/12/21 04:53:39 version 1.52, 2020/09/03 12:14:30
Line 27 Line 27
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
   
   
   
 package Apache::lonsequence;  package Apache::lonsequence;
   
 use strict;  use strict;
Line 34  use Apache::lonnet; Line 36  use Apache::lonnet;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use GDBM_File;  use GDBM_File;
 use LONCAPA::map();  use LONCAPA::map();
   use LONCAPA::ltiutils;
   use LONCAPA;
 use Apache::lonpageflip();  use Apache::lonpageflip();
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::groupsort();  use Apache::groupsort();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonnavmaps();
   use Apache::lonenc();
 use HTML::Entities();  use HTML::Entities();
   
 my %selhash;  my %selhash;
Line 100  ENDSCRIPT Line 106  ENDSCRIPT
       '<h1>'.$url.'</h1>');        '<h1>'.$url.'</h1>');
 # ------------------ This is trying to select. Provide buttons and tie %selhash  # ------------------ This is trying to select. Provide buttons and tie %selhash
     if ($env{'form.forceselect'}) { $r->print(<<ENDSELECT);      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 =       my $diropendb = 
     "/home/httpd/perl/tmp/$env{'user.domain'}\_$env{'user.name'}_sel_res.db";    LONCAPA::tempdir() .
       "$env{'user.domain'}\_$env{'user.name'}_sel_res.db";
         if (tie(%selhash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {          if (tie(%selhash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
     if ($env{'form.launch'} eq '1') {      if ($env{'form.launch'} eq '1') {
        &start_fresh_session();         &start_fresh_session();
Line 124  ENDSELECT Line 131  ENDSELECT
 # ----------------------------- successtied is now '1' if in working selectmode  # ----------------------------- successtied is now '1' if in working selectmode
     my ($errtext,$fatal)=&mapread(&Apache::lonnet::filelocation('',$url),'');      my ($errtext,$fatal)=&mapread(&Apache::lonnet::filelocation('',$url),'');
     if ($fatal==1) {      if ($fatal==1) {
        $r->print('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />');         $r->print('<p class="LC_warning">'
                   .&mt('Map contents are not shown in order.')
                   .'</p><br />');
     }      }
     my $idx=0;      my $idx=0;
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {      foreach my $entry (&attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($entry)) {
             $idx++;              $idx++;
             if ($successtied) {               if ($successtied) { 
  $r->print('<form name="form'.$idx.'">');   $r->print('<form name="form'.$idx.'">');
             }              }
     my ($title,$url)=split(/\:/,$_);      my ($title,$url)=split(/\:/,$entry);
     $title = &LONCAPA::map::qtescape($title);      $title = &LONCAPA::map::qtescape($title);
     unless ($title) { $title=(split(/\//,$url))[-1] };      unless ($title) { $title=(split(/\//,$url))[-1] };
             my $enc_title = &HTML::Entities::encode($title,'\'"<>&');              my $enc_title = &HTML::Entities::encode($title,'\'"<>&');
Line 147  ENDSELECT Line 156  ENDSELECT
  if ($successtied) {   if ($successtied) {
     my $checked='';      my $checked='';
            if ($selhash{'store_'.$url}) {             if ($selhash{'store_'.$url}) {
             $checked=" checked";              $checked=' checked="checked"';
            }             }
            $selhash{"pre_${idx}_link"}=$url;             $selhash{"pre_${idx}_link"}=$url;
            $selhash{"pre_${idx}_title"}=$title;             $selhash{"pre_${idx}_title"}=$title;
Line 166  ENDCHECKBOX Line 175  ENDCHECKBOX
             if ($successtied) {              if ($successtied) {
  $r->print('</form>');   $r->print('</form>');
             } else {              } else {
  $r->print('<br>');   $r->print('<br />');
             }              }
         }          }
     }      }
Line 178  ENDCHECKBOX Line 187  ENDCHECKBOX
   
 # ----------------------------------------------------------- Clean out selhash  # ----------------------------------------------------------- Clean out selhash
 sub start_fresh_session {  sub start_fresh_session {
     foreach (keys %selhash) {      foreach my $item (keys(%selhash)) {
  if ($_ =~ /^pre_/) {   if ($item =~ /^pre_/) {
     delete $selhash{$_};      delete $selhash{$item};
  }   }
  if ($_ =~ /^store/) {   if ($item =~ /^store/) {
     delete $selhash{$_};      delete $selhash{$item};
  }   }
     }      }
 }  }
Line 199  sub handler { Line 208  sub handler {
       $r->send_http_header;        $r->send_http_header;
       return OK;        return OK;
    }     }
    
      my $requrl=$r->uri;
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                           ['forceselect','launch']);                                            ['forceselect','launch','navmap']);
   
      if (($env{'request.course.fn'}) && ($env{'form.navmap'}) && ($env{'request.course.id'})) {
          my $crstype = &Apache::loncommon::course_type();
          unless (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
   
              # Check for critical messages and redirect if present.
              my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'contents');
              if ($redirect) {
                  &Apache::loncommon::content_type($r,'text/html');
                  $r->header_out(Location => $url);
                  return REDIRECT;
              }
   
              # Check if course needs to be re-initialized
              my $loncaparev = $r->dir_config('lonVersion');
              my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
   
              if ($result 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') {
                  my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                  my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                  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;
                  }
              }
   
              &Apache::loncommon::content_type($r,'text/html');
              $r->send_http_header;
   
              my $mapurl = &Apache::lonnet::declutter($requrl);
              my $maptitle = &Apache::lonnet::gettitle($mapurl);
              my @crumbs = ({text => $maptitle, no_mt => 1});
              my $args = {'bread_crumbs' => \@crumbs,
                          'bread_crumbs_nomenu' => 1};
   
              # Create the nav map
              my $navmap = Apache::lonnavmaps::navmap->new();
   
              if (ref($navmap)) {
                  # renderer call
                  if (&Apache::lonnet::is_on_map($requrl)) {
                      my ($ltiscope,$ltiuri);
                      if (($env{'request.lti.login'}) && ($env{'request.lti.uri'})) {
                          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                          ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum);
                      }
                      @crumbs = ();
                      unless ($ltiscope eq 'resource') {
                          unless ($ltiscope eq 'map') {
                              @crumbs = ({text  => $crstype.' Contents',
                                          href  => "javascript:gopost('/adm/navmaps','')"});
                          }
                          my $res = $navmap->getResourceByUrl($mapurl);
                          if (ref($res)) {
                              my $symb = $res->symb();
                              if ($symb) {
                                  my ($parent) = &Apache::lonnet::decode_symb($res->symb());
                                  if (($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) &&
                                      !(($ltiscope eq 'map') && ($requrl eq $ltiuri))) {
                                      my @mapcrumbs = $navmap->recursed_crumbs($parent);
                                      if (@mapcrumbs) {
                                          push(@crumbs,@mapcrumbs);
                                      }
                                  }
                                  $env{'request.symb'} = $symb;
                              }
                          }
                      }
                      push(@crumbs,{text => $maptitle, no_mt => 1});
                      $args = {'bread_crumbs' => \@crumbs,
                               'bread_crumbs_nomenu' => 1};
                      $r->print(&Apache::loncommon::start_page($maptitle,undef,$args));
   
                      my $renderArgs = { 'cols'                    => [0,1,2,3],
                                         'url'                     => $mapurl,
                                         'navmap'                  => $navmap,
                                         'suppressNavmap'          => 1,
                                         'suppressEmptySequences'  => 1,
                                         'filterFunc'              => undef,
                                         'resource_no_folder_link' => 1,
                                         'r'                       => $r,
                                         'caller'                  => 'sequence',
                                         'notools'                 => 1,
                                         'iterator_map'            => $mapurl,
                                       };
   
                      my $render = &Apache::lonnavmaps::render($renderArgs);
   
                      # If no resources were found let the user know.
                      if ($renderArgs->{'counter'} == 0) {
                          $r->print('<p class="LC_info">'.
                                    &mt('No items found in folder').
                                    '</p>');
                      }
                      $r->print(&Apache::loncommon::end_page());
                  } else {
                      $r->print(&Apache::loncommon::start_page($maptitle,undef,$args).
                                '<p class="LC_info">'.
                                &mt('Folder no longer appears to be a part of the course').
                                '</p>'.
                                &Apache::loncommon::end_page());
                  }
              } else {
                  $r->print(&Apache::loncommon::start_page($maptitle,undef,$args).
                            '<p class="LC_warning">'.
                            &mt('Error: could not determine contents of folder').
                            '</p>'.
                            &Apache::loncommon::end_page());
              }
              $r->rflush();
              return OK;
          }
      }
   
    my %hash;     my %hash;
    my %bighash;     my %bighash;
    my $requrl=$r->uri;  
   
    $successtied=0;     $successtied=0;
 # ------------------------------------------------------------ Tie symb db file  # ------------------------------------------------------------ Tie symb db file
Line 213  sub handler { Line 344  sub handler {
   my $dismapid='';    my $dismapid='';
   my $exitdisid = '';    my $exitdisid = '';
   my $arrow_dir = '';    my $arrow_dir = '';
     my $is_encrypted = '';
   
   if (($env{'request.course.fn'}) && (!$env{'form.forceselect'})) {    if (($env{'request.course.fn'}) && (!$env{'form.forceselect'})) {
        my $last;         my $last;
Line 243  sub handler { Line 375  sub handler {
        if (!$env{'request.role.adv'}) {         if (!$env{'request.role.adv'}) {
    $randomout = $bighash{'randomout_'.$disid};     $randomout = $bighash{'randomout_'.$disid};
        }         }
                  if (!$env{'request.role.adv'}) {
                      $is_encrypted = $bighash{'encrypted_'.$disid};
                  }
            } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',             } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                     &GDBM_READER(),0640)) {                      &GDBM_READER(),0640)) {
                $last=$hash{'last_known'};                 $last=$hash{'last_known'};
Line 262  sub handler { Line 397  sub handler {
    if (!$env{'request.role.adv'}) {     if (!$env{'request.role.adv'}) {
        $randomout = $bighash{'randomout_'.$disid};         $randomout = $bighash{'randomout_'.$disid};
    }     }
                      if (!$env{'request.role.adv'}) {
                          $is_encrypted = $bighash{'encrypted_'.$disid};
                      }
                }                 }
     }      }
            $exitdisid = $disid;             $exitdisid = $disid;
Line 275  sub handler { Line 413  sub handler {
 # 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 => [$disurl,$dismapid],        my $showdisurl = $disurl;
  'last_known' => [$disurl,$dismapid]);         if ($is_encrypted) {
             $showdisurl = &Apache::lonenc::encrypted($disurl);
         }
         if ($disurl =~ m{/adm/navmaps(\?|$)}) {
             &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid]);
         } else {
             &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid],
                                       'last_known' => [$disurl,$dismapid]);
         }
       &Apache::loncommon::content_type($r,'text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->header_out(Location => &Apache::lonnet::absolute_url($ENV{'SERVER_NAME'}).        $r->header_out(Location => &Apache::lonnet::absolute_url($ENV{'SERVER_NAME'}).
                                  $disurl);                                   $showdisurl);
       return REDIRECT;        return REDIRECT;
    } else {     } else {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        if ($exitdisid eq '' && $arrow_dir ne '') {         if ($exitdisid eq '' && $arrow_dir ne '') {
            my %lt =&Apache::lonlocal::texthash(             my %lt =&Apache::lonlocal::texthash(
                    'back' => 'beginning',  
                    'forward' => 'end',  
                    'nere' => 'Next resource could not be displayed',                     'nere' => 'Next resource could not be displayed',
                    'goba' => 'Go Back',                     'goba' => 'Go Back',
                    'nacc' => 'Navigate Course Content',                     'nacc' => 'Course Contents',
                           );                            );
            my $warnmsg = &mt('As all folders and sequences ');             if (&Apache::loncommon::course_type() eq 'Community') {
                  $lt{'nav'} = &mt('Community Contents');
              }
              my $warnmsg;
            if ($arrow_dir eq 'forward') {             if ($arrow_dir eq 'forward') {
                $warnmsg .= &mt('following the current resource were empty').',';                 $warnmsg = &mt('As all folders and sequences '
                                .'following the current resource were empty, '
                                .'you have now reached the end of the course.');
            } elsif ($arrow_dir eq 'back') {             } elsif ($arrow_dir eq 'back') {
                $warnmsg .= &mt('preceding the current resource were empty').',';                 $warnmsg = &mt('As all folders and sequences '
                                .'preceding the current resource were empty, '
                                .'you have now reached the beginning of the course.');
            }             }
            $warnmsg .= &mt('you have now reached the').' '.$lt{$arrow_dir}.' '.&mt('of the course.');  
            my $start_page=             my $start_page=
        &Apache::loncommon::start_page('Empty Folder/Sequence');         &Apache::loncommon::start_page('Empty Folder/Sequence');
            my $end_page=             my $end_page=
Line 323  ENDNONE Line 473  ENDNONE
 1;  1;
 __END__  __END__
   
   =head1 NAME
   
   Apache::lonsequence
   
   =head1 SYNOPSIS
   
   Handler for showing sequence objects of
   educational resources.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 SUBROUTINES
   
   =over
   
   =item handler()
   
   =item viewmap()
   
   =item attemptread()
   
   =item mapread()
   
   =item start_fresh_session()
   
   =back
   
   =cut
   
   
   

Removed from v.1.32.2.1  
changed lines
  Added in v.1.52


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