File:  [LON-CAPA] / loncom / homework / response.pm
Revision 1.37: download - view: text, annotated - select for diffs
Mon Aug 6 20:05:57 2001 UTC (22 years, 10 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
beautify/optimize

    1: # The LON-CAPA response handler
    2: #
    3: # various response type definitons response definition
    4: #
    5: # YEAR=2000
    6: # 9/14,9/19,11/21,11/22 Guy Albertelli
    7: # 11/23,11/24,11/28 Gerd Kortemeyer
    8: # 11/28,11/29,12/4,12/11,12/19,12/28 Guy Albertelli
    9: # YEAR=2001
   10: # 1/8,1/10,1/19,1/22,2/7,2/19,4/4,4/7,4/16,5/4,5/31,6/2,6/29 Guy Albertelli
   11: # 7/10,7/13,8/3
   12: # 8/4 Gerd Kortemeyer
   13: # 8/5,8/6 Guy Albertelli
   14: # 8/6 Scott Harrison
   15: 
   16: package Apache::response;
   17: use strict;
   18: 
   19: # ======================================================================= BEGIN
   20: sub BEGIN {
   21:     &Apache::lonxml::register('Apache::response',('responseparam',
   22: 						  'caparesponse',
   23: 						  'numericalresponse',
   24: 						  'stringresponse',
   25: 						  'radiobuttonresponse',
   26: 						  'optionresponse',
   27: 						  'imageresponse',
   28: 						  'essayresponse'));
   29: }
   30: 
   31: # ======================================= Start response (return scalar string)
   32: sub start_response {
   33:     my ($parstack,$safeeval) = @_;  
   34:     my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval);
   35:     if ($id eq '') { $id = $Apache::lonxml::curdepth; }
   36:     push (@Apache::inputtags::response,$id);
   37:     push (@Apache::inputtags::responselist,$id);
   38:     @Apache::inputtags::inputlist = ();
   39:     return $id;
   40: }
   41: 
   42: # ================================================================ End response
   43: sub end_response {
   44:   pop @Apache::inputtags::response;
   45:   @Apache::inputtags::inputlist = ();
   46:   return '';
   47: }
   48: 
   49: # =========================================================== Set random number
   50: # used by response to set the non-safe space random number generator to
   51: # something that is stable and unique based on the part number and response
   52: # number
   53: sub setrandomnumber {
   54:     my $rndseed = &Apache::lonnet::rndseed();
   55:     &Apache::lonxml::debug("randseed $rndseed");
   56: #  $rndseed = unpack("%32i",$rndseed);
   57:     $rndseed = $rndseed
   58: 	+(&Apache::lonnet::numval($Apache::inputtags::part) << 10);
   59:     if (defined($Apache::inputtags::response['-1'])) {
   60: 	$rndseed = $rndseed
   61: 	    +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
   62:     }
   63:     srand($rndseed);
   64:     &Apache::lonxml::debug("randseed $rndseed");
   65:     return '';
   66: }
   67: 
   68: # ================================= write meta parameter (return scalar string)
   69: sub meta_parameter_write {
   70:     my ($name,$type,$default,$display) = @_;
   71:     return '<parameter part="'.$Apache::inputtags::part.
   72: 	   '" name="'.$name.
   73:            '" type="'.$type.
   74:            '" default="'.$default.
   75: 	   '" display="'.$display.
   76:            ' [Part: '.$Apache::inputtags::part.']"></parameter>'.
   77: 	   "\n";
   78: }
   79: 
   80: # =================================== write meta package (return scalar string)
   81: sub meta_package_write {
   82:     my $name=shift;
   83:     return '<parameter part="'.$Apache::inputtags::part.
   84: 	   '" package="'.$name.'"></parameter>'.
   85:            "\n";
   86: }
   87: 
   88: # ==================================== write meta stores (return scalar string)
   89: sub meta_stores_write {
   90:     my ($name,$type,$display)=@_;
   91:     return '<stores part="'.$Apache::inputtags::part.
   92: 	         '" name="'.$name.
   93:                  '" type="'.$type.
   94: 		 '" display="'.$display.
   95:                  ' [Part: '.$Apache::inputtags::part.']"></stores>'.
   96: 		 "\n";
   97: }
   98: 
   99: # ============================ write meta mandatory part (return scalar string)
  100: sub mandatory_part_meta {
  101: #
  102: # Autogenerate metadata for mandatory
  103: # input (from RAT or lonparmset) and 
  104: # output (to lonspreadsheet)
  105: # of each part
  106: #
  107:     return
  108: #    &meta_parameter_write('opendate','date_start','',
  109: #                          'Opening Date').
  110: #    &meta_parameter_write('duedate','date_end','',
  111: #                          'Due Date').
  112: #    &meta_parameter_write('answerdate','date_start','',
  113: #                          'Show Answer Date').
  114: #    &meta_parameter_write('weight','int_zeropos','',
  115: #                          'Available Points').
  116: #    &meta_parameter_write('maxtries','int_pos','',
  117: #                          'Maximum Number of Tries').
  118: 	&meta_package_write('part');
  119:     &meta_stores_write('solved','string',
  120:                           'Problem Status').
  121: 			  &meta_stores_write('tries','int_zeropos',
  122:                           'Number of Attempts').
  123: 			  &meta_stores_write('awarded','float',
  124: 		          'Partial Credit Factor');
  125: #
  126: # Note: responseid-specific data 'submission' and 'awarddetail'
  127: # not available to spreadsheet -> skip here
  128: #
  129: }
  130: 
  131: sub check_for_previous {
  132:     my ($curresponse,$partid,$id) = @_;
  133:     my %previous;
  134:     $previous{'used'} = 0;
  135:     foreach my $key (reverse(sort(keys(%Apache::lonhomework::history)))) {
  136: 	if ($key =~ /resource\.$partid\.$id\.submission/) {
  137: 	    &Apache::lonxml::debug("Trying $key");
  138: 	    my $pastresponse=$Apache::lonhomework::history{$key};
  139: 	    if ($pastresponse eq $curresponse) {
  140: 		$previous{'used'} = 1;
  141: 		my $history;
  142: 		if ( $key =~ /^(\d+):/ ) {
  143: 		    $history=$1;
  144: 		    $previous{'award'} = $Apache::lonhomework::history{
  145: 			"$history:resource.$partid.$id.awarddetail"};
  146: 		    $previous{'last'} = '0';
  147: 		} else {
  148: 		    $previous{'award'} = $Apache::lonhomework::history{
  149: 			"resource.$partid.$id.awarddetail"};
  150: 		    $previous{'last'} = '1';
  151: 		}
  152: 		if (! $previous{'award'} ) { $previous{'award'} = 'UNKNOWN';}
  153: 		&Apache::lonxml::debug(
  154: 		     "got a match :$previous{'award'}:$previous{'used'}:");
  155: 		last;
  156: 	    }
  157: 	}
  158:     }
  159:     return %previous;
  160: }
  161: 
  162: # ================================== Start capa response (return scalar string)
  163: sub start_caparesponse {
  164:     require Apache::caparesponse; 
  165:     import Apache::caparesponse; 
  166:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  167: #  print "\n<br />\nsimple caparesponse\n";
  168:     return &Apache::caparesponse::start_caparesponse($target,$token,$tagstack,
  169: 						     $parstack,$parser,
  170: 						     $safeeval,$style);
  171: }
  172: 
  173: # ================================ Start string response (return scalar string)
  174: sub start_stringresponse {
  175:     require Apache::caparesponse;
  176:     import Apache::caparesponse;
  177:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  178:     return &Apache::caparesponse::start_stringresponse($target,$token,
  179: 						       $tagstack,$parstack,
  180: 						       $parser,$safeeval,
  181: 						       $style);
  182: }
  183: 
  184: # ============================= Start numerical response (return scalar string)
  185: sub start_numericalresponse {
  186:   require Apache::caparesponse; 
  187:   import Apache::caparesponse; 
  188:   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  189:   return &Apache::caparesponse::start_numericalresponse
  190:     ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
  191: }
  192: 
  193: # ========================== Start radio button response (return scalar string)
  194: sub start_radiobuttonresponse {
  195:     require Apache::radiobuttonresponse; 
  196:     import Apache::radiobuttonresponse; 
  197:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  198:     return &Apache::radiobuttonresponse::start_radiobuttonresponse(
  199:                   $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
  200: }
  201: 
  202: # ================================ Start option response (return scalar string)
  203: sub start_optionresponse {
  204:     require Apache::optionresponse; 
  205:     import Apache::optionresponse; 
  206:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  207:     return &Apache::optionresponse::start_optionresponse(
  208: 		  $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
  209: }
  210: 
  211: # ================================= Start image response (return scalar string)
  212: sub start_imageresponse {
  213:     require Apache::imageresponse; 
  214:     import Apache::imageresponse; 
  215:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  216:     return &Apache::imageresponse::start_imageresponse(
  217:                   $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
  218: }
  219: 
  220: # ================================= Start essay response (return scalar string)
  221: sub start_essayresponse {
  222:     require Apache::essayresponse; 
  223:     import Apache::essayresponse; 
  224:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  225:     return &Apache::essayresponse::start_essayresponse(
  226: 	          $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
  227: }
  228: 
  229: # ================================= Start param response (return scalar string)
  230: sub start_responseparam {
  231:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
  232:     if ($target eq 'grade' || $target eq 'web') {
  233: 	my $default = &Apache::lonxml::get_param('default',$parstack,
  234: 						 $safeeval);
  235: 	my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
  236: 	&Apache::lonxml::debug("looking for resource.".
  237: 			       $Apache::inputtags::part.".$name");
  238: 	my $value = &Apache::lonnet::EXT("resource.$Apache::inputtags::part".
  239: 					 ".$name");
  240: 	&Apache::lonxml::debug("$name has value :$value: and default :".
  241: 			       "$default:");
  242: 	if ($value eq '' || $value eq 'con_lost') {
  243: 	    &Apache::lonxml::debug("defaulting");
  244: 	    $Apache::inputtags::params{$name}=$default;
  245: 	} else {
  246: 	    &Apache::lonxml::debug("using value");
  247: 	    $Apache::inputtags::params{$name}=$value;
  248: 	}
  249: 	return '';
  250:     } elsif ($target eq 'meta') {
  251: 	return &meta_parameter_write($token->[2]->{'name'},
  252: 				     $token->[2]->{'type'},
  253: 				     $token->[2]->{'default'},
  254: 				     $token->[2]->{'description'});
  255:     } elsif ($target eq 'edit') {
  256: 	my $result .= &Apache::edit::tag_start($target,$token,
  257: 			                 &Apache::lonxml::description($token));
  258: 	$result .= &Apache::edit::text_arg('Name:','name',$token).
  259: 	           &Apache::edit::text_arg('Type:','type',$token).
  260: 		   &Apache::edit::text_arg('Description:','description',
  261: 					  $token).
  262: 	           &Apache::edit::text_arg('Default:','default',$token).
  263: 	           "</td></tr>";
  264: 	$result .= &Apache::edit::end_table;
  265: 	return $result;
  266:     } elsif ($target eq 'modified') {
  267: 	my $result;
  268: 	my $constructtag = &Apache::edit::get_new_args($token,$parstack,
  269: 						     $safeeval,'name','type',
  270: 						     'description','default');
  271: 	if ($constructtag) {
  272: 	    $result = &Apache::edit::rebuild_tag($token);
  273: 	    $result .= &Apache::edit::handle_insert();
  274: 	}
  275: 	return $result;
  276: 	
  277:     } else {
  278: 	return '';
  279:     }
  280: }
  281: 
  282: # ========================================================== End response param
  283: sub end_responseparam {
  284:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  285:     if ($target eq 'edit') { return ('','no'); }
  286:     return '';
  287: }
  288: 
  289: 1;
  290: 
  291: __END__

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