Diff for /loncom/interface/spreadsheet/studentcalc.pm between versions 1.33 and 1.46

version 1.33, 2005/05/17 17:48:19 version 1.46, 2014/02/12 16:55:36
Line 59  use Apache::assesscalc(); Line 59  use Apache::assesscalc();
 use HTML::Entities();  use HTML::Entities();
 use Time::HiRes;  use Time::HiRes;
 use Apache::lonlocal;  use Apache::lonlocal;
   use LONCAPA;
    
   
 @Apache::studentcalc::ISA = ('Apache::Spreadsheet');  @Apache::studentcalc::ISA = ('Apache::Spreadsheet');
   
Line 98  sub initialize_sequence_cache { Line 100  sub initialize_sequence_cache {
     }      }
     my @all_sequences = $navmap->retrieveResources(undef,      my @all_sequences = $navmap->retrieveResources(undef,
                                                sub { shift->is_map(); },1,0,1);                                                 sub { shift->is_map(); },1,0,1);
     for my $sequence ($navmap->getById('0.0'), @all_sequences) {      my $toplevelseq = $navmap->getById('0.0');
  if ($navmap->hasResource($sequence,sub { shift->is_problem(); }, 0)){      if (!grep(/^\Q$toplevelseq\E$/,@all_sequences)) {
             push(@Sequences,$sequence);           unshift(@all_sequences,$toplevelseq);
     &get_resources($sequence);      }
         }      foreach my $sequence (@all_sequences) {
          if ($navmap->hasResource($sequence,sub { shift->is_problem(); }, 0,1)){
              push(@Sequences,$sequence);
              &get_resources($sequence);
          }
     }      }
 }  }
   
Line 115  sub get_resources { Line 121  sub get_resources {
     return () if (! defined($navmap) || ! ref($navmap));      return () if (! defined($navmap) || ! ref($navmap));
     my @resources = $navmap->retrieveResources($seq,      my @resources = $navmap->retrieveResources($seq,
                                                sub { shift->is_problem(); },                                                 sub { shift->is_problem(); },
                                                0,0,0);                                                 0,0,1);
     $res_memoize{$seq->symb()}=\@resources;      $res_memoize{$seq->symb()}=\@resources;
     return @resources;      return @resources;
 }  }
Line 221  END Line 227  END
     }      }
     $tableheader .="</tr>\n";      $tableheader .="</tr>\n";
     if ($self->blackout()) {      if ($self->blackout()) {
         $r->print('<font color="red" size="+2"><p>'.          $r->print('<p class="LC_warning">'.
                   &mt('Some computations are not available at this time.').'<br />'.                    &mt('Some computations are not available at this time.').'<br />'.
                   &mt('There are problems whose status you are not allowed to view.').                    &mt('There are problems whose status you are not allowed to view.').
                   '</font></p>'."\n");                    '</p>'."\n");
     } else {      } else {
         $r->print($tableheader);          $r->print($tableheader);
         #          #
         # Print out template row          # Print out template row
         if (exists($env{'request.role.adv'}) && $env{'request.role.adv'}) {          if (exists($env{'request.role.adv'}) && $env{'request.role.adv'}) {
             $r->print('<tr><td>Template</td><td>&nbsp;</td>'.              $r->print('<tr><td>'.&mt('Template').'</td><td>&nbsp;</td>'.
                       $self->html_template_row($num_uneditable,                        $self->html_template_row($num_uneditable,
                                                $importcolor)."</tr>\n");                                                 $importcolor)."</tr>\n");
         }          }
Line 271  END Line 277  END
     }      }
     foreach my $Sequence (@Sequences) {      foreach my $Sequence (@Sequences) {
  $r->print("<h3>".$Sequence->compTitle."</h3>\n");   $r->print("<h3>".$Sequence->compTitle."</h3>\n");
   
           my @resources = &get_resources($Sequence);
           my $first_rownum =
               $self->get_row_number_from_key($resources[0]->symb);
           my $last_rownum = 
               $self->get_row_number_from_key($resources[-1]->symb);
           $r->print(&assess_file_selector([$first_rownum, $last_rownum],
                                           undef, \@AssessFileNames));
   
   $r->print($tableheader);    $r->print($tableheader);
  foreach my $resource (&get_resources($Sequence)) {   foreach my $resource (@resources) {
     my $rownum = $self->get_row_number_from_key($resource->symb);      my $rownum = $self->get_row_number_from_key($resource->symb);
             my $assess_filename = $self->{'row_source'}->{$rownum};              my $assess_filename = $self->{'row_source'}->{$rownum};
             my $row_output = '<tr>';              my $row_output = '<tr>';
Line 283  END Line 298  END
                     '<a href="/adm/assesscalc?sname='.$self->{'name'}.                      '<a href="/adm/assesscalc?sname='.$self->{'name'}.
                     '&sdomain='.$self->{'domain'}.                      '&sdomain='.$self->{'domain'}.
                     '&filename='.$assess_filename.                      '&filename='.$assess_filename.
                     '&usymb='.&Apache::lonnet::escape($resource->symb).                      '&usymb='.&escape($resource->symb).
                     '">'.$resource->compTitle.'</a><br />';                      '">'.$resource->compTitle.'</a><br />';
                 $row_output .= &assess_file_selector($rownum,                  $row_output .= &assess_file_selector($rownum,
                                                      $assess_filename,                                                       $assess_filename,
Line 291  END Line 306  END
                                                          '</td>';                                                           '</td>';
             } else {              } else {
                 $row_output .= '<td><a href="'.$resource->src.'?symb='.                  $row_output .= '<td><a href="'.$resource->src.'?symb='.
                     &Apache::lonnet::escape($resource->symb).                      &escape($resource->symb).
                     '">Go&nbsp;To</a>';                      '"><span class="LC_nobreak">'.&mt('Go To').'</span></a>';
                 $row_output .= '</td><td>'.$resource->compTitle.'</td>';                  $row_output .= '</td><td>'.$resource->compTitle.'</td>';
             }              }
             if ($self->blackout() && $self->{'blackout_rows'}->{$rownum}>0) {              if ($self->blackout() && $self->{'blackout_rows'}->{$rownum}>0) {
Line 328  sub assess_file_selector { Line 343  sub assess_file_selector {
         return '';          return '';
     }      }
     return '' if (! &Apache::lonnet::allowed('mgr',$env{'request.course.id'}));      return '' if (! &Apache::lonnet::allowed('mgr',$env{'request.course.id'}));
     my $element_name = 'FileSelect_'.$row;      my $element_name;
       my $source_row = $row;
       if (ref($row)) {
           my ($first_rownum, $last_rownum) = @$row;
           $element_name = "FileSelect_${first_rownum}_${last_rownum}";
           $source_row = "${first_rownum}:${last_rownum}";
       } else {
           $element_name = 'FileSelect_'.$row;
       }
     my $load_dialog = '<select size="1" name="'.$element_name.'" '.      my $load_dialog = '<select size="1" name="'.$element_name.'" '.
         'onchange="'.          'onchange="'.
         "document.sheet.cell.value='source_$row';".          "document.sheet.cell.value='source_${source_row}';".
         "document.sheet.newformula.value=document.sheet.$element_name\.value;".          "document.sheet.newformula.value=document.sheet.$element_name\.value;".
         'document.sheet.submit()" '.'>'."\n";          'document.sheet.submit()" '.'>'."\n";
       if (ref($row)) {
           $load_dialog .= '    <option name="" value="">' .
               &mt("Select spreadsheet for entire sequence")
               . "</option>\n";
       }
     foreach my $file (@{$AssessFiles}) {      foreach my $file (@{$AssessFiles}) {
         $load_dialog .= '    <option name="'.$file.'"';          $load_dialog .= '    <option name="'.$file.'"';
         $load_dialog .= ' selected' if ($default eq $file);          $load_dialog .= ' selected' if ($default eq $file);
Line 346  sub assess_file_selector { Line 374  sub assess_file_selector {
 sub modify_cell {  sub modify_cell {
     my $self = shift;      my $self = shift;
     my ($cell,$formula) = @_;      my ($cell,$formula) = @_;
     if ($cell =~ /^source_(\d+)$/) {  
         # Need to make sure $formula is a valid filename....      my $set_row = sub {
         my $row = $1;          my $row = shift;
         $cell = 'A'.$row;          my $formula = shift;
           my $cell = 'A' . $row;
         $self->{'row_source'}->{$row} = $formula;          $self->{'row_source'}->{$row} = $formula;
         my $original_source = $self->formula($cell);          my $original_source = $self->formula($cell);
         if ($original_source =~ /__&&&__/) {          if ($original_source =~ /__&&&__/) {
             ($original_source,undef) = split('__&&&__',$original_source);              ($original_source,undef) = split('__&&&__',$original_source);
         }          }
         $formula = $original_source.'__&&&__'.$formula;          $formula = $original_source.'__&&&__'.$formula;
           $self->set_formula($cell,$formula);
       };
   
       if ($cell =~ /^source_(\d+):(\d+)$/) {
           my $first_row = $1;
           my $last_row = $2;
           for my $row ($first_row..$last_row) {
               $set_row->($row, $formula);
           }
       } elsif ($cell =~ /^source_(\d+)$/) {
           # Need to make sure $formula is a valid filename....
           my $row = $1;
           $set_row->($row, $formula);
     } elsif ($cell =~ /([A-z])\-/) {      } elsif ($cell =~ /([A-z])\-/) {
         $cell = 'template_'.$1;          $cell = 'template_'.$1;
           $self->set_formula($cell,$formula);
     } elsif ($cell !~ /^([A-z](\d+)|template_[A-z])$/) {      } elsif ($cell !~ /^([A-z](\d+)|template_[A-z])$/) {
         return;          return;
       } else {
           $self->set_formula($cell,$formula);
     }      }
     $self->set_formula($cell,$formula);  
     $self->rebuild_stats();      $self->rebuild_stats();
     return;      return;
 }  }
Line 458  sub put_sequence_data_in_safe_space { Line 502  sub put_sequence_data_in_safe_space {
         # 1. duplicate titles - they get the total for the titles          # 1. duplicate titles - they get the total for the titles
         # 2. control characters in titles - use q{} around the string to          # 2. control characters in titles - use q{} around the string to
         #    deal with it.            #    deal with it.  
         my $title = &HTML::Entities::decode($seq->{'title'});          my $title = &HTML::Entities::decode($seq->title());
         $title =~ s/&\#058;/:/g;          $title =~ s/&\#058;/:/g;
         if (@Rows) {          if (@Rows) {
             $data .= 'push(@{$Sequence_Rows{"'.quotemeta($title).'"}},'.              $data .= 'push(@{$Sequence_Rows{"'.quotemeta($title).'"}},'.
Line 513  sub compute { Line 557  sub compute {
     }      }
     $self->initialize_safe_space();      $self->initialize_safe_space();
     &Apache::assesscalc::initialize_package($self->{'name'},$self->{'domain'},      &Apache::assesscalc::initialize_package($self->{'name'},$self->{'domain'},
                                             $navmap);                                              $navmap,$self);
     my %f = $self->formulas();      my %f = $self->formulas();
     #      #
     # Process the formulas list -       # Process the formulas list - 
Line 534  sub compute { Line 578  sub compute {
                 $assessSheet = Apache::assesscalc->new($self->{'name'},                  $assessSheet = Apache::assesscalc->new($self->{'name'},
                                                        $self->{'domain'},                                                         $self->{'domain'},
                                                        $assess_filename,                                                         $assess_filename,
                                                        $resource->symb);                                                         $resource->symb,
          $self->{'section'},
                                                          $self->{'groups'});
             my @exportdata = $assessSheet->export_data($r);              my @exportdata = $assessSheet->export_data($r);
             #              #
             if ($assessSheet->badcalc()) {              if ($assessSheet->badcalc()) {
Line 585  sub compute { Line 631  sub compute {
   
 sub set_row_sources {  sub set_row_sources {
     my $self = shift;      my $self = shift;
       $self->check_formulas_loaded();
     while (my ($cell,$value) = each(%{$self->{'formulas'}})) {      while (my ($cell,$value) = each(%{$self->{'formulas'}})) {
         next if ($cell !~ /^A(\d+)$/ || $1 < 1);          next if ($cell !~ /^A(\d+)$/ || $1 < 1);
         my $row = $1;          my $row = $1;
Line 597  sub set_row_sources { Line 644  sub set_row_sources {
   
 sub set_row_numbers {  sub set_row_numbers {
     my $self = shift;      my $self = shift;
       $self->check_formulas_loaded();
     while (my ($cell,$formula) = each(%{$self->{'formulas'}})) {      while (my ($cell,$formula) = each(%{$self->{'formulas'}})) {
         next if ($cell !~ /^A(\d+)/);          next if ($cell !~ /^A(\d+)/);
         my $row = $1;          my $row = $1;

Removed from v.1.33  
changed lines
  Added in v.1.46


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