'."\n");
- $r->print(''."\n");
- $r->print(&CreateProblemStatisticsTableHeading($headings, $r));
+###############################################
+###############################################
+sub output_html_ungrouped {
+ my ($r,$option) = @_;
+ #
+ my $problem_num = 0;
+ my $show_container = 0;
+ my $show_part = 0;
+ #$r->print(&ProblemStatisticsLegend());
+ my @Header = ("Title","Part","#Stdnts","Tries","Mod",
+ "Mean","#YES","#yes","%Wrng","DoDiff",
+ "S.D.","Skew");#,"D.F.1st","D.F.2nd");
+ #
+ my $sortby = undef;
+ foreach (@Header) {
+ if ($ENV{'form.sortby'} eq $_) {
+ $sortby = $_;
+ }
+ }
+ if (! defined($sortby) || $sortby eq '') {
+ $sortby = 'Container';
+ }
+ # If there is more than one sequence, list their titles
+ my @Sequences = &Apache::lonstatistics::Sequences_with_Assess();
+ if (@Sequences > 1) {
+ unshift(@Header,"Container");
+ $show_container = 1;
+ }
+ #
+ # If the option for showing the problem number is needed, push that
+ # on the list too
+ if (defined($option) && $option =~ /show probnum/) {
+ unshift(@Header,"P#");
+ }
+ #
+ $r->print(''."\n");
+ $r->rflush();
+ #
+ # Compile the data
+ my @Statsarray;
+ foreach my $sequence (@Sequences) {
+ next if ($sequence->{'num_assess'}<1);
+ foreach my $resource (@{$sequence->{'contents'}}) {
+ next if ($resource->{'type'} ne 'assessment');
+ foreach my $part (@{$resource->{'parts'}}) {
+ $problem_num++;
+ my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
+ $SKEW) = &Apache::loncoursedata::get_problem_statistics
+ (undef,$resource->{'symb'},$part,
+ $ENV{'request.course.id'});
+ #
+ $show_part = 1 if ($part ne '0');
+ $part = ' ' if ($part == 0);
+ #
+ my $wrongpercent = 0;
+ if (defined($num) && $num > 0) {
+ $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
+ }
+ push (@Statsarray,
+ { 'sequence' => $sequence,
+ 'resource' => $resource,
+ 'Title' => $resource->{'title'},
+ 'Part' => $part,
+ '#Stdnts' => $num,
+ 'Tries' => $tries,
+ 'Mod' => $mod,
+ 'Mean' => $mean,
+ '#YES' => $Solved,
+ '#yes' => $solved,
+ '%Wrng' => $wrongpercent,
+ 'DoDiff' => $DegOfDiff,
+ 'S.D.' => $STD,
+ 'Skew' => $SKEW,
+ 'problem_num' => $problem_num,
+ });
+ }
+ }
+ }
+ #
+ # Table Headers
+ $r->print(''."\n");
+ my $Str = '';
+ foreach (@Header) {
+ next if ($_ eq 'Part' && !$show_part);
+ # Do not allow sorting on some fields
+ if ($_ eq $sortby || /^(Part|P\#)$/) {
+ $Str .= ''.$_.' | ';
+ } else {
+ $Str .= ''.
+ ''.
+ $_.' | ';
+ }
+ }
+ $r->print(''.$Str." \n");
+ #
+ # Sort the data
+ my @OutputOrder;
+ if ($sortby eq 'Container') {
+ @OutputOrder = @Statsarray;
} else {
- $r->print(' ');
+ # $sortby is already defined, so we can charge ahead
+ if ($sortby =~ /^(title|part)$/i) {
+ # Alpha comparison
+ @OutputOrder = sort {
+ lc($a->{$sortby}) cmp lc($b->{$sortby}) ||
+ lc($a->{'Title'}) cmp lc($b->{'Title'}) ||
+ lc($a->{'Part'}) cmp lc($b->{'Part'});
+ } @Statsarray;
+ } else {
+ # Numerical comparison
+ @OutputOrder = sort {
+ my $retvalue = 0;
+ if ($b->{$sortby} eq 'nan') {
+ if ($a->{$sortby} ne 'nan') {
+ $retvalue = -1;
+ } else {
+ $retvalue = 0;
+ }
+ }
+ if ($a->{$sortby} eq 'nan') {
+ if ($b->{$sortby} ne 'nan') {
+ $retvalue = 1;
+ }
+ }
+ if ($retvalue eq '0') {
+ $retvalue = $b->{$sortby} <=> $a->{$sortby} ||
+ lc($a->{'Title'}) <=> lc($b->{'Title'}) ||
+ lc($a->{'Part'}) <=> lc($b->{'Part'});
+ }
+ $retvalue;
+ } @Statsarray;
+ }
}
+ $option .= ',no part' if (! $show_part);
+ foreach my $row (@OutputOrder) {
+ $r->print('');
+ if (defined($option) && $option =~ /show probnum/) {
+ $r->print(''.$row->{'problem_num'}.' | ');
+ }
+ if ($show_container) {
+ $r->print(''
+ .$row->{'sequence'}->{'title'}.' | ');
+ }
+ $r->print(&statistics_html_table_data
+ ($row->{'resource'},$row->{'Part'},$row->{'#Stdnts'},
+ $row->{'Tries'},$row->{'Mod'},$row->{'Mean'},
+ $row->{'#YES'},$row->{'#yes'},$row->{"\%Wrng"},
+ $row->{'DoDiff'},$row->{'S.D.'},$row->{'Skew'},
+ $option));
- my $count = 1;
- foreach(@$orderedProblems) {
- my ($sequence,$problem,$part)=split(':', $_);
- if($cache->{'ProblemStatisticsMaps'} ne 'All Maps' &&
- $cache->{'ProblemStatisticsMaps'} ne $cache->{$sequence.':title'}) {
- next;
- }
-
- my $ref = ''.$cache->{$problem.':title'}.'';
-# my $ref = $cache->{$problem.':title'};
- my $title = $cache->{$problem.':title'};
- my $source = 'source';
- my $tableData = join('&', $ref, $title, $source,
- $cache->{$_.':studentCount'},
- $cache->{$_.':totalTries'},
- $cache->{$_.':maxTries'},
- sprintf("%.2f", $cache->{$_.':mean'}),
- $cache->{$_.':correct'},
- $cache->{$_.':correctByOverride'},
- sprintf("%.1f", $cache->{$_.':percentWrong'}),
- sprintf("%.2f", $cache->{$_.':degreeOfDifficulty'}),
- sprintf("%.1f", $cache->{$_.':standardDeviation'}),
- sprintf("%.1f", $cache->{$_.':skewness'}),
- sprintf("%.2f", $cache->{$_.':discriminationFactor1'}),
- sprintf("%.2f", $cache->{$_.':discriminationFactor2'}),
- 0); # 0 is for discussion, need to figure out
-
-#6666666
-# $r->print(' '.$out.'&'.$DoD);
-# print (OUT $out.'@'.$DoD.'&');
-#6666666
-
-#check with Gerd
-# $urlres=~/^(\w+)\/(\w+)/;
-# if ($StdNo) {
-# &Apache::lonnet::put('nohist_resevaldata',\%storestats,
-# $1,$2);
-# }
-#-------------------------------- Row of statistical table
- &TableRow($displayFormat,$tableData,$count,$r,$color);
- $count++;
- }
- if($cache->{'DisplayFormat'} ne 'Display CSV Format') {
- $r->print(' '."\n");
- }
- $r->print(' | ');
-#6666666
-# close( OUT );
-#666666
+ $r->print("\n");
+ }
+ $r->print(" \n");
+ $r->print(" |