--- loncom/interface/lonstatistics.pm 2003/10/03 15:40:47 1.78.2.2
+++ loncom/interface/lonstatistics.pm 2004/02/20 16:38:49 1.99
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstatistics.pm,v 1.78.2.2 2003/10/03 15:40:47 albertel Exp $
+# $Id: lonstatistics.pm,v 1.99 2004/02/20 16:38:49 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -38,20 +38,6 @@ lonstatistics
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 Apache::lonmysql;
=over 4
=cut
@@ -71,19 +57,26 @@ use vars qw(
$top_map
@Sequences
@SelectedMaps
- @Assessments);
+ @Assessments
+ $enrollment_status);
use Apache::lonnet();
use Apache::lonhomework;
use Apache::loncommon;
use Apache::loncoursedata;
use Apache::lonhtmlcommon;
+use Apache::lonmysql;
+use Apache::lonlocal;
+use Time::HiRes;
+#
+# Statistics Packages
use Apache::lonproblemanalysis();
+use Apache::lonsubmissiontimeanalysis();
+use Apache::loncorrectproblemplot();
use Apache::lonproblemstatistics();
use Apache::lonstudentassessment();
use Apache::lonpercentage;
-use Apache::lonmysql;
-use Time::HiRes;
+use Apache::lonstudentsubmissions();
#######################################################
#######################################################
@@ -244,8 +237,8 @@ sub PrepareClasslist {
}
#
# get the status requested
- my $requested_status = 'Active';
- $requested_status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));
+ $enrollment_status = 'Active';
+ $enrollment_status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));
#
# Process the classlist
while (my ($student,$student_data) = each (%$classlist)) {
@@ -275,8 +268,8 @@ sub PrepareClasslist {
foreach my $sect (@SelectedSections) {
if ( (($sect eq 'all') ||
($section eq $sect)) &&
- (($studenthash->{'status'} eq $requested_status) ||
- ($requested_status eq 'Any'))
+ (($studenthash->{'status'} eq $enrollment_status) ||
+ ($enrollment_status eq 'Any'))
){
push (@Students,$studenthash);
last;
@@ -513,20 +506,6 @@ sub PrepareCourseData {
$top_map = $top if (ref($top));
@Sequences = @{$sequences} if (ref($sequences) eq 'ARRAY');
@Assessments = @{$assessments} if (ref($assessments) eq 'ARRAY');
- #
- # Compute column widths
- foreach my $seq (@Sequences) {
- my $name_length = length($seq->{'title'});
- my $num_parts = $seq->{'num_assess_parts'};
- #
- # Use 3 digits for each the sum and total, which means 7 total...
- my $num_col = $num_parts+7;
- if ($num_col < $name_length) {
- $num_col = $name_length;
- }
- $seq->{'base_width'} = $name_length;
- $seq->{'width'} = $num_col;
- }
return;
}
@@ -797,6 +776,150 @@ sub SectionSelect {
return $Str;
}
+#######################################################
+#######################################################
+
+=pod
+
+=item &CreateAndParseOutputSelector()
+
+Construct a selection list of options for output and parse output selections.
+
+=cut
+
+#######################################################
+#######################################################
+sub OutputDescriptions {
+ my (@OutputOptions) = @_;
+ my $Str = '';
+ $Str .= "
Output Modes
\n";
+ $Str .= "\n";
+ foreach my $outputmode (@OutputOptions) {
+ $Str .=" - ".$outputmode->{'name'}."
\n";
+ $Str .=" - ".$outputmode->{'description'}."
\n";
+ }
+ $Str .= "
\n";
+ return $Str;
+}
+
+sub CreateAndParseOutputSelector {
+ my ($elementname,$default,@OutputOptions) = @_;
+ my $output_mode;
+ my $show;
+ my $Str = '';
+ #
+ # Format for output options is 'mode, restrictions';
+ my $selected = $default;
+ if (exists($ENV{'form.'.$elementname})) {
+ if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {
+ $selected = $ENV{'form.'.$elementname}->[0];
+ } else {
+ $selected = $ENV{'form.'.$elementname};
+ }
+ }
+ #
+ # Set package variables describing output mode
+ $output_mode = 'html';
+ $show = 'all';
+ foreach my $option (@OutputOptions) {
+ next if ($option->{'value'} ne $selected);
+ $output_mode = $option->{'mode'};
+ $show = $option->{'show'};
+ }
+ #
+ # Build the form element
+ $Str = qq/";
+ return ($Str,$output_mode,$show);
+}
+
+###############################################
+###############################################
+
+=pod
+
+=item &Gather_Student_Data()
+
+Ensures all student data is up to date.
+
+=cut
+
+###############################################
+###############################################
+sub Gather_Student_Data {
+ my ($r) = @_;
+ my $c = $r->connection();
+ #
+ &Apache::loncoursedata::clear_internal_caches();
+ #
+ my @Sequences = &Apache::lonstatistics::Sequences_with_Assess();
+ #
+ my @Students = @Apache::lonstatistics::Students;
+ #
+ # Open the progress window
+ my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,'Statistics Compilation Status',
+ 'Statistics Compilation Progress', scalar(@Students));
+ #
+ while (my $student = shift @Students) {
+ return if ($c->aborted());
+ my ($status,undef) = &Apache::loncoursedata::ensure_current_data
+ ($student->{'username'},$student->{'domain'},
+ $ENV{'request.course.id'});
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
+ &mt('last student'));
+ }
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ $r->rflush();
+}
+
+###############################################
+###############################################
+
+=pod
+
+=item &Gather_Full_Student_Data()
+
+Ensures all student data is up to date.
+
+=cut
+
+###############################################
+###############################################
+sub Gather_Full_Student_Data {
+ my ($r) = @_;
+ my $c = $r->connection();
+ #
+ &Apache::loncoursedata::clear_internal_caches();
+ #
+ my @Students = @Apache::lonstatistics::Students;
+ #
+ # Open the progress window
+ my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,&mt('Student Data Compilation Status'),
+ &mt('Student Data Compilation Progress'), scalar(@Students));
+ #
+ while (my $student = shift @Students) {
+ return if ($c->aborted());
+ my ($status,undef) = &Apache::loncoursedata::ensure_current_full_data
+ ($student->{'username'},$student->{'domain'},
+ $ENV{'request.course.id'});
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
+ &mt('last student'));
+ }
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ $r->rflush();
+}
+
##################################################
##################################################
sub DisplayClasslist {
@@ -891,31 +1014,53 @@ sub DisplayClasslist {
##############################################
##############################################
sub CreateMainMenu {
- my ($status,$reports,$current)=@_;
#
- my $Str = '';
+ # Define menu data
+ my @reports = ({ internal_name => 'problem_statistics',
+ name => &mt('Overall Problem Statistics'),
+ short_description =>
+ &mt('Student performance statistics on all problems.'),
+ },
+ { internal_name => 'problem_analysis',
+ name => &mt('Detailed Problem Analysis'),
+ short_description =>
+ &mt('Detailed statistics and graphs of student performance on problems.'),
+ },
+ { internal_name => 'submissiontime_analysis',
+ name => &mt('Submission Time Plots'),
+ short_description =>
+ &mt('Display and analysis of submission times on assessments.'),
+ },
+ { internal_name => 'student_submission_reports',
+ name => &mt('Student Submission Reports'),
+ short_description =>
+ &mt('Prepare Excel spreadsheets of student submissions.'),
+ },
+ { internal_name => 'correct_problems_plot',
+ name => &mt('Correct Problems Plot'),
+ short_description =>
+ &mt('Display a histogram of student performance in the course.'),
+ },
+# { internal_name => 'student_assessment',
+# name => &mt('Problem Status Chart'),
+# short_description =>
+# &mt('Brief view of each students performance in course.'),
+# },
+ # 'percentage' => 'Correct-problems Plot',
+ # 'activitylog' => 'Activity Log',
+ );
#
- $Str = '';
-# $Str .= ''."\n";
-# $Str .= '
'."\n";
+ # Create the menu
+ my $Str;
+ $Str .= ''.&mt('Please select a report to generate').'
';
+ foreach my $reportdata (@reports) {
+ $Str .=' \n";
+ $Str .= ' '.(' 'x8).$reportdata->{'short_description'}.
+ "\n";
+ }
+ $Str .="\n";
#
return $Str;
}
@@ -926,10 +1071,6 @@ sub handler {
my $r=shift;
my $c = $r->connection();
#
- &Apache::loncoursedata::clear_internal_caches();
- #
- &Apache::loncoursedata::clear_internal_caches();
- #
# Check for overloading
my $loaderror=&Apache::lonnet::overloaderror($r);
if ($loaderror) { return $loaderror; }
@@ -950,91 +1091,117 @@ sub handler {
}
}
#
- # Set document type for header only
- if($r->header_only) {
- if ($ENV{'browser.mathml'}) {
- $r->content_type('text/xml');
- } else {
- $r->content_type('text/html');
- }
- &Apache::loncommon::no_cache($r);
- $r->send_http_header;
- return OK;
- }
- #
# Send the header
- $r->content_type('text/html');
+ &Apache::loncommon::no_cache($r);
+ &Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
+ if ($r->header_only) { return OK; }
#
# Extract form elements from query string
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['sort','reportSelected',
'SelectedStudent']);
- if (! exists($ENV{'form.reportSelected'})) {
- $ENV{'form.reportSelected'} = 'student_assessment';
- }
#
# Give the LON-CAPA page header
- $r->print(&Apache::lonhtmlcommon::Title('Course Statistics and Charts'));
- $r->rflush();
- #
- if (! &Apache::lonmysql::verify_sql_connection()) {
- my $serveradmin = $r->dir_config('lonAdmEMail');
- $r->print(<Unable to connect to database!
-
-Please notify the server administrator $serveradmin.
-
-Course Statistics and Charts cannot be retrieved until the database is
-restarted. Your data is intact but cannot be displayed at this time.
-
-