--- loncom/interface/lonstatistics.pm 2003/01/10 22:26:29 1.56 +++ loncom/interface/lonstatistics.pm 2003/02/18 20:27:33 1.59 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonstatistics.pm,v 1.56 2003/01/10 22:26:29 matthew Exp $ +# $Id: lonstatistics.pm,v 1.59 2003/02/18 20:27:33 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,6 +35,35 @@ # ### +=pod + +=head1 NAME + +lonstatistics + +=head1 SYNOPSIS + +Main handler for statistics and chart. + +=head1 PACKAGES USED + +use strict; +use Apache::Constants qw(:common :http); +use Apache::lonnet(); +use Apache::lonhomework; +use Apache::loncommon; +use Apache::loncoursedata; +use Apache::lonhtmlcommon; +use Apache::lonproblemanalysis; +use Apache::lonproblemstatistics; +use Apache::lonstudentassessment; +use Apache::lonpercentage; +use GDBM_File; + +=over 4 + +=cut + package Apache::lonstatistics; use strict; @@ -48,9 +77,162 @@ use Apache::lonproblemanalysis; use Apache::lonproblemstatistics; use Apache::lonstudentassessment; use Apache::lonpercentage; -use HTML::TokeParser; use GDBM_File; +my @FullClasslist; +my @Students; +my @Sections; +my $curr_student; +my $prev_student; +my $next_student; + +####################################################### +####################################################### + +=pod + +=item &clear_classlist_variables() + +undef the following package variables: + +=over + +=item @FullClasslist The full classlist + +=item @Students The students we are concerned with for this invocation + +=item @Sections The sections available in this class + +=item $curr_student The student currently being examined + +=item $prev_student The student previous in the classlist + +=item $next_student The student next in the classlist + +=back + +=cut + +####################################################### +####################################################### +sub clear_classlist_variables { + undef(@FullClasslist); + undef(@Students); + undef(@Sections); + undef($curr_student); + undef($prev_student); + undef($next_student); +} + +####################################################### +####################################################### + +=pod + +=item &PrepareClasslist() + +Build up the classlist information. The classlist information is kept in +the following package variables: + +=over + +=item @FullClasslist The full classlist + +=item @Students The students we are concerned with for this invocation + +=item @Sections The sections available in this class + +=item $curr_student The student currently being examined + +=item $prev_student The student previous in the classlist + +=item $next_student The student next in the classlist + +=back + +$curr_student, $prev_student, and $next_student may not be defined, depending +upon the calling context. + +=cut + +####################################################### +####################################################### +sub PrepareClasslist { + my $r = shift; + my %Sections; + &clear_classlist_variables(); + # + # Retrieve the classlist + my $cid = $ENV{'request.course.id'}; + my $cdom = $ENV{'course.'.$cid.'.domain'}; + my $cnum = $ENV{'course.'.$cid.'.num'}; + my ($classlist,$field_names) = &Apache::loncoursedata::get_classlist($cid, + $cdom,$cnum); + my %valid_section; + if (exists($ENV{'form.Section'}) && $ENV{'form.Section'} !~ /(all|any)/) { + if (ref($ENV{'form.Section'})) { + foreach (@$ENV{'form.section'}) { + $valid_section{$_}++; + } + } else { + $valid_section{$_}++; + } + } + # + # Process the classlist + while (my ($student,$student_data) = each (%$classlist)) { + my $studenthash = (); + for (my $i=0; $i< scalar(@$field_names);$i++) { + $studenthash->{$field_names->[$i]}=$student_data->[$i]; + } + push (@FullClasslist,$studenthash); + # + # Build up a list of sections + my $section = $studenthash->{'section'}; + $section = 'no section' if (! defined($section) || $section =~/^\s*/ ); + $Sections{$section}++; + # + # Only put in the list those students we are interested in + if (defined($ENV{'form.Section'}) && + $ENV{'form.Section'} !~ /(all|any)/ && + ! exists($valid_section{$section})) { + next; + } + push (@Students,$studenthash); + } + # + # Put the consolidated section data in the right place + @Sections = sort {$a<=>$b} keys(%Sections); + # + # Sort the Students + my $sortby = 'fullname'; + @Students = sort {$a->{$sortby} <=> $b->{$sortby}} @Students; + # + # Now deal with that current student thing.... + if (exists($ENV{'form.StudentAssessmentStudent'})) { + my ($current_uname,$current_dom) = + split(':',$ENV{'form.StudentAssessmentStudent'}); + my $i; + for ($i = 0; $i<=$#Students; $i++) { + next if (($Students[$i]->{'username'} ne $current_uname) || + ($Students[$i]->{'domain'} ne $current_dom)); + last; # If we get here, we have our student. + } + if ($i == 0) { + $prev_student = 'none'; + } else { + $prev_student = $Students[$i-1]; + } + if ($i == $#Students) { + $next_student = 'none'; + } else { + $next_student = $Students[$i+1]; + } + } +} + +####################################################### +####################################################### sub CheckFormElement { my ($cache, $ENVName, $cacheName, $default)=@_; @@ -502,8 +684,8 @@ sub CreateMainMenu { $Str .= ''."\n"; $Str .= ''."\n"; - $Str .= ''."\n"; - $Str .= ''."\n"; + $Str .= ''."\n"; + $Str .= ''."\n"; $Str .= ''."\n"; $Str .= '
Analysis Reports:Student Status:
Select a ReportStudent Status
'Class list', 'problem_statistics' => 'Problem Statistics', 'student_assessment' => 'Student Assessment', - 'percentage' => 'Percentage Graphs', + 'percentage' => 'Correct-problems Plot', # 'activitylog' => 'Activity Log', 'reportSelected' => 'Class list'); @@ -626,7 +808,7 @@ sub BuildStatistics { } elsif($GoToPage eq 'Class list') { &BuildClasslist($cacheDB, $students, \@studentInformation, \@headings, $r); - } elsif($GoToPage eq 'Percentage Graphs') { + } elsif($GoToPage eq 'Correct-problems Plot') { &Apache::lonpercentage::BuildPercentageGraph($cacheDB, $students, $courseID, $c, $r); } @@ -679,10 +861,19 @@ sub handler { $r->content_type('text/html'); $r->send_http_header; + &PrepareClasslist($r); + &BuildStatistics($r); return OK; } 1; + +=pod + +=back + +=cut + __END__