Diff for /loncom/interface/statistics/lonstathelpers.pm between versions 1.56 and 1.76.2.1

version 1.56, 2008/10/30 17:45:25 version 1.76.2.1, 2020/08/26 21:50:16
Line 90  sub render_resource { Line 90  sub render_resource {
     my $rendered_problem = &Apache::lonnet::ssi_body($src.'?symb='.$symb);      my $rendered_problem = &Apache::lonnet::ssi_body($src.'?symb='.$symb);
     $rendered_problem =~ s/<\s*form\s*/<nop /g;      $rendered_problem =~ s/<\s*form\s*/<nop /g;
     $rendered_problem =~ s|(<\s*/form\s*>)|<\/nop>|g;      $rendered_problem =~ s|(<\s*/form\s*>)|<\/nop>|g;
     return '<table bgcolor="ffffff"><tr><td>'.      return '<div class="LC_Box">'.
         '<base href="'.$base.'" />'.          '<h4 class="LC_hcell">'.&mt('Problem').'</h4>'.
         $rendered_problem.          '<base href="'.$base.'" />'.$rendered_problem.
         '</td></tr></table>';          '</div>';
 }  }
   
 ####################################################  ####################################################
Line 135  Skips 'survey' problems. Line 135  Skips 'survey' problems.
 ####################################################  ####################################################
 ####################################################  ####################################################
 sub problem_selector {  sub problem_selector {
     my ($AcceptedResponseTypes,$sequence_addendum) = @_;      my ($AcceptedResponseTypes,$sequence_addendum,$symbmode,$all,$prefix,
           $byres,$include_tools,$smallbox,$onclick) = @_;
   # all: also make sequences selectable
   # prefix: prefix for all form names
   # byres: radiobutton shown per resource
   # include_tools: external tools included 
   # smallbox: use smaller box
   # onclick: javascript to execute when clicked
     my $Str;      my $Str;
     $Str = "\n<table>\n";      my $jsadd='';
       if ($onclick) {
           $jsadd="onclick='$onclick'";
       }
       $Str =  &Apache::loncommon::start_scrollbox(($smallbox?'420px':'620px'),
                                                   ($smallbox?'400px':'600px'),
                                                   ($smallbox?'60px':'300px')).
               &Apache::loncommon::start_data_table();
     my $rb_count =0;      my $rb_count =0;
     my ($navmap,@sequences) =       my ($navmap,@sequences) = 
         &Apache::lonstatistics::selected_sequences_with_assessments('all');          &Apache::lonstatistics::selected_sequences_with_assessments('all');
Line 145  sub problem_selector { Line 159  sub problem_selector {
     foreach my $seq (@sequences) {      foreach my $seq (@sequences) {
         my $seq_str = '';          my $seq_str = '';
         foreach my $res (&get_resources($navmap,$seq)) {          foreach my $res (&get_resources($navmap,$seq)) {
               my $title = $res->compTitle;
               if (! defined($title) || $title eq '') {
                   ($title) = ($res->src =~ m:/([^/]*)$:);
               }
               my $totalresps = 0;
               if ($byres) {
                   foreach my $part (@{$res->parts}) {
                       $totalresps += scalar($res->responseIds($part));
                   }
                   my $value = &HTML::Entities::encode($res->symb(),'<>&"');
                   my $checked;
                   if ($env{'form.problemchoice'} eq $res->symb()) {
                       $checked = ' checked="checked"';
                   }
                   $seq_str .= &Apache::loncommon::start_data_table_row().
                               '<td rowspan="'.$totalresps.'" style="vertical-align:middle">'.
                               '<label><input type="radio" name="symb" value="'.$value.'"'.$checked.' />'.
                               $title.'</label>';
                   my $link = $res->link.'?symb='.&escape($res->shown_symb);
                   $seq_str .= ('&nbsp;'x2).
                               '<a target="preview" href="'.$link.'">'.&mt('view').'</a></td>';
               }
               my %partsseen;
             foreach my $part (@{$res->parts}) {              foreach my $part (@{$res->parts}) {
                 my @response_ids   = $res->responseIds($part);                  my @response_ids   = $res->responseIds($part);
                 my @response_types = $res->responseType($part);                  my @response_types = $res->responseType($part);
Line 152  sub problem_selector { Line 189  sub problem_selector {
                     my $respid = $response_ids[$i];                      my $respid = $response_ids[$i];
                     my $resptype = $response_types[$i];                      my $resptype = $response_types[$i];
                     if ($resptype =~ m/$AcceptedResponseTypes/) {                      if ($resptype =~ m/$AcceptedResponseTypes/) {
                         my $value = &make_target_id({symb=>$res->symb,                          if ($byres) {
                                                      part=>$part,                              unless (exists($partsseen{$part})) {
                                                      respid=>$respid,                                  my $parttitle = $part;
                                                      resptype=>$resptype});                                  if ($part eq '0') {
                         my $checked = '';                                      $parttitle = '';
                         if ($env{'form.problemchoice'} eq $value) {                                  }
                             $checked = 'checked="checked" ';                                  if ($parttitle ne '') {
                         }                                      $parttitle = ('&nbsp;'x2).&mt('part').':&nbsp;'.$parttitle;
                         my $title = $res->compTitle;                                  }
                         if (! defined($title) || $title eq '') {                                  if (keys(%partsseen)) {
                             ($title) = ($res->src =~ m:/([^/]*)$:);                                      $seq_str .= &Apache::loncommon::continue_data_table_row();
                                   }
                                   unless ($partsseen{$part}) {
                                       $seq_str .= '<td rowspan="'.scalar(@response_ids).'" style="vertical-align:middle">'.
                                                   $parttitle.'</td>';
                                       $partsseen{$part} = scalar(@response_ids);
                                   }
                               }
                               $seq_str .= '<td>'.$resptype;
                               if (scalar(@response_ids) > 1) {
                                   $seq_str .= '&nbsp;'.&mt('id').':&nbsp;'.$respid;
                               }
                               $seq_str .= '</td>'. &Apache::loncommon::end_data_table_row()."\n";
                           } else {
                               my $value = &make_target_id({symb=>$res->symb,
                                                            part=>$part,
                                                            respid=>$respid,
                                                            resptype=>$resptype});
                               my $checked = '';
                               if ($env{'form.problemchoice'} eq $value) {
                                   $checked = ' checked="checked"';
                               }
                               $seq_str .= &Apache::loncommon::start_data_table_row().
                                   ($symbmode?
                                    '<td><input type="radio" id="'.$prefix.$rb_count.'" name="'.$prefix.'symb" value="'.&HTML::Entities::encode($res->symb,'<>&"').'" '.$checked.' '.
                                    $jsadd.
                                    ' /></td>'
                                    :qq{<td><input type="radio" id="$rb_count" name="problemchoice" value="$value"$checked /></td>}).
                                   '<td><label for="'.$prefix.$rb_count.'">'.$resptype.'</label></td>'.
                                   '<td><label for="'.$prefix.$rb_count.'">'.$title.'</label>';
                               if (scalar(@response_ids) > 1) {
                                   $seq_str .= &mt('response').' '.$respid;
                               }
                               my $link = $res->link.'?symb='.&escape($res->shown_symb);
                               $seq_str .= ('&nbsp;'x2).
                                           '<a target="preview" href="'.$link.'">'.&mt('view').'</a>';
                               $seq_str .= "</td>". &Apache::loncommon::end_data_table_row()."\n";
                               $rb_count++;
                         }                          }
                         $seq_str .= '<tr>'.  
                             qq{<td><input type="radio" id="$rb_count" name="problemchoice" value="$value" $checked /></td>}.  
                             '<td><label for="'.$rb_count.'">'.$resptype.'</label></td>'.  
                             '<td><label for="'.$rb_count.'">'.$title.'</label>';  
                         if (scalar(@response_ids) > 1) {  
                             $seq_str .= &mt('response').' '.$respid;  
                         }  
                         my $link = $res->link.'?symb='.&escape($res->shown_symb);  
                         $seq_str .= ('&nbsp;'x2).  
                             '<a target="preview" href="'.$link.'">'.&mt('view').'</a>';  
                         $seq_str .= "</td></tr>\n";  
                         $rb_count++;  
                     }                      }
                 }                  }
             }              }
         }          }
         if ($seq_str ne '') {          if ($seq_str ne '') {
             $Str .= '<tr><td>&nbsp</td>'.              if ($byres) {
                 '<td colspan="2"><b>'.$seq->compTitle.'</b></td>'.                  $Str .= &Apache::loncommon::start_data_table_header_row().
                 "</tr>\n".$seq_str;                          '<th colspan="3">'.$seq->compTitle.'</th>'.
             if (defined($sequence_addendum)) {                          &Apache::loncommon::end_data_table_header_row().
                 $Str .= '<tr>'.                          $seq_str;
                     ('<td>&nbsp</td>'x2).              } else {
                     '<td align="right">'.$sequence_addendum.'</td>'.                  $Str .= &Apache::loncommon::start_data_table_header_row().
                     "</tr>\n";                      '<th colspan="3">'.
                       ($all?'<input type="radio" id="'.$prefix.'s'.$rb_count.'" name="'.$prefix.'symb" value="'.&HTML::Entities::encode($seq->symb,'<>&').'" '.$jsadd.' />':'').
                       $seq->compTitle.'</th>'.
                       &Apache::loncommon::end_data_table_header_row()."\n".$seq_str;
                   if (defined($sequence_addendum)) {
                       $Str .= &Apache::loncommon::start_data_table_header_row().
                           ('<td>&nbsp;</td>'x2).
                           '<td align="right">'.$sequence_addendum.'</td>'.
                           &Apache::loncommon::end_data_table_header_row()."\n";
                   }
             }              }
         }          }
     }      }
     $Str .= "</table>\n";      $Str .= &Apache::loncommon::end_data_table().&Apache::loncommon::end_scrollbox()."\n";
     return $Str;      return $Str;
 }  }
   
Line 222  and their contents.  A checkbox is provi Line 293  and their contents.  A checkbox is provi
 ####################################################  ####################################################
 ####################################################  ####################################################
 sub MultipleProblemSelector {  sub MultipleProblemSelector {
     my ($navmap,$inputname,$formname)=@_;      my ($navmap,$inputname,$formname,$anoncounter)=@_;
     my $cid = $env{'request.course.id'};      my $cid = $env{'request.course.id'};
     my $Str;      my $Str;
     # Massage the input as needed.      # Massage the input as needed.
Line 238  sub MultipleProblemSelector { Line 309  sub MultipleProblemSelector {
     my $selected = {map { ($_,1) } (&get_selected_symbs($inputname))};      my $selected = {map { ($_,1) } (&get_selected_symbs($inputname))};
     # Header      # Header
     $Str .= <<"END";      $Str .= <<"END";
 <script language="JavaScript" type="text/javascript">  <script type="text/javascript" language="JavaScript">
     function checkall(value,seqid) {      function checkall(value,seqid) {
         for (i=0; i<document.forms.$formname.elements.length; i++) {          for (i=0; i<document.forms.$formname.elements.length; i++) {
             ele = document.forms.$formname.elements[i];              ele = document.forms.$formname.elements[i];
Line 257  sub MultipleProblemSelector { Line 328  sub MultipleProblemSelector {
     }      }
 </script>  </script>
 END  END
     $Str .=       my $checkanonjs = <<"END";
    
   <script type="text/javascript" language="JavaScript">
       function checkanon() {
           return true;
       }
   </script>
   
   END
       if (ref($anoncounter) eq 'HASH') {
           if (keys(%{$anoncounter}) > 0) {
               my $anonwarning = &mt('Your selection includes both problems with and without anonymous submissions.')."\n".&mt('You must select either only anonymous or only named problems.')."\n\n".&mt('If a selection contains both anonymous and named parts,[_1]use the Anonymous/Named buttons to ensure selections will be either all anonymous[_1]or all named.',"\n");
               &js_escape(\$anonwarning);
               $checkanonjs = <<"END";
   
   <script type="text/javascript" language="JavaScript">
       function checkanon() {
           anoncount = 0;
           namedcount = 0;
           for (i=0; i<document.forms.$formname.elements.length; i++) {
               ele = document.forms.$formname.elements[i];
               if (ele.name == '$inputname') {
                   itemid = document.forms.$formname.elements[i].id;
                   if (document.forms.$formname.elements[i].checked) {
                       anonid = 'anonymous_'+itemid;
                       mixid = 'mixed_'+itemid;
                       anonele = document.getElementById(anonid);
                       mixele = document.getElementById(mixid);
                       if (anonele.value > 0) {
                           if (mixele.value == 'none') {
                               anoncount ++;
                           } else {
                               if (mixele.value == '0') {
                                   if (mixele.checked) {
                                       anoncount ++; 
                                   } else {
                                       namedcount ++;
                                   } 
                               } else {
                                   namedcount ++;
                               }
                           }
                       } else {
                           namedcount ++;
                       }
                   }
               }
           }
           if (anoncount > 0 && namedcount > 0) {
               alert("$anonwarning");
               return false;
           } 
       }
   </script>
   
   END
           }
       }
       $Str .= $checkanonjs.
         '<a href="javascript:checkall(true)">'.&mt('Select All').'</a>'.          '<a href="javascript:checkall(true)">'.&mt('Select All').'</a>'.
         ('&nbsp;'x4).          ('&nbsp;'x4).
         '<a href="javascript:checkall(false)">'.&mt('Unselect All').'</a>';          '<a href="javascript:checkall(false)">'.&mt('Unselect All').'</a>';
Line 288  END Line 417  END
                                                $seq_id++,                                                 $seq_id++,
                                                $inputname));                                                 $inputname));
         } elsif ($curRes->is_problem) {          } elsif ($curRes->is_problem) {
               my $anonpart = 0;
               my $namedpart = 0;
               my @parts = @{$curRes->parts()};
               if (ref($anoncounter) eq 'HASH') {
                   if (keys(%{$anoncounter}) > 0) {
                       my @parts = @{$curRes->parts()};
                       my $symb = $curRes->symb();
                       foreach my $part (@parts) {
                           if ((exists($anoncounter->{$symb."\0".$part})) ||
                               $curRes->is_anonsurvey($part)) {
                               $anonpart ++;
                           } else {
                               $namedpart ++ 
                           }
                       }
                   }
               }
             if (@Accumulator && $Accumulator[-1] ne '') {              if (@Accumulator && $Accumulator[-1] ne '') {
                 &{$Accumulator[-1]}($curRes,                  &{$Accumulator[-1]}($curRes,
                                     exists($selected->{$curRes->symb}));                                      exists($selected->{$curRes->symb}),
                                       $anonpart,$namedpart);
             }              }
         }          }
     }      }
Line 318  sub new_accumulator { Line 465  sub new_accumulator {
     return       return 
         sub {          sub {
             if (@_) {               if (@_) { 
                 my ($res,$checked) = @_;                  my ($res,$checked,$anonpart,$namedpart) = @_;
                 $target.='<tr><td><label>'.                  $target.='<tr><td><label>'.
                     '<input type="checkbox" name="'.$inputname.'" ';                      '<input type="checkbox" name="'.$inputname.'" ';
                 if ($checked) {                  if ($checked) {
                     $target .= 'checked="checked" ';                      $target .= 'checked="checked" ';
                 }                  }
                   my $anon_id = $item_id;
                 $target .= 'id="'.$seq_id.':'.$item_id++.'" ';                  $target .= 'id="'.$seq_id.':'.$item_id++.'" ';
                   my $esc_symb = &escape($res->symb);
                 $target.=                   $target.= 
                     'value="'.&escape($res->symb).'" />'.                      'value="'.$esc_symb.'" />'.
                     '&nbsp;'.$res->compTitle.'</label>'.                      '&nbsp;'.$res->compTitle.'</label>'.
                     ('&nbsp;'x2).'<a target="preview" '.                      ('&nbsp;'x2).'<a target="preview" '.
                     'href="'.$res->link.'?symb='.                      'href="'.$res->link.'?symb='.
                     &escape($res->shown_symb).'">'.&mt('view').'</a>'.                      &escape($res->shown_symb).'">'.&mt('view').'</a>'.
                     '</td></tr>'.$/;                      '<input type="hidden" id="anonymous_'.$seq_id.':'.$anon_id.'" name="hidden_'.$seq_id.':'.$anon_id.'" value="'.$anonpart.'" />';
                   my $mixed = '<input type="hidden" id="mixed_'.$seq_id.':'.$anon_id.'" value="none" name="mixed_'.$seq_id.':'.$anon_id.'" />';
                   if ($anonpart) {
                       if ($namedpart) {
                           my $checknamed = '';
                           my $checkedanon = ' checked="checked"';
                           if ($env{'form.mixed_'.$seq_id.':'.$anon_id} eq $esc_symb) {
                               $checknamed = $checkedanon;
                               $checkedanon = '';
                           }
                           $mixed = '&nbsp;('.
       &mt('Both anonymous and named submissions -- display: [_1]Anonymous [_2]Named[_3]',
       '<span class="LC_nobreak"><label>'.
       '<input type="radio" name="mixed_'.$seq_id.':'.$anon_id.
       '" value="0" id="mixed_'.$seq_id.':'.$anon_id.'"'.$checkedanon.' />',
       '</label></span>'.('&nbsp;'x2).' <span class="LC_nobreak">'.
       '<label><input type="radio" name="mixed_'.$seq_id.':'.$anon_id.
       '" value="symb_'.$esc_symb.'" id="named_'.$seq_id.':'.$anon_id.'"'.$checknamed.' />',
       '</label></span>').')';
                       } else {
                           $target .= '&nbsp;'.&mt('(Anonymous Survey)');
                       }
                   }
                   $target.= $mixed.'</td></tr>'.$/;
             } else {               } else { 
                 if (defined($target)) {                  if (defined($target)) {
                     return { title => $title,                      return { title => $title,
Line 464  sub get_prev_curr_next { Line 636  sub get_prev_curr_next {
         my @resources = &get_resources($navmap,$seq);          my @resources = &get_resources($navmap,$seq);
         foreach my $res (@resources) {          foreach my $res (@resources) {
             foreach my $part (@{$res->parts}) {              foreach my $part (@{$res->parts}) {
                 if ($res->is_survey($part) && ($granularity eq 'part_survey')){                  if (($res->is_survey($part) || ($res->is_anonsurvey($part))) && 
                       ($granularity eq 'part_survey')) {
                     push (@Resource,                      push (@Resource,
                           { symb     => $res->symb,                            { symb     => $res->symb,
                             part     => $part,                              part     => $part,
Line 597  sub GetStudentAnswers { Line 770  sub GetStudentAnswers {
     # Read in the cache (if it exists) before we start timing things.      # Read in the cache (if it exists) before we start timing things.
     &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});      &Apache::lonstathelpers::ensure_proper_cache($resource->{'symb'});
     # Open progress window      # Open progress window
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$Students));
         ($r,'Student Answer Compilation Status',  
          'Student Answer Compilation Progress', scalar(@$Students),  
          $status_type,undef,$formname,$inputname);  
     $r->rflush();      $r->rflush();
     foreach my $student (@$Students) {      foreach my $student (@$Students) {
         last if ($c->aborted());          last if ($c->aborted());
Line 609  sub GetStudentAnswers { Line 779  sub GetStudentAnswers {
         my $answer = &Apache::lonstathelpers::get_student_answer          my $answer = &Apache::lonstathelpers::get_student_answer
             ($resource,$sname,$sdom,$partid,$respid);              ($resource,$sname,$sdom,$partid,$respid);
         &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,          &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
                                                  &mt('last student'));                                                       'last student');
         $answers{$answer}++;          $answers{$answer}++;
         $student->{'answer'} = $answer;          $student->{'answer'} = $answer;
     }      }
Line 885  prior to every analysis lookup. Line 1055  prior to every analysis lookup.
 sub ensure_proper_cache {  sub ensure_proper_cache {
     my ($symb) = @_;      my ($symb) = @_;
     my $cid = $env{'request.course.id'};      my $cid = $env{'request.course.id'};
     my $new_filename =  '/home/httpd/perl/tmp/'.      my $new_filename = LONCAPA::tempdir() .
         'problemanalysis_'.$cid.'_analysis_cache.db';          'problemanalysis_'.$cid.'_analysis_cache.db';
     if (! defined($cache_filename) ||      if (! defined($cache_filename) ||
         $cache_filename ne $new_filename ||          $cache_filename ne $new_filename ||
Line 1255  sub limit_by_time_form { Line 1425  sub limit_by_time_form {
     my $enddateform = &Apache::lonhtmlcommon::date_setter      my $enddateform = &Apache::lonhtmlcommon::date_setter
         ('Statistics','limitby_enddate',$endtime,undef,undef,$state);          ('Statistics','limitby_enddate',$endtime,undef,undef,$state);
     my $Str;      my $Str;
     $Str .= '<script language="Javascript" >';      $Str .= '<script type="text/javascript" language="JavaScript">';
     $Str .= 'function toggle_limitby_activity(state) {';      $Str .= 'function toggle_limitby_activity(state) {';
     $Str .= '    if (state) {';      $Str .= '    if (state) {';
     $Str .= '        limitby_startdate_enable();';      $Str .= '        limitby_startdate_enable();';
Line 1269  sub limit_by_time_form { Line 1439  sub limit_by_time_form {
     $Str .= '<fieldset>';      $Str .= '<fieldset>';
     my $timecheckbox = '<input type="checkbox" name="limit_by_time" ';      my $timecheckbox = '<input type="checkbox" name="limit_by_time" ';
     if (&limit_by_time()) {      if (&limit_by_time()) {
         $timecheckbox .= ' checked ';          $timecheckbox .= 'checked="checked" ';
     }       } 
     $timecheckbox .= 'OnChange="javascript:toggle_limitby_activity(this.checked);" ';      $timecheckbox .= 'onchange="javascript:toggle_limitby_activity(this.checked);" ';
     $timecheckbox .= ' />';      $timecheckbox .= ' />';
     $Str .= '<legend><label>'.&mt('[_1] Limit by time',$timecheckbox).'</label></legend>';      $Str .= '<legend><label>'.&mt('[_1] Limit by time',$timecheckbox).'</label></legend>';
     $Str .= &mt('Start Time: [_1]',$startdateform).'<br />';      $Str .= &mt('Start Time: [_1]',$startdateform).'<br />';
Line 1373  sub gather_full_student_data { Line 1543  sub gather_full_student_data {
     my @Students = @Apache::lonstatistics::Students;      my @Students = @Apache::lonstatistics::Students;
     #      #
     # Open the progress window      # Open the progress window
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin      my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@Students));
         ($r,&mt('Student Data Compilation Status'),  
          &mt('Student Data Compilation Progress'), scalar(@Students),  
          $status_type,undef,$formname,$inputname);  
     #      #
     while (my $student = shift @Students) {      while (my $student = shift @Students) {
         return if ($c->aborted());          return if ($c->aborted());
Line 1420  sub submission_report_form { Line 1587  sub submission_report_form {
              ' enough input.');               ' enough input.');
     }      }
     my $html = $/.      my $html = $/.
         '<script type="Text/JavaScript">'.          '<script type="text/javascript" language="JavaScript">'.
         "document.Statistics.reportSelected.value='$original_report';".          "document.Statistics.reportSelected.value='$original_report';".
         '</script>'.          '</script>'.
         '<input type="hidden" name="correctans" value="true" />'.          '<input type="hidden" name="correctans" value="true" />'.

Removed from v.1.56  
changed lines
  Added in v.1.76.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.