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, 8 months ago) by harris41
Branches: MAIN
CVS tags: HEAD
beautify/optimize

# The LON-CAPA response handler
#
# various response type definitons response definition
#
# YEAR=2000
# 9/14,9/19,11/21,11/22 Guy Albertelli
# 11/23,11/24,11/28 Gerd Kortemeyer
# 11/28,11/29,12/4,12/11,12/19,12/28 Guy Albertelli
# YEAR=2001
# 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
# 7/10,7/13,8/3
# 8/4 Gerd Kortemeyer
# 8/5,8/6 Guy Albertelli
# 8/6 Scott Harrison

package Apache::response;
use strict;

# ======================================================================= BEGIN
sub BEGIN {
    &Apache::lonxml::register('Apache::response',('responseparam',
						  'caparesponse',
						  'numericalresponse',
						  'stringresponse',
						  'radiobuttonresponse',
						  'optionresponse',
						  'imageresponse',
						  'essayresponse'));
}

# ======================================= Start response (return scalar string)
sub start_response {
    my ($parstack,$safeeval) = @_;  
    my $id = &Apache::lonxml::get_param('id',$parstack,$safeeval);
    if ($id eq '') { $id = $Apache::lonxml::curdepth; }
    push (@Apache::inputtags::response,$id);
    push (@Apache::inputtags::responselist,$id);
    @Apache::inputtags::inputlist = ();
    return $id;
}

# ================================================================ End response
sub end_response {
  pop @Apache::inputtags::response;
  @Apache::inputtags::inputlist = ();
  return '';
}

# =========================================================== Set random number
# used by response to set the non-safe space random number generator to
# something that is stable and unique based on the part number and response
# number
sub setrandomnumber {
    my $rndseed = &Apache::lonnet::rndseed();
    &Apache::lonxml::debug("randseed $rndseed");
#  $rndseed = unpack("%32i",$rndseed);
    $rndseed = $rndseed
	+(&Apache::lonnet::numval($Apache::inputtags::part) << 10);
    if (defined($Apache::inputtags::response['-1'])) {
	$rndseed = $rndseed
	    +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
    }
    srand($rndseed);
    &Apache::lonxml::debug("randseed $rndseed");
    return '';
}

# ================================= write meta parameter (return scalar string)
sub meta_parameter_write {
    my ($name,$type,$default,$display) = @_;
    return '<parameter part="'.$Apache::inputtags::part.
	   '" name="'.$name.
           '" type="'.$type.
           '" default="'.$default.
	   '" display="'.$display.
           ' [Part: '.$Apache::inputtags::part.']"></parameter>'.
	   "\n";
}

# =================================== write meta package (return scalar string)
sub meta_package_write {
    my $name=shift;
    return '<parameter part="'.$Apache::inputtags::part.
	   '" package="'.$name.'"></parameter>'.
           "\n";
}

# ==================================== write meta stores (return scalar string)
sub meta_stores_write {
    my ($name,$type,$display)=@_;
    return '<stores part="'.$Apache::inputtags::part.
	         '" name="'.$name.
                 '" type="'.$type.
		 '" display="'.$display.
                 ' [Part: '.$Apache::inputtags::part.']"></stores>'.
		 "\n";
}

# ============================ write meta mandatory part (return scalar string)
sub mandatory_part_meta {
#
# Autogenerate metadata for mandatory
# input (from RAT or lonparmset) and 
# output (to lonspreadsheet)
# of each part
#
    return
#    &meta_parameter_write('opendate','date_start','',
#                          'Opening Date').
#    &meta_parameter_write('duedate','date_end','',
#                          'Due Date').
#    &meta_parameter_write('answerdate','date_start','',
#                          'Show Answer Date').
#    &meta_parameter_write('weight','int_zeropos','',
#                          'Available Points').
#    &meta_parameter_write('maxtries','int_pos','',
#                          'Maximum Number of Tries').
	&meta_package_write('part');
    &meta_stores_write('solved','string',
                          'Problem Status').
			  &meta_stores_write('tries','int_zeropos',
                          'Number of Attempts').
			  &meta_stores_write('awarded','float',
		          'Partial Credit Factor');
#
# Note: responseid-specific data 'submission' and 'awarddetail'
# not available to spreadsheet -> skip here
#
}

sub check_for_previous {
    my ($curresponse,$partid,$id) = @_;
    my %previous;
    $previous{'used'} = 0;
    foreach my $key (reverse(sort(keys(%Apache::lonhomework::history)))) {
	if ($key =~ /resource\.$partid\.$id\.submission/) {
	    &Apache::lonxml::debug("Trying $key");
	    my $pastresponse=$Apache::lonhomework::history{$key};
	    if ($pastresponse eq $curresponse) {
		$previous{'used'} = 1;
		my $history;
		if ( $key =~ /^(\d+):/ ) {
		    $history=$1;
		    $previous{'award'} = $Apache::lonhomework::history{
			"$history:resource.$partid.$id.awarddetail"};
		    $previous{'last'} = '0';
		} else {
		    $previous{'award'} = $Apache::lonhomework::history{
			"resource.$partid.$id.awarddetail"};
		    $previous{'last'} = '1';
		}
		if (! $previous{'award'} ) { $previous{'award'} = 'UNKNOWN';}
		&Apache::lonxml::debug(
		     "got a match :$previous{'award'}:$previous{'used'}:");
		last;
	    }
	}
    }
    return %previous;
}

# ================================== Start capa response (return scalar string)
sub start_caparesponse {
    require Apache::caparesponse; 
    import Apache::caparesponse; 
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
#  print "\n<br />\nsimple caparesponse\n";
    return &Apache::caparesponse::start_caparesponse($target,$token,$tagstack,
						     $parstack,$parser,
						     $safeeval,$style);
}

# ================================ Start string response (return scalar string)
sub start_stringresponse {
    require Apache::caparesponse;
    import Apache::caparesponse;
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
    return &Apache::caparesponse::start_stringresponse($target,$token,
						       $tagstack,$parstack,
						       $parser,$safeeval,
						       $style);
}

# ============================= Start numerical response (return scalar string)
sub start_numericalresponse {
  require Apache::caparesponse; 
  import Apache::caparesponse; 
  my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
  return &Apache::caparesponse::start_numericalresponse
    ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
}

# ========================== Start radio button response (return scalar string)
sub start_radiobuttonresponse {
    require Apache::radiobuttonresponse; 
    import Apache::radiobuttonresponse; 
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
    return &Apache::radiobuttonresponse::start_radiobuttonresponse(
                  $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
}

# ================================ Start option response (return scalar string)
sub start_optionresponse {
    require Apache::optionresponse; 
    import Apache::optionresponse; 
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
    return &Apache::optionresponse::start_optionresponse(
		  $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
}

# ================================= Start image response (return scalar string)
sub start_imageresponse {
    require Apache::imageresponse; 
    import Apache::imageresponse; 
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
    return &Apache::imageresponse::start_imageresponse(
                  $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
}

# ================================= Start essay response (return scalar string)
sub start_essayresponse {
    require Apache::essayresponse; 
    import Apache::essayresponse; 
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
    return &Apache::essayresponse::start_essayresponse(
	          $target,$token,$tagstack,$parstack,$parser,$safeeval,$style);
}

# ================================= Start param response (return scalar string)
sub start_responseparam {
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
    if ($target eq 'grade' || $target eq 'web') {
	my $default = &Apache::lonxml::get_param('default',$parstack,
						 $safeeval);
	my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval);
	&Apache::lonxml::debug("looking for resource.".
			       $Apache::inputtags::part.".$name");
	my $value = &Apache::lonnet::EXT("resource.$Apache::inputtags::part".
					 ".$name");
	&Apache::lonxml::debug("$name has value :$value: and default :".
			       "$default:");
	if ($value eq '' || $value eq 'con_lost') {
	    &Apache::lonxml::debug("defaulting");
	    $Apache::inputtags::params{$name}=$default;
	} else {
	    &Apache::lonxml::debug("using value");
	    $Apache::inputtags::params{$name}=$value;
	}
	return '';
    } elsif ($target eq 'meta') {
	return &meta_parameter_write($token->[2]->{'name'},
				     $token->[2]->{'type'},
				     $token->[2]->{'default'},
				     $token->[2]->{'description'});
    } elsif ($target eq 'edit') {
	my $result .= &Apache::edit::tag_start($target,$token,
			                 &Apache::lonxml::description($token));
	$result .= &Apache::edit::text_arg('Name:','name',$token).
	           &Apache::edit::text_arg('Type:','type',$token).
		   &Apache::edit::text_arg('Description:','description',
					  $token).
	           &Apache::edit::text_arg('Default:','default',$token).
	           "</td></tr>";
	$result .= &Apache::edit::end_table;
	return $result;
    } elsif ($target eq 'modified') {
	my $result;
	my $constructtag = &Apache::edit::get_new_args($token,$parstack,
						     $safeeval,'name','type',
						     'description','default');
	if ($constructtag) {
	    $result = &Apache::edit::rebuild_tag($token);
	    $result .= &Apache::edit::handle_insert();
	}
	return $result;
	
    } else {
	return '';
    }
}

# ========================================================== End response param
sub end_responseparam {
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
    if ($target eq 'edit') { return ('','no'); }
    return '';
}

1;

__END__

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