Diff for /loncom/homework/optionresponse.pm between versions 1.194 and 1.195

version 1.194, 2014/11/27 17:37:09 version 1.195, 2014/11/28 18:23:04
Line 124  sub start_foilgroup { Line 124  sub start_foilgroup {
         sel => 'Select Options',          sel => 'Select Options',
         add => 'Add new Option:',          add => 'Add new Option:',
         del => 'Delete an Option:',          del => 'Delete an Option:',
           maxcheck => 'Enter maximum number students may check (e.g., 3)',
           mincheck => 'Enter minimum number students need to check (e.g., 1)',
     );      );
     $result.= (<<ENDTABLE);      $result.= (<<ENDTABLE);
       <tr><td>$lt{'sel'}</td>        <tr><td>$lt{'sel'}</td>
Line 147  ENDTABLE Line 149  ENDTABLE
        $result.='>'.$option.'</option>';         $result.='>'.$option.'</option>';
     }      }
     $result.='</select></label> ';      $result.='</select></label> ';
       my %checknumtxt = (
                           maxcheck => 'Max. boxes permitted to check',
                           mincheck => 'Min. boxes required to check',
       );
       my (%onclicknum,%checknum);
       foreach my $item ('maxcheck','mincheck') {
           $onclicknum{$item} = 'onclick="'."updateNumber('$item','$Apache::lonxml::curdepth','check','$lt{$item}');".'"';
           $checknum{$item} = &Apache::lonxml::get_param($item,$parstack,$safeeval);
       }
     $result.=&Apache::edit::checked_arg('Checkbox options:','checkboxoptions',      $result.=&Apache::edit::checked_arg('Checkbox options:','checkboxoptions',
                                          [ ['nochoice',"Don't show option list"] ]                                           [ ['nochoice',"Don't show option list"] ]
                                          ,$token).' '.                                           ,$token).' '.
              &Apache::edit::checked_arg('','noprompt',               &Apache::edit::checked_arg('','noprompt',
                                          [ ['nochoice','Omit "Select all that are ... "' ] ]                                           [ ['nochoice','Omit "Select all that are ... "' ] ]
                                          ,$token).'</td>';                                           ,$token);
       foreach my $item ('maxcheck','mincheck') {
           my $currnum = $checknum{$item};
           unless ($currnum =~ /^\d+$/) {
               $currnum = 'nochoice';
           } 
           $result.= ' <span class="LC_nobreak">'.
                     &Apache::edit::checked_arg('',$item,[ [$currnum,$checknumtxt{$item}] ],
                                           $token,$onclicknum{$item},1).' '.
                     '<span id="'.$item.'_numtext_'.$Apache::lonxml::curdepth.'">';
           if ($checknum{$item} ne '') {
               $result .= ':&nbsp;<a href="javascript:updateNumber('."'$item','$Apache::lonxml::curdepth','link','$lt{$item}'".')">'.
                          $checknum{$item}.'</a>';
           }
           $result .= '</span></span>';
       } 
       $result.= '</td>';
     $result.= &Apache::edit::end_row();      $result.= &Apache::edit::end_row();
     $result.= &Apache::edit::start_spanning_row();      $result.= &Apache::edit::start_spanning_row();
     $result.= $insertlist.'<br />';      $result.= $insertlist.'<br />';
Line 177  ENDTABLE Line 204  ENDTABLE
     }      }
     my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval,      my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval,
  'texoptions','checkboxvalue','checkboxoptions',   'texoptions','checkboxvalue','checkboxoptions',
                                                  'noprompt');                                                   'noprompt','maxcheck','mincheck');
       if ($rebuildtag) {
           my $maxcheck = $token->[2]->{'maxcheck'};
           my $mincheck = $token->[2]->{'mincheck'};
           if ($mincheck =~ /D/) {
               $token->[2]->{'mincheck'}='';
           }
           if ($maxcheck =~ /D/) {
               $token->[2]->{'maxcheck'}='';
           }
           if (($mincheck ne '') && ($maxcheck ne '')) {
               if ($mincheck > $maxcheck) {
                   $token->[2]->{'mincheck'}=$maxcheck; 
               }
           }
       }
     if ($optchanged || $rebuildtag ) {      if ($optchanged || $rebuildtag ) {
       $result = "<foilgroup options=\"(";        $result = "<foilgroup options=\"(";
       foreach my $option (@options) {        foreach my $option (@options) {
Line 190  ENDTABLE Line 232  ENDTABLE
       $result .= 'texoptions="'.$token->[2]{'texoptions'}.'" ';        $result .= 'texoptions="'.$token->[2]{'texoptions'}.'" ';
       $result .= 'checkboxoptions="'.$token->[2]{'checkboxoptions'}.'" ';        $result .= 'checkboxoptions="'.$token->[2]{'checkboxoptions'}.'" ';
       $result .= 'checkboxvalue="'.$token->[2]{'checkboxvalue'}.'" ';        $result .= 'checkboxvalue="'.$token->[2]{'checkboxvalue'}.'" ';
       $result .= 'noprompt="'.$token->[2]{'noprompt'}.'"';        $result .= 'noprompt="'.$token->[2]{'noprompt'}.'" ';
         $result .= 'maxcheck="'.$token->[2]{'maxcheck'}.'" ';
         $result .= 'mincheck="'.$token->[2]{'mincheck'}.'"';
       $result .= '>';        $result .= '>';
     } # else nothing changed so just use the default mechanism      } # else nothing changed so just use the default mechanism
   }    }
Line 220  sub end_foilgroup { Line 264  sub end_foilgroup {
      -2,0);       -2,0);
     my $checkboxvalue=&Apache::lonxml::get_param('checkboxvalue',$parstack,$safeeval);      my $checkboxvalue=&Apache::lonxml::get_param('checkboxvalue',$parstack,$safeeval);
     my $checkboxchoices=(&Apache::lonxml::get_param('checkboxoptions',$parstack,$safeeval) ne 'nochoice');      my $checkboxchoices=(&Apache::lonxml::get_param('checkboxoptions',$parstack,$safeeval) ne 'nochoice');
       my $maxcheck=&Apache::lonxml::get_param('maxcheck', $parstack, $safeeval);
       $maxcheck =~ s/\D+//g;
       my $mincheck=&Apache::lonxml::get_param('mincheck', $parstack, $safeeval);
       $mincheck =~ s/\D+//g;
     my $noprompt=&Apache::lonxml::get_param('noprompt', $parstack, $safeeval);      my $noprompt=&Apache::lonxml::get_param('noprompt', $parstack, $safeeval);
   
     if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}      if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
Line 228  sub end_foilgroup { Line 276  sub end_foilgroup {
     my $randomize = &Apache::lonxml::get_param('randomize',$parstack,      my $randomize = &Apache::lonxml::get_param('randomize',$parstack,
        $safeeval,'-2');         $safeeval,'-2');
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
       $result.=&displayfoils($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,$tex_option_switch, $noprompt, @opt);        $result.=&displayfoils($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,$tex_option_switch, $noprompt,$maxcheck,$mincheck, @opt);
       $Apache::lonxml::post_evaluate=0;        $Apache::lonxml::post_evaluate=0;
     } elsif ( $target eq 'answer') {      } elsif ( $target eq 'answer') {
       $result.=&displayanswers($max,$randomize,@opt);        $result.=&displayanswers($max,$randomize,@opt);
Line 250  sub end_foilgroup { Line 298  sub end_foilgroup {
  my $right=0;   my $right=0;
  my $wrong=0;   my $wrong=0;
  my $ignored=0;   my $ignored=0;
           my $checked=0;
         my ($numrows,$bubbles_per_row);          my ($numrows,$bubbles_per_row);
         if ($Apache::lonhomework::scantronmode) {          if ($Apache::lonhomework::scantronmode) {
             my $numitems = scalar(@opt);              my $numitems = scalar(@opt);
Line 259  sub end_foilgroup { Line 308  sub end_foilgroup {
         if ($numrows < 1) {          if ($numrows < 1) {
             $numrows = 1;              $numrows = 1;
         }          }
           my $checkboxopt;
           if ($checkboxvalue) {
               $checkboxopt = &check_box_opt($target,$checkboxvalue,@opt);
               if (($checkboxopt) && ($Apache::lonhomework::type !~ /survey/)) {
                   my $corrnumcheck = 0;
                   if (($maxcheck ne '') || ($mincheck ne '')) {
                       foreach $name (@whichopt) {
                           if ($Apache::response::foilgroup{$name.'.value'} eq $checkboxopt) {
                               $corrnumcheck ++; 
                           }
                       }
                       if (($maxcheck ne '') && ($corrnumcheck > $maxcheck)) {
                           $maxcheck = $corrnumcheck;
                       }
                       if (($mincheck ne '') && ($corrnumcheck < $mincheck)) {
                           $mincheck = $corrnumcheck;
                       }
                   }
               }
           }
  foreach $name (@whichopt) {   foreach $name (@whichopt) {
   my $response;    my $response;
           if ($env{'form.submitted'} eq 'scantron') {            if ($env{'form.submitted'} eq 'scantron') {
Line 296  sub end_foilgroup { Line 365  sub end_foilgroup {
     } else {      } else {
  $grade{$name}='0'; $wrong++;   $grade{$name}='0'; $wrong++;
     }      }
               if ($checkboxopt) {
                   if ($response eq $checkboxopt) {
                       $checked++;
                   }
               } 
   } else {    } else {
     $ignored++;      $ignored++;
   }    }
Line 314  sub end_foilgroup { Line 388  sub end_foilgroup {
         if ($Apache::lonhomework::type eq 'randomizetry') {          if ($Apache::lonhomework::type eq 'randomizetry') {
             $Apache::lonhomework::results{"resource.$part.$id.foilorder"} = &Apache::lonnet::array2str(@whichopt);              $Apache::lonhomework::results{"resource.$part.$id.foilorder"} = &Apache::lonnet::array2str(@whichopt);
         }          }
  if (($Apache::lonhomework::type eq 'survey') ||          my $skipaward;
             ($Apache::lonhomework::type eq 'surveycred') ||          if ($checkboxvalue) {
             ($Apache::lonhomework::type eq 'anonsurvey') ||              if ((($maxcheck ne '') && ($checked > $maxcheck)) ||
             ($Apache::lonhomework::type eq 'anonsurveycred')) {                  (($mincheck ne '') && ($checked < $mincheck))) {
     if ($ignored == 0) {                  my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='WRONG_NUMBOXESCHECKED';
                 my $ad;                  &Apache::response::handle_previous(\%previous,$ad);
                 if ($Apache::lonhomework::type eq 'anonsurveycred') {                  $skipaward = 1;
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS_CREDIT';              }
                 } elsif ($Apache::lonhomework::type eq 'anonsurvey') {          }
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS';          unless ($skipaward) {
                 } elsif ($Apache::lonhomework::type eq 'surveycred') {      if (($Apache::lonhomework::type eq 'survey') ||
                     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED_CREDIT';                  ($Apache::lonhomework::type eq 'surveycred') ||
                 } else {                  ($Apache::lonhomework::type eq 'anonsurvey') ||
     $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED';                  ($Apache::lonhomework::type eq 'anonsurveycred')) {
                 }          if ($ignored == 0) {
  &Apache::response::handle_previous(\%previous,$ad);                      my $ad;
     } elsif ($wrong==0 && $right==0) {                      if ($Apache::lonhomework::type eq 'anonsurveycred') {
     } else {                          $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS_CREDIT';
  my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='MISSING_ANSWER';                      } elsif ($Apache::lonhomework::type eq 'anonsurvey') {
  &Apache::response::handle_previous(\%previous,$ad);                          $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='ANONYMOUS';
     }                      } elsif ($Apache::lonhomework::type eq 'surveycred') {
  } elsif ($nonlenient) {                          $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED_CREDIT';
                       } else {
           $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED';
                       }
       &Apache::response::handle_previous(\%previous,$ad);
           } elsif ($wrong==0 && $right==0) {
           } else {
       my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='MISSING_ANSWER';
       &Apache::response::handle_previous(\%previous,$ad);
           }
       } elsif ($nonlenient) {
 #  #
 # Non-lenient mode. All right or all wrong  # Non-lenient mode. All right or all wrong
 #  #
     my $ad;          my $ad;
     if ($wrong==0 && $ignored==0) {          if ($wrong==0 && $ignored==0) {
  $ad='EXACT_ANS';      $ad='EXACT_ANS';
     } elsif ($wrong==0 && $right==0) {          } elsif ($wrong==0 && $right==0) {
  #nothing submitted      #nothing submitted
     } else {          } else {
  if ($ignored==0) {      if ($ignored==0) {
     $ad='INCORRECT';          $ad='INCORRECT';
  } else {      } else {
     $ad='MISSING_ANSWER';          $ad='MISSING_ANSWER';
  }      }
     }          }
     $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;          $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
     &Apache::response::handle_previous(\%previous,$ad);          &Apache::response::handle_previous(\%previous,$ad);
  } else {       } else {
 #  #
 # This is lenient mode  # This is lenient mode
 #  #
     my $ad;          my $ad;
     if ($wrong==0 && $right==0) {          if ($wrong==0 && $right==0) {
  #nothing submitted only assign a score if we       #nothing submitted only assign a score if we 
  #need to override a previous grade      #need to override a previous grade
  if (defined($Apache::lonhomework::history{"resource.$part.$id.awarddetail"})) {      if (defined($Apache::lonhomework::history{"resource.$part.$id.awarddetail"})) {
           $ad='ASSIGNED_SCORE';
       }
           } else {
     $ad='ASSIGNED_SCORE';      $ad='ASSIGNED_SCORE';
  }          }
     } else {          $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;
  $ad='ASSIGNED_SCORE';          $Apache::lonhomework::results{"resource.$part.$id.awarded"}=
     }      $right/(scalar(@whichopt));
     $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad;          $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=
     $Apache::lonhomework::results{"resource.$part.$id.awarded"}=      scalar(@whichopt);
  $right/(scalar(@whichopt));       }
     $Apache::lonhomework::results{"resource.$part.$id.numfoils"}=         }
  scalar(@whichopt);  
  }  
       }        }
     }      }
     my $part_id     = $Apache::inputtags::part;      my $part_id     = $Apache::inputtags::part;
Line 481  sub check_box_opt { Line 566  sub check_box_opt {
 # Check if we are in checkbox mode: checkboxvalue specified, on web, only two options.  # Check if we are in checkbox mode: checkboxvalue specified, on web, only two options.
 # If so, return "checked" value  # If so, return "checked" value
     if ($#opt!=1) { return ''; }      if ($#opt!=1) { return ''; }
     if ($target ne 'web') { return ''; }      unless (($target eq 'web') || ($target eq 'grade')) { return ''; }
     return $checkboxvalue;      return $checkboxvalue;
 }  }
   
Line 508  sub check_for_invalid { Line 593  sub check_for_invalid {
   
 sub displayfoils {  sub displayfoils {
   my ($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,    my ($target,$max,$randomize,$TeXlayout,$checkboxvalue,$checkboxchoices,
       $tex_option_switch, $no_tfprompt, @opt)=@_;        $tex_option_switch, $no_tfprompt, $maxcheck, $mincheck, @opt)=@_;
   my @names;     my @names; 
   if (ref($Apache::response::foilgroup{'names'}) eq 'ARRAY') {    if (ref($Apache::response::foilgroup{'names'}) eq 'ARRAY') {
       @names = @{ $Apache::response::foilgroup{'names'} };        @names = @{ $Apache::response::foilgroup{'names'} };
Line 594  sub displayfoils { Line 679  sub displayfoils {
         }          }
     }      }
     my $internal_counter=$Apache::lonxml::counter;      my $internal_counter=$Apache::lonxml::counter;
     my $checkboxopt=&check_box_opt($target,$checkboxvalue,@opt);      my $checkboxopt;
       if ($target eq 'web') {
           $checkboxopt=&check_box_opt($target,$checkboxvalue,@opt);
       }
     if ($checkboxopt && (!$no_tfprompt)) {      if ($checkboxopt && (!$no_tfprompt)) {
        $result.='<br />'.         $result.='<br />'.
                 ($checkboxchoices?&mt('Choices: ').'<b>'.$opt[0].','.$opt[1].'</b>. ':'').                  ($checkboxchoices?&mt('Choices: ').'<b>'.$opt[0].','.$opt[1].'</b>. ':'').

Removed from v.1.194  
changed lines
  Added in v.1.195


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