--- loncom/interface/lonstatistics.pm 2002/08/01 20:49:06 1.38 +++ loncom/interface/lonstatistics.pm 2002/11/18 20:39:46 1.54 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonstatistics.pm,v 1.38 2002/08/01 20:49:06 stredwic Exp $ +# $Id: lonstatistics.pm,v 1.54 2002/11/18 20:39:46 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,7 +47,7 @@ use Apache::lonhtmlcommon; use Apache::lonproblemanalysis; use Apache::lonproblemstatistics; use Apache::lonstudentassessment; -use Apache::lonchart; +use Apache::lonpercentage; use HTML::TokeParser; use GDBM_File; @@ -72,7 +72,8 @@ sub ProcessFormData{ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sort','download', 'reportSelected', - 'StudentAssessmentStudent']); + 'StudentAssessmentStudent', + 'ProblemStatisticsSort']); &CheckFormElement($cache, 'Status', 'Status', 'Active'); &CheckFormElement($cache, 'postdata', 'reportSelected', 'Class list'); &CheckFormElement($cache, 'reportSelected', 'reportSelected', @@ -82,6 +83,20 @@ sub ProcessFormData{ &CheckFormElement($cache, 'DownloadAll', 'DownloadAll', 'false'); &CheckFormElement($cache, 'sort', 'sort', 'fullname'); &CheckFormElement($cache, 'download', 'download', 'false'); + &CheckFormElement($cache, 'StatisticsMaps', + 'StatisticsMaps', 'All Maps'); + &CheckFormElement($cache, 'StatisticsProblemSelect', + 'StatisticsProblemSelect', 'All Problems'); + &CheckFormElement($cache, 'StatisticsPartSelect', + 'StatisticsPartSelect', 'All Parts'); + if(defined($ENV{'form.Section'})) { + my @sectionsSelected = (ref($ENV{'form.Section'}) ? + @{$ENV{'form.Section'}} : + ($ENV{'form.Section'})); + $cache->{'sectionsSelected'} = join(':', @sectionsSelected); + } elsif(!defined($cache->{'sectionsSelected'})) { + $cache->{'sectionsSelected'} = $cache->{'sectionList'}; + } # student assessment if(defined($ENV{'form.CreateStudentAssessment'}) || @@ -102,15 +117,6 @@ sub ProcessFormData{ &Apache::lonnet::unescape($cache->{'StudentAssessmentStudent'}); &CheckFormElement($cache, 'DefaultColumns', 'DefaultColumns', 'false'); - if(defined($ENV{'form.Section'})) { - my @sectionsSelected = (ref($ENV{'form.Section'}) ? - @{$ENV{'form.Section'}} : - ($ENV{'form.Section'})); - $cache->{'sectionsSelected'} = join(':', @sectionsSelected); - } elsif(!defined($cache->{'sectionsSelected'})) { - $cache->{'sectionsSelected'} = $cache->{'sectionList'}; - } - # Problem analysis &CheckFormElement($cache, 'Interval', 'Interval', '1'); @@ -119,8 +125,12 @@ sub ProcessFormData{ 'DisplayFormat', 'Display Table Format'); &CheckFormElement($cache, 'ProblemStatisticsAscend', 'ProblemStatisticsAscend', 'Ascending'); - &CheckFormElement($cache, 'ProblemStatisticsMaps', - 'ProblemStatisticsMaps', 'All Maps'); + &CheckFormElement($cache, 'ProblemStatisticsSort', + 'ProblemStatisticsSort', 'Homework Sets Order'); + &CheckFormElement($cache, 'DisplayLegend', 'DisplayLegend', + 'Hide Legend'); + &CheckFormElement($cache, 'SortProblems', 'SortProblems', + 'Sort Within Sequence'); # Search only form elements my @headingColumns=(); @@ -235,9 +245,11 @@ sub SortStudents { my $sortBy = ''; if(defined($cache->{'sort'})) { $sortBy = ':'.$cache->{'sort'}; + } else { + $sortBy = ':fullname'; } - my @order = sort { $cache->{$a.$sortBy} cmp $cache->{$b.$sortBy} || - $cache->{$a.':fullname'} cmp $cache->{$b.':fullname'} } + my @order = sort { lc($cache->{$a.$sortBy}) cmp lc($cache->{$b.$sortBy}) || + lc($cache->{$a.':fullname'}) cmp lc($cache->{$b.':fullname'}) } @sorted1Students; return \@order; @@ -314,14 +326,14 @@ sub PrepareData { return "Unable to tie hash to db file."; } - if(!$isCached) { +# if(!$isCached) { my $processTopResourceMapReturn= - &Apache::loncoursedata::ProcessTopResourceMap(\%cache, $c, $r); + &Apache::loncoursedata::ProcessTopResourceMap(\%cache, $c); if($processTopResourceMapReturn ne 'OK') { untie(%cache); return $processTopResourceMapReturn; } - } + # } if($c->aborted()) { untie(%cache); @@ -355,85 +367,45 @@ sub PrepareData { &SpaceColumns($students, $studentInformation, $headings, \%cache); $cache{'updateTime:columnWidth'}=24; - if($cache{'download'} ne 'false') { - my $who = $cache{'download'}; - my $courseData = - &Apache::loncoursedata::DownloadCourseInformation( - $who, $courseID, - $cache{$who.':lastDownloadTime'}); - &Apache::loncoursedata::ProcessStudentData(\%cache, $courseData, $who); + my $download = $cache{'download'}; + my $downloadAll = $cache{'DownloadAll'}; + my @allStudents=(); + if($download ne 'false') { $cache{'download'} = 'false'; - } elsif($cache{'DownloadAll'} ne 'false') { - my @allStudents; - if($cache{'DownloadAll'} eq 'sorted') { + } elsif($downloadAll ne 'false') { + $cache{'DownloadAll'} = 'false'; + if($downloadAll eq 'sorted') { @allStudents = @$students; } else { @allStudents = split(':::', $cache{'NamesOfStudents'}); } - foreach (@allStudents) { - my $courseData = - &Apache::loncoursedata::DownloadCourseInformation( - $_, $courseID, - $cache{$_.':lastDownloadTime'}); - &Apache::loncoursedata::ProcessStudentData(\%cache, $courseData, - $_); - if($c->aborted()) { - untie(%cache); - return 'aborted'; - } - } - $cache{'DownloadAll'} = 'false'; - } - - if($c->aborted()) { - untie(%cache); - return 'aborted'; } untie(%cache); - return ('OK', $students); -} - - -# Create progress -sub Create_PrgWin { - my ($r)=@_; - $r->print(< - popwin=open('','popwin','width=400,height=100'); - popwin.document.writeln(''+ - 'LON-CAPA Statistics'+ - '

Computation Progress

'+ - '
'+ - '
'+ - ''); - popwin.document.close(); - -ENDPOP - - $r->rflush(); -} - -# update progress -sub Update_PrgWin { - my ($totalStudents,$index,$name,$r)=@_; - $r->print(''); - $r->rflush(); -} + if($download ne 'false') { + my @who = ($download); + if(&Apache::loncoursedata::DownloadStudentCourseData(\@who, 'false', + $cacheDB, 'true', + 'false', $courseID, + $r, $c) ne 'OK') { + return 'Stop at download individual'; + } + } elsif($downloadAll ne 'false') { + if(&Apache::loncoursedata::DownloadStudentCourseData(\@allStudents, + 'false', + $cacheDB, 'true', + 'true', $courseID, + $r, $c) ne 'OK') { + return 'Stop at download all'; + } + } -# close Progress Line -sub Close_PrgWin { - my ($r)=@_; - $r->print(''); - $r->rflush(); + return ('OK', $students); } - sub BuildClasslist { - my ($cacheDB,$students,$studentInformation,$headings)=@_; + my ($cacheDB,$students,$studentInformation,$headings,$r)=@_; my %cache; unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { @@ -446,9 +418,11 @@ sub BuildClasslist { my $displayString = 'DISPLAYDATA '."\n"; - $Str .= &Apache::lonhtmlcommon::CreateHeadings(\%cache, $studentInformation, + $Str .= &Apache::lonhtmlcommon::CreateHeadings(\%cache, + $studentInformation, $headings, $displayString); $Str .= ''."\n"; + my $alternate=0; foreach (@$students) { my ($username, $domain) = split(':', $_); @@ -483,10 +457,12 @@ sub BuildClasslist { $Str .= ''."\n"; $Str .= ''."\n"; + $r->print($Str); + $r->rflush(); untie(%cache); - return $Str; + return; } sub CreateMainMenu { @@ -535,11 +511,13 @@ sub BuildStatistics { 'updateTime'); my @headings=('Full Name', 'Section', 'PID', 'Domain', 'User Name', 'Last Updated'); - my $spacing = ' '; + my $spacing = ' '; + my %reports = ('classlist' => 'Class list', 'problem_statistics' => 'Problem Statistics', 'student_assessment' => 'Student Assessment', - 'activitylog' => 'Activity Log', + 'percentage' => 'Percentage Graphs', +# 'activitylog' => 'Activity Log', 'reportSelected' => 'Class list'); my %cache; @@ -547,13 +525,21 @@ sub BuildStatistics { my $cacheDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". "_$ENV{'user.domain'}_$courseID\_statistics.db"; + $r->print(&Apache::lonhtmlcommon::Title('Course Statistics and Charts')); + my ($returnValue, $students) = &PrepareData($c, $cacheDB, \@studentInformation, \@headings,$r); if($returnValue ne 'OK') { - $r->print(''.$returnValue."\n".''); + $r->print($returnValue."\n".''); return OK; } + if(!$c->aborted()) { + &Apache::loncoursedata::CheckForResidualDownload($cacheDB, + 'true', 'true', + $courseID, + $r, $c); + } my $GoToPage; if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) { @@ -566,13 +552,13 @@ sub BuildStatistics { } if(defined($cache{'OptionResponses'})) { - $reports{'problem_analysis'} = 'Problem Analysis'; + $reports{'problem_analysis'} = 'Option Response Analysis'; } - $r->print(&Apache::lonhtmlcommon::Title('LON-CAPA Statistics')); $r->print('
print('method="post" action="/adm/statistics">'); $r->print(&CreateMainMenu($cache{'Status'}, \%reports)); + $r->rflush(); untie(%cache); } else { $r->print('Unable to tie database.'); @@ -586,30 +572,33 @@ sub BuildStatistics { $students, $courseID, $c,$r); - } elsif($GoToPage eq 'Problem Analysis') { - $r->print( - &Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB)); + } elsif($GoToPage eq 'Option Response Analysis') { + &Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB, $r); } elsif($GoToPage eq 'Student Assessment') { - $r->print( - &Apache::lonstudentassessment::BuildStudentAssessmentPage($cacheDB, + &Apache::lonstudentassessment::BuildStudentAssessmentPage($cacheDB, $students, $courseID, 'Statistics', \@headings, $spacing, \@studentInformation, - $r, $c)); + $r, $c); } elsif($GoToPage eq 'Analyze') { - $r->print(&Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, - $students, - $courseID,$r)); - } elsif($GoToPage eq 'DoDiffGraph') { - &Apache::lonproblemstatistics::BuildDiffGraph($r); - } elsif($GoToPage eq 'PercentWrongGraph') { - &Apache::lonproblemstatistics::BuildWrongGraph($r); + &Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, $students, + $courseID, $r); + } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') { + my $courseDescription = $ENV{'course.'.$courseID.'.description'}; + $courseDescription =~ s/\ /"_"/eg; + &Apache::lonproblemstatistics::BuildGraphicChart($GoToPage, $cacheDB, + $courseDescription, + $students, $courseID, + $r, $c); } elsif($GoToPage eq 'Class list') { - $r->print(&BuildClasslist($cacheDB, $students, \@studentInformation, - \@headings)); + &BuildClasslist($cacheDB, $students, \@studentInformation, + \@headings, $r); + } elsif($GoToPage eq 'Percentage Graphs') { + &Apache::lonpercentage::BuildPercentageGraph($cacheDB, $students, + $courseID, $c, $r); } $r->print('
'."\n"); @@ -626,6 +615,13 @@ sub handler { # $jr = $r; + my $loaderror=&Apache::lonnet::overloaderror($r); + if ($loaderror) { return $loaderror; } + $loaderror= + &Apache::lonnet::overloaderror($r, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + if ($loaderror) { return $loaderror; } + unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { $ENV{'user.error.msg'}= $r->uri.":vgr:0:0:Cannot view grades for complete course";