--- loncom/interface/statistics/lonstathelpers.pm 2004/11/03 16:13:08 1.29
+++ loncom/interface/statistics/lonstathelpers.pm 2004/12/03 21:20:28 1.33
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstathelpers.pm,v 1.29 2004/11/03 16:13:08 matthew Exp $
+# $Id: lonstathelpers.pm,v 1.33 2004/12/03 21:20:28 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -150,7 +150,7 @@ sub ProblemSelector {
$seq_str .= &mt('response').' '.$respid;
}
$seq_str .= (' 'x2).
- qq{view};
+ qq{view};
$seq_str .= "\n";
$rb_count++;
}
@@ -555,6 +555,7 @@ Returns: nothing
#####################################################
sub GetStudentAnswers {
my ($r,$problem,$Students,$formname,$inputname) = @_;
+ my %answers;
my $status_type;
if (defined($formname)) {
$status_type = 'inline';
@@ -578,10 +579,11 @@ sub GetStudentAnswers {
last if ($c->aborted());
my $sname = $student->{'username'};
my $sdom = $student->{'domain'};
- my $answer = &Apache::lonstathelpers::analyze_problem_as_student
+ my $answer = &Apache::lonstathelpers::get_student_answer
($resource,$sname,$sdom,$partid,$respid);
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
&mt('last student'));
+ $answers{$answer}++;
$student->{'answer'} = $answer;
}
&Apache::lonstathelpers::write_analysis_cache();
@@ -589,7 +591,7 @@ sub GetStudentAnswers {
$r->rflush();
# close progress window
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
- return;
+ return \%answers;
}
#####################################################
@@ -599,27 +601,19 @@ sub GetStudentAnswers {
=item analyze_problem_as_student
-Analyzes a homework problem for a student and returns the correct answer
-for the student. Attempts to put together an answer for problem types
-that do not natively support it.
+Analyzes a homework problem for a student
Inputs: $resource: a resource object
$sname, $sdom, $partid, $respid
-Returns: $answer
-
-If $partid and $respid are specified, $answer is simply a scalar containing
-the correct answer for the response.
-
-If $partid or $respid are undefined, $answer will be a hash reference with
-keys $partid.'.'.$respid.'.answer'.
+Returns: the problem analysis hash
=cut
#####################################################
#####################################################
sub analyze_problem_as_student {
- my ($resource,$sname,$sdom,$partid,$respid) = @_;
+ my ($resource,$sname,$sdom) = @_;
if (ref($resource) ne 'HASH') {
my $res = $resource;
$resource = { 'src' => $res->src,
@@ -630,12 +624,10 @@ sub analyze_problem_as_student {
[$res->responseIds($part)];
}
}
- my $returnvalue;
my $url = $resource->{'src'};
my $symb = $resource->{'symb'};
my $analysis = &get_from_analysis_cache($sname,$sdom,$symb);
if (! defined($analysis)) {
- &Apache::lonnet::logthis('uncached analysis');
my $courseid = $ENV{'request.course.id'};
my $Answ=&Apache::lonnet::ssi($url,('grade_target' => 'analyze',
'grade_domain' => $sdom,
@@ -647,15 +639,62 @@ sub analyze_problem_as_student {
}
my %Answer=&Apache::lonnet::str2hash($analysis);
#
+ return \%Answer;
+}
+
+#####################################################
+#####################################################
+
+=pod
+
+=item get_student_answer
+
+Analyzes a homework problem for a particular student and returns the correct
+answer. Attempts to put together an answer for problem types
+that do not natively support it.
+
+Inputs: $resource: a resource object (from navmaps or hash from loncoursedata)
+ $sname, $sdom, $partid, $respid
+
+Returns: $answer
+
+If $partid and $respid are specified, $answer is simply a scalar containing
+the correct answer for the response.
+
+If $partid or $respid are undefined, $answer will be a hash reference with
+keys $partid.'.'.$respid.'.answer'.
+
+=cut
+
+#####################################################
+#####################################################
+sub get_student_answer {
+ my ($resource,$sname,$sdom,$partid,$respid) = @_;
+ #
+ if (ref($resource) ne 'HASH') {
+ my $res = $resource;
+ $resource = { 'src' => $res->src,
+ 'symb' => $res->symb,
+ 'parts' => $res->parts };
+ foreach my $part (@{$resource->{'parts'}}) {
+ $resource->{'partdata'}->{$part}->{'ResponseIds'}=
+ [$res->responseIds($part)];
+ }
+ }
+ #
+ my $analysis =
+ &analyze_problem_as_student($resource,$sname,$sdom);
my $answer;
foreach my $partid (@{$resource->{'parts'}}) {
my $partdata = $resource->{'partdata'}->{$partid};
foreach my $respid (@{$partdata->{'ResponseIds'}}) {
my $prefix = $partid.'.'.$respid;
my $key = $prefix.'.answer';
- $answer->{$partid}->{$respid} = &get_answer($prefix,$key,%Answer);
+ $answer->{$partid}->{$respid} =
+ &get_answer($prefix,$key,%$analysis);
}
}
+ my $returnvalue;
if (! defined($partid)) {
$returnvalue = $answer;
} elsif (! defined($respid)) {
@@ -1093,7 +1132,7 @@ sub get_problem_data {
$Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}=
$concept;
}
- } elsif ($key =~ /^(incorrect|answer|ans_low|ans_high|str_type)$/) {
+ } elsif ($key =~ /^(unit|incorrect|answer|ans_low|ans_high|str_type)$/) {
$Partdata{$part}->{$key}=$value;
}
} else {