--- loncom/homework/response.pm 2005/11/15 15:57:45 1.129
+++ loncom/homework/response.pm 2006/06/24 01:31:34 1.141
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# various response type definitons response definition
#
-# $Id: response.pm,v 1.129 2005/11/15 15:57:45 albertel Exp $
+# $Id: response.pm,v 1.141 2006/06/24 01:31:34 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -32,13 +32,12 @@ use Apache::lonlocal;
use Apache::lonnet;
BEGIN {
- &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse'));
+ &Apache::lonxml::register('Apache::response',('responseparam','parameter','dataresponse','customresponse','mathresponse'));
}
sub start_response {
my ($parstack,$safeeval)=@_;
- my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
- if ($id eq '') { $id = $Apache::lonxml::curdepth; }
+ my $id = &Apache::lonxml::get_id($parstack,$safeeval);
if ($#Apache::inputtags::import > -1) {
&Apache::lonxml::debug("Turning :$id: into");
$id = join('_',@Apache::inputtags::import).'_'.$id;
@@ -69,8 +68,7 @@ sub end_response {
sub start_hintresponse {
my ($parstack,$safeeval)=@_;
- my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
- if ($id eq '') { $id = $Apache::lonxml::curdepth; }
+ my $id = &Apache::lonxml::get_id($parstack,$safeeval);
push (@Apache::inputtags::hint,$id);
push (@Apache::inputtags::hintlist,$id);
push (@Apache::inputtags::paramstack,[%Apache::inputtags::params]);
@@ -130,11 +128,11 @@ sub setrandomnumber {
}
$shift_amt=scalar(@Apache::inputtags::responselist);
} elsif ($Apache::lonhomework::parsing_a_task) {
- $id1=$Apache::bridgetask::dimension;
- if (!$ignore_id2 && defined($Apache::bridgetask::instance[-1])) {
- $id2=$Apache::bridgetask::instance[-1];
+ $id1=&Apache::bridgetask::get_dim_id();
+ if (!$ignore_id2 && ref($Apache::bridgetask::instance{$id1})) {
+ $id2=$Apache::bridgetask::instance{$id1}[-1];
}
- $shift_amt=scalar(@Apache::bridgetask::instance);
+ $shift_amt=scalar(@{$Apache::bridgetask::instance{$id1}});
}
&Apache::lonxml::debug("id1: $id1, id2: $id2, shift_amt: $shift_amt");
if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' ||
@@ -436,6 +434,82 @@ sub end_customresponse {
return $result;
}
+
+sub start_mathresponse {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+ my $id = &Apache::response::start_response($parstack,$safeeval);
+ push(@Apache::lonxml::namespace,'mathresponse');
+ my $result;
+ undef($Apache::response::custom_answer);
+ &Apache::lonxml::register('Apache::response',('answer'));
+ if ($target eq 'web') {
+ if ( &Apache::response::show_answer() ) {
+ my $answer = &Apache::lonxml::get_param('answerdisplay',$parstack,
+ $safeeval);
+ $Apache::inputtags::answertxt{$id}=$answer;
+ }
+ } elsif ($target eq 'edit') {
+ $result.=&Apache::edit::tag_start($target,$token);
+ $result.=&Apache::edit::text_arg('String to display for answer:',
+ 'answerdisplay',$token);
+ $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
+ } elsif ($target eq 'modified') {
+ my $constructtag;
+ $constructtag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'answerdisplay');
+ if ($constructtag) {
+ $result = &Apache::edit::rebuild_tag($token);
+ $result.=&Apache::edit::handle_insert();
+ }
+ } elsif ($target eq 'answer' || $target eq 'grade') {
+ &Apache::response::reset_params();
+ } elsif ($target eq 'meta') {
+ $result .= &Apache::response::meta_package_write('mathresponse');
+ }
+ return $result;
+}
+
+sub end_mathresponse {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+ my $result;
+ my $part=$Apache::inputtags::part;
+ my $id=$Apache::inputtags::response[-1];
+ if ( $target eq 'grade' && &Apache::response::submitted() ) {
+ my $response = &Apache::response::getresponse();
+ if ( $response =~ /[^\s]/ &&
+ $Apache::response::custom_answer_type eq 'loncapa/perl') {
+ if (!$Apache::lonxml::default_homework_loaded) {
+ &Apache::lonxml::default_homework_load($safeeval);
+ }
+ my %previous = &Apache::response::check_for_previous($response,
+ $part,$id);
+ $Apache::lonhomework::results{"resource.$part.$id.submission"}=
+ $response;
+ my $error;
+ ${$safeeval->varglob('LONCAPA::mathresponse_submission')}=
+ $response;
+
+ my $award = &Apache::run::run('{ my $submission=$LONCAPA::mathresponse_submission;'.$Apache::response::custom_answer.'}',$safeeval);
+ if (!&Apache::inputtags::valid_award($award)) {
+ $error = $award;
+ $award = 'ERROR';
+ }
+ &Apache::response::handle_previous(\%previous,$award);
+ $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=
+ $award;
+ if ($error) {
+ $Apache::lonhomework::results{"resource.$part.$id.awardmsg"}=
+ $error;
+ }
+ }
+ }
+ pop(@Apache::lonxml::namespace);
+ &Apache::lonxml::deregister('Apache::response',('answer'));
+ &Apache::response::end_response();
+ return $result;
+}
+
+
sub start_answer {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $result;
@@ -592,15 +666,30 @@ sub setup_params {
}
}
+{
+ my @answer_bits;
+
sub answer_header {
- my ($type) = @_;
+ my ($type,$increment) = @_;
my $result;
if ($env{'form.answer_output_mode'} eq 'tex') {
- $result = ' \vskip 0 mm \begin{tabular}{|c|}\hline Answer for Part: \verb|'.
- $Apache::inputtags::part.'| \\\\ \hline ';
+ undef(@answer_bits);
+ my $bit;
+ if ($Apache::lonhomework::type eq 'exam') {
+ $bit = ($Apache::lonxml::counter+$increment).') ';
+ } else {
+ $bit .= ' Answer for Part: \verb|'.
+ $Apache::inputtags::part.'| ';
+ }
+ push(@answer_bits,$bit);
} else {
- $result = '
Answer for Part:'.
- $Apache::inputtags::part. ' | '."\n";
+ $result = '';
+ if ($Apache::lonhomework::type eq 'exam') {
+ $result .= ''.($Apache::lonxml::counter+$increment). ') | ';
+ } else {
+ $result .= 'Answer for Part:'.$Apache::inputtags::part.' | ';
+ }
+ $result .= "\n";
}
return $result;
}
@@ -617,7 +706,9 @@ sub answer_part {
last;
}
}
- $result = '\verb'.$to_use.$answer.$to_use.'\\\\ \hline ';
+ if ($answer ne '') {
+ push(@answer_bits,'\verb'.$to_use.$answer.$to_use);
+ }
} else {
$result = ''.$answer.' | ';
}
@@ -628,13 +719,18 @@ sub answer_footer {
my ($type) = @_;
my $result;
if ($env{'form.answer_output_mode'} eq 'tex') {
- $result = ' \end{tabular} \vskip 0 mm ';
+ my $columns = scalar(@answer_bits);
+ $result = ' \vskip 0 mm \noindent \begin{tabular}{|'.'c|'x$columns.'}\hline ';
+ $result .= join(' & ',@answer_bits);
+ $result .= ' \\\\ \\hline \end{tabular} \vskip 0 mm ';
} else {
$result = '
';
}
return $result;
}
+}
+
sub showallfoils {
if (defined($env{'form.showallfoils'})) {
my ($symb)=&Apache::lonxml::whichuser();
@@ -858,6 +954,29 @@ sub submitted {
return 0;
}
+sub add_to_gradingqueue {
+ my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+ if ( $courseid eq ''
+ || $symb eq ''
+ || $env{'request.state'} eq 'construct'
+ || $Apache::lonhomework::type ne 'problem') {
+ return;
+ }
+
+ my %queue_info = ( 'type' => 'problem',
+ 'time' => time);
+
+ if (exists($Apache::lonhomework::history{"resource.0.checkedin.slot"})) {
+ $queue_info{'slot'}=
+ $Apache::lonhomework::history{"resource.0.checkedin.slot"};
+ }
+
+ my $result=&Apache::bridgetask::add_to_queue('gradingqueue',\%queue_info);
+ if ($result ne 'ok') {
+ &Apache::lonxml::error("add_to_queue said $result");
+ }
+}
+
# basically undef and 0 (both false) mean that they still have work to do
# and all true values mean that they can't do any more work
#