version 1.65, 2004/02/10 19:49:54
|
version 1.67, 2004/02/16 19:59:49
|
Line 99 sub BuildProblemAnalysisPage {
|
Line 99 sub BuildProblemAnalysisPage {
|
} |
} |
$r->rflush(); |
$r->rflush(); |
# |
# |
|
my $problem_types = '(option|radiobutton|numerical)'; |
if (exists($ENV{'form.problemchoice'}) && |
if (exists($ENV{'form.problemchoice'}) && |
! exists($ENV{'form.SelectAnother'})) { |
! exists($ENV{'form.SelectAnother'})) { |
foreach my $button (@SubmitButtons) { |
foreach my $button (@SubmitButtons) { |
Line 120 sub BuildProblemAnalysisPage {
|
Line 121 sub BuildProblemAnalysisPage {
|
# |
# |
my ($prev,$curr,$next) = |
my ($prev,$curr,$next) = |
&Apache::lonstathelpers::get_prev_curr_next($current_problem, |
&Apache::lonstathelpers::get_prev_curr_next($current_problem, |
'(option|radiobutton)', |
$problem_types, |
'response', |
'response', |
); |
); |
if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) { |
if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) { |
$current_problem = $prev; |
$current_problem = $prev; |
Line 157 sub BuildProblemAnalysisPage {
|
Line 158 sub BuildProblemAnalysisPage {
|
&RadioResponseAnalysis($r,$current_problem, |
&RadioResponseAnalysis($r,$current_problem, |
$ProblemData, |
$ProblemData, |
\@Students); |
\@Students); |
|
} elsif ($current_problem->{'resptype'} eq 'numerical') { |
|
&NumericalResponseAnalysis($r,$current_problem, |
|
$ProblemData,\@Students); |
} else { |
} else { |
$r->print('<h2>This analysis is not supported</h2>'); |
$r->print('<h2>This analysis is not supported</h2>'); |
} |
} |
Line 168 sub BuildProblemAnalysisPage {
|
Line 172 sub BuildProblemAnalysisPage {
|
$r->print(' 'x5); |
$r->print(' 'x5); |
$r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>'); |
$r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>'); |
$r->print(&Apache::lonstathelpers::ProblemSelector |
$r->print(&Apache::lonstathelpers::ProblemSelector |
('(option|radiobutton)')); |
($problem_types)); |
} |
} |
} |
} |
|
|
|
######################################################### |
|
######################################################### |
|
## |
|
## Numerical Response Routines |
|
## |
|
######################################################### |
|
######################################################### |
|
sub NumericalResponseAnalysis { |
|
my ($r,$problem,$ProblemData,$Students) = @_; |
|
my ($resource,$respid) = ($problem->{'resource'}, |
|
$problem->{'respid'}); |
|
my $analysis_html; |
|
my $PerformanceData = |
|
&Apache::loncoursedata::get_response_data |
|
($Students,$resource->{'symb'},$respid); |
|
if (! defined($PerformanceData) || |
|
ref($PerformanceData) ne 'ARRAY' ) { |
|
$analysis_html = '<h2>'. |
|
&mt('There is no submission data for this resource'). |
|
'</h2>'; |
|
$r->print($analysis_html); |
|
return; |
|
} |
|
my $Answers = &GetStudentAnswers($r,$problem,$Students); |
|
|
|
$r->print('<h2>This analysis is not yet supported</h2>'); |
|
} |
|
|
|
sub GetStudentAnswers { |
|
my ($r,$problem,$Students) = @_; |
|
my %Answers; |
|
my ($resource,$partid,$respid) = ($problem->{'resource'}, |
|
$problem->{'part'}, |
|
$problem->{'respid'}); |
|
# Open progress window |
|
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin |
|
($r,'Student Answer Compilation Status', |
|
'Student Answer Compilation Progress', scalar(@$Students)); |
|
$r->print("<table>\n"); |
|
$r->rflush(); |
|
foreach my $student (@$Students) { |
|
my $sname = $student->{'username'}; |
|
my $sdom = $student->{'domain'}; |
|
my $answer = analyze_problem_as_student($resource, |
|
$sname,$sdom, |
|
$partid,$respid); |
|
$r->print('<tr>'. |
|
'<td>'.$sname.'</td>'. |
|
'<td>'.$sdom.'</td>'. |
|
'<td>'.$answer.'</td>'. |
|
'</tr>'."\n"); |
|
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
|
&mt('last student')); |
|
$Answers{$sname.':'.$sdom}=$answer; |
|
} |
|
$r->print("</table>\n"); |
|
$r->rflush(); |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
# close progress window |
|
return \%Answers; |
|
} |
|
|
######################################################### |
######################################################### |
######################################################### |
######################################################### |
Line 183 sub BuildProblemAnalysisPage {
|
Line 248 sub BuildProblemAnalysisPage {
|
sub RadioResponseAnalysis { |
sub RadioResponseAnalysis { |
my ($r,$problem,$ProblemData,$Students) = @_; |
my ($r,$problem,$ProblemData,$Students) = @_; |
my ($resource,$respid) = ($problem->{'resource'}, |
my ($resource,$respid) = ($problem->{'resource'}, |
$problem->{'respid'}); |
$problem->{'respid'}); |
my $analysis_html; |
my $analysis_html; |
my $PerformanceData = |
my $PerformanceData = |
&Apache::loncoursedata::get_response_data |
&Apache::loncoursedata::get_response_data |
Line 1268 sub build_foil_index {
|
Line 1333 sub build_foil_index {
|
my $a1 = lc($a); |
my $a1 = lc($a); |
my $b1 = lc($b); |
my $b1 = lc($b); |
if (exists($Numbers{$a1})) { |
if (exists($Numbers{$a1})) { |
$a = $Numbers{$a1}; |
$a1 = $Numbers{$a1}; |
} |
} |
if (exists($Numbers{$b1})) { |
if (exists($Numbers{$b1})) { |
$b = $Numbers{$b1}; |
$b1 = $Numbers{$b1}; |
} |
} |
if (($a =~/^\d+$/) && ($b =~/^\d+$/)) { |
if (($a1 =~/^\d+$/) && ($b1 =~/^\d+$/)) { |
return $a <=> $b; |
return $a1 <=> $b1; |
} else { |
} else { |
return $a cmp $b; |
return $a1 cmp $b1; |
} |
} |
}; |
}; |
my @Concepts; |
my @Concepts; |
Line 1552 sub Process_OR_Row {
|
Line 1617 sub Process_OR_Row {
|
return %RowData; |
return %RowData; |
} |
} |
|
|
|
|
|
sub analyze_problem_as_student { |
|
my ($resource,$sname,$sdom,$partid,$respid) = @_; |
|
my $url = $resource->{'src'}; |
|
my $symb = $resource->{'symb'}; |
|
my $courseid = $ENV{'request.course.id'}; |
|
my $Answ=&Apache::lonnet::ssi($url,('grade_target' => 'analyze', |
|
'grade_domain' => $sdom, |
|
'grade_username' => $sname, |
|
'grade_symb' => $symb, |
|
'grade_courseid' => $courseid)); |
|
(my $garbage,$Answ)=split(/_HASH_REF__/,$Answ,2); |
|
my %Answer=&Apache::lonnet::str2hash($Answ); |
|
my $key = $partid.'.'.$respid.'.answer'; |
|
my $student_answer = $Answer{$key}->[0]; |
|
if (! defined($student_answer)) { |
|
$student_answer = $Answer{$key}->[1]; |
|
} |
|
return ($student_answer); |
|
} |
|
|
## |
## |
## get problem data and put it into a useful data structure. |
## get problem data and put it into a useful data structure. |
## note: we must force each foil and option to not begin or end with |
## note: we must force each foil and option to not begin or end with |
Line 1566 sub get_problem_data {
|
Line 1652 sub get_problem_data {
|
my %Partdata; |
my %Partdata; |
foreach my $part (@{$Answer{'parts'}}) { |
foreach my $part (@{$Answer{'parts'}}) { |
while (my($key,$value) = each(%Answer)) { |
while (my($key,$value) = each(%Answer)) { |
|
# |
|
# Logging code: |
|
if (0) { |
|
&Apache::lonnet::logthis($part.' got key "'.$key.'"'); |
|
if (ref($value) eq 'ARRAY') { |
|
&Apache::lonnet::logthis(' '.join(',',@$value)); |
|
} else { |
|
&Apache::lonnet::logthis(' '.$value); |
|
} |
|
} |
|
# End of logging code |
next if ($key !~ /^$part/); |
next if ($key !~ /^$part/); |
$key =~ s/^$part\.//; |
$key =~ s/^$part\.//; |
if (ref($value) eq 'ARRAY') { |
if (ref($value) eq 'ARRAY') { |
Line 1579 sub get_problem_data {
|
Line 1676 sub get_problem_data {
|
$Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}= |
$Partdata{$part}->{'_Foils'}->{$foil}->{'_Concept'}= |
$concept; |
$concept; |
} |
} |
|
} elsif ($key =~ /^(incorrect|answer|ans_low|ans_high)$/) { |
|
$Partdata{$part}->{$key}=$value; |
} |
} |
} else { |
} else { |
if ($key=~ /^foil\.text\.(.*)$/) { |
if ($key=~ /^foil\.text\.(.*)$/) { |
Line 1599 sub get_problem_data {
|
Line 1698 sub get_problem_data {
|
1; |
1; |
|
|
__END__ |
__END__ |
|
|
##### |
|
# partdata{part}->{_Foils}->{foilid}->{'name'} = $ |
|
# ->{'text'} = $ |
|
# ->{'value'} = $ |
|
# ->{'_Concept'} = $ |
|
# partdata{part}->{_Options} = @ |
|
# partdata{part}->{_Concepts} = @ |
|