Diff for /loncom/homework/optionresponse.pm between versions 1.5 and 1.21

version 1.5, 2001/03/01 00:59:33 version 1.21, 2001/08/06 19:00:13
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LON-CAPA option response handler
 # option list style responses  #
 # 2/21 Guy  # Option list style responses
   #
   # YEAR=2001
   # 1/19,2/7,2/19,2/21,2/22,3/1,5/4,5/21,5/31,6/1,6/2,6/5,6/11 Guy Albertelli
   # 6/12,6/16,6/26,6/27,7/18 Guy Albertelli
   # 8/6 Scott Harrison
   
 package Apache::optionresponse;  package Apache::optionresponse;
 use strict;  use strict;
   use Apache::response;
   
   # ======================================================================= BEGIN
 sub BEGIN {  sub BEGIN {
   &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));    &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));
 }  }
   
   # ================================ Start option response (return scalar string)
 sub start_optionresponse {  sub start_optionresponse {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   #when in a radiobutton response use these      my $result = '';
   &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));      #when in a radiobutton response use these
   my $id = &Apache::response::start_response($parstack,$safeeval);      &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil',
   return '';   'conceptgroup'));
       push (@Apache::lonxml::namespace,'optionresponse');
       my $id = &Apache::response::start_response($parstack,$safeeval);
       if ($target eq 'edit') {
    $result .= &Apache::edit::start_table($token).
              "<tr><td>Multiple Option Response Question</td><td>Delete:".
      &Apache::edit::deletelist($target,$token).
      "</td><td>&nbsp;</td></tr><tr><td colspan=\"3\">\n";
    $result .= &Apache::edit::text_arg('Max Number Of Foils:','max',
      $token,'4')."</td></tr>";
    $result .= "<tr><td colspan=\"3\">\n";
       }
       if ($target eq 'modified') {
    my $constructtag = &Apache::edit::get_new_args($token,$parstack,
          $safeeval,'max');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
       return $result;
 }  }
   
   # ================================== End option response (return scalar string)
 sub end_optionresponse {  sub end_optionresponse {
   &Apache::response::end_response;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   return '';      &Apache::response::end_response;
       pop @Apache::lonxml::namespace;
       my $result;
       if ($target eq 'edit') { $result = &Apache::edit::end_table(); }
       return $result;
 }  }
   
 %Apache::response::foilgroup={};  # ===================================== Start foil group (return scalar string)
   %Apache::response::foilgroup = {};
 sub start_foilgroup {  sub start_foilgroup {
   %Apache::response::foilgroup={};      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   $Apache::optionresponse::conceptgroup=0;        my $result = '';
   &setrandomnumber();      %Apache::response::foilgroup = {};
   return '';      $Apache::optionresponse::conceptgroup = 0;
 }      &Apache::response::setrandomnumber();
       if ($target eq 'edit') {
 sub setrandomnumber {   my $optionlist = "<option></option>\n";
   my $rndseed=&Apache::lonnet::rndseed();   my $option;
   $rndseed=unpack("%32i",$rndseed);   my @opt;
   $rndseed=$rndseed   eval '@opt ='.
     +&Apache::lonnet::numval($Apache::inputtags::part)      &Apache::lonxml::get_param('options',$parstack,$safeeval);
       +&Apache::lonnet::numval($Apache::inputtags::response['-1']);   my $count = 1;
   srand($rndseed);   foreach $option (@opt) {
   &Apache::lonxml::debug("randseed $rndseed");      $optionlist .= "<option value=\"$count\">$option</option>\n";
   return '';      $count++;
    }
    my $insertlist = &Apache::edit::insertlist($target,$token);
    $result .= &Apache::edit::start_table($token);
    $result .= (<<ENDTABLE);
        <tr><td>Select Options</td>
           <td>
     Add new Option: <input type="text" name="$Apache::lonxml::curdepth.options" />
           </td>
           <td>Delete an Option:
     <select name="$Apache::lonxml::curdepth.deleteopt">$optionlist</select>
           </td>
        </tr>
        <tr><td colspan="3">$insertlist<br />
   ENDTABLE
       }
       if ($target eq 'modified') {
    my @options;
    my $optchanged=0;
    eval '@options ='.
       &Apache::lonxml::get_param('options',$parstack,$safeeval);
    if ($ENV{"form.$Apache::lonxml::curdepth.deleteopt"}) {
       my $delopt=$ENV{"form.$Apache::lonxml::curdepth.deleteopt"};
       &Apache::lonxml::debug("Deleting :$delopt:");
       splice(@options,$delopt-1,1);
       $optchanged = 1;
    }
    if ($ENV{"form.$Apache::lonxml::curdepth.options"}) {
       my $newopt = $ENV{"form.$Apache::lonxml::curdepth.options"};
       if ($options[0]) {
    push(@options,$newopt);
       } else {
    $options[0] = $newopt;
       }
       $optchanged = 1;
    }
    if ($optchanged) {
       $result = "<foilgroup options=\"(";
       foreach my $option (@options) {
    $option =~ s/\'/\\\'/;
    &Apache::lonxml::debug("adding option :$option:");
    $result .= "'".$option."',";
       }
       chop $result;
       $result .= ')">';
    } # else nothing changed so just use the default mechanism
       }
       return $result;
 }  }
   
   # ======================================= End foil group (return scalar string)
 sub end_foilgroup {  sub end_foilgroup {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
         my $result;
   my $result;      if ($target eq 'grade' || $target eq 'web') {
   if ($target ne 'meta') {   my $name;
     my $name;   my ($count,$max) = &getfoilcounts($parstack,$safeeval);
     my ($count,$max) = &getfoilcounts($parstack,$safeeval);   if ($count>$max) { $count = $max } 
     if ($count>$max) { $count=$max }    &Apache::lonxml::debug("Count is $count from $max");
     &Apache::lonxml::debug("Count is $count from $max");   my @opt;
     my $args ='';   eval '@opt ='.
     if ( $#$parstack > 0 ) { $args=$$parstack['-1']; }      &Apache::lonxml::get_param('options',$parstack,$safeeval);
     my @opt;   &Apache::lonxml::debug("Options are $#opt");
     eval '@opt ='.&Apache::run::run("{$args;".'return $options}',$safeeval);   if ($target eq 'web') {
     if ($target eq 'web') {      $result=&displayfoils($count,@opt);
       $result=&displayfoils($count,@opt);   } elsif ( $target eq 'grade') {
     } elsif ( $target eq 'grade') {      if ( defined $ENV{'form.submitted'}) {
       if ( defined $ENV{'form.submitted'}) {   my @whichopt = &whichfoils($count);
  my @whichopt = &whichfoils($count);   my $temp=1;my $name;
  my $temp=1;my $name;   my $allresponse;
  my $allresponse;   my $right=0;
  my $right=0;   my $wrong=0;
  my $wrong=0;   my $ignored=0;
  foreach $name (@whichopt) {   foreach $name (@whichopt) {
   my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"};      my $response = $ENV{'form.HWVAL_'.
   $allresponse.="$response:";   $Apache::inputtags::response['-1'].
   if ( $response =~ /[^\s]/) {   ":$temp"};
     &Apache::lonxml::debug("submitted a $response<br />\n");      $allresponse .= "$response:";
     my $value=$Apache::response::foilgroup{$name.'.value'};      if ( $response =~ /[^\s]/) {
     if ($value eq $response) {$right++;} else {$wrong++;}   &Apache::lonxml::debug("submitted a $response".
   }         "<br />\n");
   $temp++;   my $value = $Apache::response::foilgroup{$name.
  }       '.value'};
  my $id = $Apache::inputtags::response['-1'];   if ($value eq $response) {$right++;} else {$wrong++;}
  $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$allresponse;      } else {
  &Apache::lonxml::debug("Got $right right and $wrong wrong");   $ignored++;
  if ($wrong==0) {      }
   $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='EXACT_ANS';      $temp++;
  } else {   }
   $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='INCORRECT';   my $id = $Apache::inputtags::response['-1'];
    $Apache::lonhomework::results{"resource.".
                $Apache::inputtags::part.".$id.submission"} = $allresponse;
    &Apache::lonxml::debug("Got $right right and $wrong wrong, ".
          "and $ignored were ignored");
    if ($wrong==0 && $ignored==0) {
       $Apache::lonhomework::results{"resource.".
      $Apache::inputtags::part.".$id.awarddetail"}
                                                     = 'EXACT_ANS';
    } else {
       $Apache::lonhomework::results{"resource.".
      $Apache::inputtags::part.".$id.awarddetail"}
                                                    = 'INCORRECT';
    }
       }
  }   }
       }  
     }      }
   }      if ($target eq 'edit') {
   return $result;   $result .= &Apache::edit::end_table();
       }
       return $result;
 }  }
   
   # ==================================== Get foil counts (return 2 element array)
 sub getfoilcounts {  sub getfoilcounts {
   my ($parstack,$safeeval)=@_;      my ($parstack,$safeeval) = @_;
   my $rrargs ='';      my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2');
   if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; }      # +1 since instructors will count from 1
   my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval);      my $count = $#{ $Apache::response::foilgroup{'names'} }+1;
   my $count = $#{ $Apache::response::foilgroup{'names'} };      return ($count,$max);
   return ($count,$max);  
 }  }
   
   # =============================================== Which foils (return an array)
 sub whichfoils {  sub whichfoils {
   my ($max)=@_;      my ($max)=@_;
   my @names = @{ $Apache::response::foilgroup{'names'} };      my @names = @{ $Apache::response::foilgroup{'names'} };
   my @whichopt =();      my @whichopt =();
   while ((($#whichopt+1) < $max) && ($#names > -1)) {      while ((($#whichopt+1) < $max) && ($#names > -1)) {
     my $aopt=int rand $#names;   &Apache::lonxml::debug("Have $#whichopt max is $max");
     &Apache::lonxml::debug("From $#names elms, picking $aopt");   my $aopt=int(rand($#names+1));
     $aopt=splice(@names,$aopt,1);   &Apache::lonxml::debug("From $#whichopt $max $#names elms, picking ".
     &Apache::lonxml::debug("Picked $aopt");         $aopt);
     push (@whichopt,$aopt);   $aopt=splice(@names,$aopt,1);
   }   &Apache::lonxml::debug("Picked $aopt");
   return @whichopt;   push (@whichopt,$aopt);
       }
       return @whichopt;
 }  }
   
   # ======================================== Display foils (return scalar string)
 sub displayfoils {  sub displayfoils {
   my ($max,@opt)=@_;      my ($max,@opt) = @_;
   my @names = @{ $Apache::response::foilgroup{'names'} };      my @names = @{ $Apache::response::foilgroup{'names'} };
   my @truelist;      my @truelist;
   my @falselist;      my @falselist;
   my $result;      my $result;
   my $name;      my $name;
   my @whichopt = &whichfoils($max);      my @whichopt = &whichfoils($max);
   my $optionlist="<option></option>\n";      my $optionlist = "<option></option>\n";
   my $option;      my $option;
   foreach $option (@opt) {      foreach $option (@opt) {
     $optionlist.="<option>$option</option>\n";   $optionlist .= "<option>$option</option>\n";
   }  
   if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {  
     foreach $name (@whichopt) {  
       $result.="<br />".$Apache::response::foilgroup{$name.'.value'}.  
  ":".$Apache::response::foilgroup{$name.'.text'}."\n";  
     }  
   } else {  
     my $temp=1;  
     foreach $name (@whichopt) {  
       $result.="<br /><select name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\">"  
  .$optionlist  
   ."</select>\n".$Apache::response::foilgroup{$name.'.text'}."\n";  
       $temp++;  
     }      }
   }      if ($Apache::lonhomework::history{"resource.".
   return $result."<br />";        $Apache::inputtags::part.
         ".solved"} =~ /^correct/ ) {
    foreach $name (@whichopt) {
       $result.="<br />".$Apache::response::foilgroup{$name.'.value'}.
    ":".$Apache::response::foilgroup{$name.'.text'}."\n";
    }
       } else {
    my $temp=1;
    foreach $name (@whichopt) {
       $result .= "<br /><select ".
    "name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\">".
    $optionlist.
    "</select>\n".$Apache::response::foilgroup{$name.'.text'}."\n";
       $temp++;
    }
       }
       return $result."<br />";
 }  }
   
   # ================================== Start concept group (return scalar string)
 sub start_conceptgroup {  sub start_conceptgroup {
   $Apache::optionresponse::conceptgroup=1;        my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   %Apache::response::conceptgroup={};      $Apache::optionresponse::conceptgroup = 1;
   return '';      %Apache::response::conceptgroup = {};
       my $result;
       if ($target eq 'edit') {
    $result .= &Apache::edit::tag_start($target,$token,
    "Concept Grouped Foils");
    $result .= &Apache::edit::text_arg('Concept:','concept',$token,'50').
              "</td></tr>";
    $result .= "<tr><td colspan=\"3\">\n";
       }
       if ($target eq 'modified') {
           my $constructtag = &Apache::edit::get_new_args($token,$parstack,
        $safeeval,'concept');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
       return $result;
 }  }
   
   # ==================================== End concept group (return scalar string)
 sub end_conceptgroup {  sub end_conceptgroup {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   $Apache::optionresponse::conceptgroup=0;        $Apache::optionresponse::conceptgroup = 0;
   if ($target eq 'web' || $target eq 'grade') {      my $result = '';
     my @names = @{ $Apache::response::conceptgroup{'names'} };      if ($target eq 'web' || $target eq 'grade') {
     my $pick=int rand $#names+1;   #if not there aren't any foils to display and thus no question
     my $name=$names[$pick];   if (defined(@{ $Apache::response::conceptgroup{'names'} })) {
     push @{ $Apache::response::foilgroup{'names'} }, $name;      my @names = @{ $Apache::response::conceptgroup{'names'} };
     $Apache::response::foilgroup{"$name.value"} =  $Apache::response::conceptgroup{"$name.value"};      my $pick = int rand $#names+1;
     $Apache::response::foilgroup{"$name.text"} =  $Apache::response::conceptgroup{"$name.text"};      my $name = $names[$pick];
     my $args;      push @{ $Apache::response::foilgroup{'names'} }, $name;
     if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }      $Apache::response::foilgroup{"$name.value"} =
     my $concept = &Apache::run::run("{$args;".'return $concept}',$safeeval);   $Apache::response::conceptgroup{"$name.value"};
     $Apache::response::foilgroup{"$name.concept"} = $concept;      $Apache::response::foilgroup{"$name.text"} =
     &Apache::lonxml::debug("Selecting $name in $concept");   $Apache::response::conceptgroup{"$name.text"};
   }      my $concept = 
   return '';   &Apache::lonxml::get_param('concept',$parstack,$safeeval);
       $Apache::response::foilgroup{"$name.concept"} = $concept;
       &Apache::lonxml::debug("Selecting $name in $concept");
    }
       }
       if ($target eq 'edit') {
    $result = &Apache::edit::end_table();
       }
       return $result;
 }  }
   
   # ======================================================== Insert concept group
   sub insert_conceptgroup {
       my $result="\n\t\t<conceptgroup concept=\"\">".&insert_foil().
          "\n\t\t</conceptgroup>\n";
       return $result;
   }
   
   # =========================================== Start foil (return scalar string)
 sub start_foil {  sub start_foil {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   if ($target eq 'web') { &Apache::lonxml::startredirection; }      my $result = '';
   return '';      if ($target eq 'web') { &Apache::lonxml::startredirection; }
       if ($target eq 'edit') {
    $result = &Apache::edit::tag_start($target,$token,"Foil");
    my $level = '-2';
    if ($$tagstack['-2'] eq 'conceptgroup') { $level = '-3'; }
    my @opt;
    eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,
    $safeeval,$level);
    $result .= &Apache::edit::text_arg('Name:','name',$token);
    $result .= &Apache::edit::select_or_text_arg('Correct Option:',
        'value',
        ['unused',(@opt)],$token,
        '15');
    $result .= '</td></tr><tr><td colspan="3">';
       }
       if ($target eq 'modified') {
    my $constructtag = &Apache::edit::get_new_args($token,$parstack,
          $safeeval,'value',
          'name');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
       return $result;
 }  }
   
   # ============================================= End foil (return scalar string)
 sub end_foil {  sub end_foil {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
   my $text ='';      my $text = '';
   if ($target eq 'web') { $text=&Apache::lonxml::endredirection; }      my $result = '';
   if ($target eq 'web' || $target eq 'grade') {      if ($target eq 'web') { $text=&Apache::lonxml::endredirection; }
     my $args ='';      if ($target eq 'web' || $target eq 'grade') {
     if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }   my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval);
     my $value = &Apache::run::run("{$args;".'return $value}',$safeeval);   if ($value ne 'unused') {
     if ($value ne 'unused') {      my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
       my $name = &Apache::run::run("{$args;".'return $name}',$safeeval);      &Apache::lonxml::debug("Got a name of :$name:");
       if ( $Apache::optionresponse::conceptgroup ) {      if (!$name) { $name = $Apache::lonxml::curdepth; }
  push @{ $Apache::response::conceptgroup{'names'} }, $name;      &Apache::lonxml::debug("Using a name of :$name:");
  $Apache::response::conceptgroup{"$name.value"} = $value;      if ( $Apache::optionresponse::conceptgroup ) {
  $Apache::response::conceptgroup{"$name.text"} = $text;   push @{ $Apache::response::conceptgroup{'names'} }, $name;
       } else {   $Apache::response::conceptgroup{"$name.value"} = $value;
  push @{ $Apache::response::foilgroup{'names'} }, $name;   $Apache::response::conceptgroup{"$name.text"} = $text;
  $Apache::response::foilgroup{"$name.value"} = $value;      } else {
  $Apache::response::foilgroup{"$name.text"} = $text;   push @{ $Apache::response::foilgroup{'names'} }, $name;
       }   $Apache::response::foilgroup{"$name.value"} = $value;
    $Apache::response::foilgroup{"$name.text"} = $text;
       }
    }
     }      }
   }      if ($target eq 'edit') {
   return '';   $result .= &Apache::edit::tag_end($target,$token,'');
       }
       return $result;
   }
   
   # ========================================== Insert foil (return scalar string)
   sub insert_foil {
       return '
   <foil name="" value="unused">
   <startouttext />
   <endouttext />
   </foil>';
 }  }
   
 1;  1;
   
 __END__  __END__
     

Removed from v.1.5  
changed lines
  Added in v.1.21


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.