--- loncom/interface/lonstatistics.pm 2006/05/30 12:46:09 1.136
+++ loncom/interface/lonstatistics.pm 2023/09/07 23:58:32 1.156.2.8.2.1
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstatistics.pm,v 1.136 2006/05/30 12:46:09 www Exp $
+# $Id: lonstatistics.pm,v 1.156.2.8.2.1 2023/09/07 23:58:32 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -28,19 +28,7 @@
#
###
-=pod
-
-=head1 NAME
-
-lonstatistics
-
-=head1 SYNOPSIS
-Main handler for statistics and chart.
-
-=over 4
-
-=cut
package Apache::lonstatistics;
@@ -76,36 +64,9 @@ use Apache::lonpercentage;
use Apache::lonstudentsubmissions();
use Apache::lonsurveyreports();
use Apache::longradinganalysis();
-use lib '/home/httpd/lib/perl/';
+use Apache::lonquickgrades();
use LONCAPA;
-#######################################################
-#######################################################
-
-=pod
-
-=item Package Variables
-
-=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 @Groups The groups available in the 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
-
-=over
-
-=cut
-
-#######################################################
-#######################################################
#
# Classlist variables
#
@@ -113,43 +74,7 @@ my $curr_student;
my $prev_student;
my $next_student;
-#######################################################
-#######################################################
-
-=pod
-
-=item &clear_classlist_variables()
-
-undef the following package variables:
-
-=over
-
-=item @FullClasslist
-
-=item @Students
-
-=item @Sections
-
-=item @Groups
-
-=item %StudentData
-
-=item @StudentDataOrder
-
-=item @SelectedStudentData
-
-=item $curr_student
-
-=item $prev_student
-
-=item $next_student
-
-=back
-
-=cut
-#######################################################
-#######################################################
sub clear_classlist_variables {
undef(@FullClasslist);
undef(@Students);
@@ -162,45 +87,7 @@ sub clear_classlist_variables {
undef($next_student);
}
-#######################################################
-#######################################################
-=pod
-
-=item &PrepareClasslist()
-
-Build up the classlist information. The classlist information is kept in
-the following package variables:
-
-=over
-
-=item @FullClasslist
-
-=item @Students
-
-=item @Sections
-
-=item @Groups
-
-=item %StudentData
-
-=item @SelectedStudentData
-
-=item $curr_student
-
-=item $prev_student
-
-=item $next_student
-
-=back
-
-$curr_student, $prev_student, and $next_student may not be defined, depending
-upon the calling context.
-
-=cut
-
-#######################################################
-#######################################################
sub PrepareClasslist {
my %Sections;
&clear_classlist_variables();
@@ -313,7 +200,11 @@ sub PrepareClasslist {
if ($env{'request.course.sec'} !~ /^\s*$/) {
@Sections = ($env{'request.course.sec'});
} else {
- @Sections = sort {$a cmp $b} keys(%Sections);
+ @Sections = sort {
+ if ($a == $a && $b == $b ) { return $a <=> $b; }
+ return $a cmp $b;
+ } keys(%Sections);
+
unshift(@Sections,'all'); # Put 'all' at the front of the list
}
# Sort the groups
@@ -371,19 +262,7 @@ sub PrepareClasslist {
return;
}
-#######################################################
-#######################################################
-
-=pod
-=item get_selected_sections
-
-Returns an array of the selected sections
-
-=cut
-
-#######################################################
-#######################################################
sub get_selected_sections {
my @selected_sections =
&Apache::loncommon::get_env_multiple('form.Section');
@@ -401,19 +280,7 @@ sub get_selected_sections {
return @selected_sections;
}
-#######################################################
-#######################################################
-
-=pod
-
-=item get_selected_groups
-
-Returns an array of the selected groups
-
-=cut
-
-#######################################################
-#######################################################
+
sub get_selected_groups {
my @selected_groups =
&Apache::loncommon::get_env_multiple('form.Group');
@@ -427,21 +294,8 @@ sub get_selected_groups {
return @selected_groups;
}
-=pod
-
-=item §ion_and_enrollment_description
-
-Returns a string describing the currently selected section(s), group(s) and
-enrollment status.
-Inputs: mode = 'plaintext' or 'localized' (defaults to 'localized')
- 'plaintext' is used for example in Excel spreadsheets.
-Returns: scalar description string.
-=cut
-
-#######################################################
-#######################################################
sub section_and_enrollment_description {
my ($mode) = @_;
if (! defined($mode)) { $mode = 'localized'; }
@@ -449,9 +303,9 @@ sub section_and_enrollment_description {
my @groups = &Apache::lonstatistics::get_selected_groups();
my $description;
if ($mode eq 'localized') {
- $description = &mt('Unable to determine section, groups and enrollment');
+ $description = &mt('Unable to determine section, groups and access status');
} elsif ($mode eq 'plaintext') {
- $description = 'Unable to determine section, groups and enrollment';
+ $description = 'Unable to determine section, groups and access status';
} else {
$description = 'Bad parameter passed to lonstatistics::section_and_enrollment_description';
&Apache::lonnet::logthis($description);
@@ -459,15 +313,15 @@ sub section_and_enrollment_description {
$description = §ion_or_group_text($mode,'section',@sections).
' '.§ion_or_group_text($mode,'group',@groups);
if ($mode eq 'localized') {
- $description .= &mt(' [_1] enrollment status.',$env{'form.Status'});
+ $description .= ' '.&mt($env{'form.Status'}.' access status.');
} elsif ($mode eq 'plaintext') {
- $description .= ' '.$env{'form.Status'}.' enrollment status.';
+ $description .= ' '.$env{'form.Status'}.' access status.';
}
return $description;
}
-#######################################################
-#######################################################
+
+
sub section_or_group_text {
my ($mode,$type,@items) = @_;
@@ -485,21 +339,21 @@ sub section_or_group_text {
);
if (scalar(@items) == 1 && $items[0] ne 'all') {
if ($mode eq 'localized') {
- $text = &mt('[_1] [_2].',$phrases{$type}{single},$items[0]);
+ $text = &mt($phrases{$type}{single}.' [_1].',$items[0]);
} elsif ($mode eq 'plaintext') {
$text = $phrases{$type}{single}.' '.$items[0].'.';
}
} elsif (scalar(@items) && $items[0] eq 'all') {
if ($mode eq 'localized') {
- $text = &mt('[_1].',$phrases{$type}{all});
+ $text = &mt($phrases{$type}{all}.'.');
} elsif ($mode eq 'plaintext') {
$text = $phrases{$type}{all}.'.';
}
} elsif (scalar(@items)) {
my $lastitem = pop(@items);
if ($mode eq 'localized') {
- $text = &mt('[_1] [_2] and [_3].',$phrases{$type}{plural},
+ $text = &mt($phrases{$type}{plural}.' [_1] and [_2].',
join(', ',@items),$lastitem);
} elsif ($mode eq 'plaintext') {
$text = $phrases{$type}{plural}.' '.join(', ',@items).' and '.
@@ -510,101 +364,33 @@ sub section_or_group_text {
}
-=pod
-
-=item get_students
-
-Returns a list of the selected students
-
-=cut
-
-#######################################################
-#######################################################
sub get_students {
if (! @Students) {
- &PrepareClasslist()
+ &PrepareClasslist();
}
return @Students;
}
-#######################################################
-#######################################################
-
-=pod
-
-=item ¤t_student()
-
-Returns a pointer to a hash containing data about the currently
-selected student.
-=cut
-#######################################################
-#######################################################
sub current_student {
return $curr_student;
}
-#######################################################
-#######################################################
-
-=pod
-
-=item &previous_student()
-
-Returns a pointer to a hash containing data about the student prior
-in the list of students. Or something.
-=cut
-#######################################################
-#######################################################
sub previous_student {
return $prev_student;
}
-#######################################################
-#######################################################
-
-=pod
-=item &next_student()
-Returns a pointer to a hash containing data about the next student
-to be viewed.
-
-=cut
-
-#######################################################
-#######################################################
sub next_student {
return $next_student;
}
-##############################################
-##############################################
-
-=pod
-
-=item &StudentDataSelect($elementname,$status,$numvisible,$selected)
-
-Returns html for a selection box allowing the user to choose one (or more)
-of the fields of student data available (fullname, username, id, section, etc)
-
-=over 4
-
-=item $elementname The name of the HTML form element
-
-=item $status 'multiple' or 'single' selection box
-=item $numvisible The number of options to be visible
-=back
-
-=cut
-
-##############################################
-##############################################
sub StudentDataSelect {
my ($elementname,$status,$numvisible)=@_;
if ($numvisible < 1) {
@@ -615,51 +401,37 @@ sub StudentDataSelect {
my $Str = "\n";
$Str .= ''."\n";
#
# Deal with 'all'
- $Str .= ' \n";
#
# Loop through the student data fields
foreach my $item (@StudentDataOrder) {
- $Str .= ' \n";
+ $Str .= '>'.&mt($item)." \n";
}
$Str .= " \n";
return $Str;
}
-#######################################################
-#######################################################
-
-=pod
-=item &get_selected_maps($elementname)
-Input: Name of the form element used to specify the maps.
-
-Returns: Array of symbs of selected maps or the description 'all'.
- If form.$elementname does not exist, 'all' is returned.
-
-=cut
-
-#######################################################
-#######################################################
sub get_selected_maps {
my ($elementname) = @_;
my @selected_maps =
@@ -675,25 +447,8 @@ sub get_selected_maps {
}
-#######################################################
-#######################################################
-
-=pod
-
-=item &selected_sequences_with_assessments
-
-Retrieve the sequences which were selected by the user to show.
-
-Input: $mode: scalar. Either 'selected' or 'all'. If not specified,
- 'selected' is used.
-
-Returns: an array containing a navmap object and navmap resources,
- or an array containing a scalar with an error message.
-=cut
-#######################################################
-#######################################################
sub selected_sequences_with_assessments {
my ($mode) = @_;
$mode = 'selected' if (! defined($mode));
@@ -704,9 +459,14 @@ sub selected_sequences_with_assessments
#
my @sequences = $navmap->retrieveResources(undef,
sub { shift->is_map(); },1,0,1);
+ my $toplevelseq = $navmap->getById('0.0');
+ if (!grep(/^\Q$toplevelseq\E$/,@sequences)) {
+ unshift(@sequences,$toplevelseq);
+ }
+
my @sequences_with_assessments;
- for my $sequence ($navmap->getById('0.0'), @sequences) {
- if ($navmap->hasResource($sequence,sub { shift->is_problem(); },0,1)){
+ foreach my $sequence (@sequences) {
+ if ($navmap->hasResource($sequence,sub { shift->is_gradable(); },0,1)){
push(@sequences_with_assessments,$sequence);
}
}
@@ -728,31 +488,7 @@ sub selected_sequences_with_assessments
return $navmap,@sequences_to_show;
}
-##############################################
-##############################################
-
-=pod
-
-=item &map_select($elementname,$status,$numvisible,$restriction)
-
-Returns html for a selection box allowing the user to choose one (or more)
-of the sequences in the course. The values of the sequences are the symbs.
-If the top sequence is selected, the value 'top' will result.
-
-=over 4
-
-=item $elementname The name of the HTML form element
-
-=item $status 'multiple' or 'single' selection box
-
-=item $numvisible The number of options to be visible
-
-=back
-
-=cut
-##############################################
-##############################################
sub map_select {
my ($elementname,$status,$numvisible)=@_;
if ($numvisible < 1) {
@@ -766,16 +502,16 @@ sub map_select {
my $form = "\n";
$form .= ''."\n";
#
# Put in option for 'all'
- $form .= ' '."\n";
#
# Loop through the sequences
my @sequences = &selected_sequences_with_assessments('all');
@@ -786,10 +522,10 @@ sub map_select {
$navmap = shift(@sequences);
}
foreach my $seq (@sequences){
- $form .= ' symb.'"';
foreach (@selected_maps) {
if ($seq->symb eq $_) {
- $form .= 'selected ';
+ $form .= ' selected="selected"';
last;
}
}
@@ -799,31 +535,7 @@ sub map_select {
return $form;
}
-##############################################
-##############################################
-=pod
-
-=item &SectionSelect($elementname,$status,$numvisible)
-
-Returns html for a selection box allowing the user to choose one (or more)
-of the sections in the course.
-
-Uses the package variables @Sections
-=over 4
-
-=item $elementname The name of the HTML form element
-
-=item $status 'multiple' or 'single' selection box
-
-=item $numvisible The number of options to be visible
-
-=back
-
-=cut
-
-##############################################
-##############################################
sub SectionSelect {
my ($elementname,$status,$numvisible)=@_;
if ($numvisible < 1) {
@@ -835,20 +547,25 @@ sub SectionSelect {
&PrepareClasslist()
}
#
+ # Make sure course's student table is up to date
+ if (@Sections) {
+ &Apache::loncoursedata::ensure_current_sections();
+ }
+ #
# Build the form element
my $Str = "\n";
$Str .= ''."\n";
#
# Loop through the sequences
foreach my $s (@Sections) {
- $Str .= ' '."\n";
#
# Loop through the groups
foreach my $s (@Groups) {
- $Str .= ' ';
$Str .= ''.&mt('Groups').' ';
- $Str .= ''.&mt('Enrollment Status').' ';
+ $Str .= ''.&mt('Access Status').' ';
$Str .= ''.$/;
$Str .= '';
$Str .= ''.
@@ -945,7 +646,7 @@ sub DisplayClasslist {
' ';
$Str .= ' '.$/;
- $Str .= '
';
+ $Str .= '';
$Str .= ' ';
$r->print($Str);
@@ -957,85 +658,92 @@ sub DisplayClasslist {
my @selected_sections = &get_selected_sections();
if (! @Students) {
if ($selected_sections[0] eq 'all') {
- if (lc($env{'form.Status'}) eq 'any') {
- $Str .= ''.
- &mt('There are no students in the course.').
- ' ';
- } elsif (lc($env{'form.Status'}) eq 'active') {
- $Str .= ''.
+ if (lc($env{'form.Status'}) eq 'active') {
+ $Str .= ' '.
&mt('There are no currently enrolled students in the course.').
- '';
+ '
';
} elsif (lc($env{'form.Status'}) eq 'expired') {
- $Str .= ''.
+ $Str .= ' '.
&mt('There are no previously enrolled students in the course.').
- '';
+ '
';
+ } elsif (lc($env{'form.Status'}) eq 'future') {
+ $Str .= ''.
+ &mt('There are no students with future access in the course.').
+ '
';
+ } else { # 'any' and any others
+ $Str .= ''.
+ &mt('There are no students in the course.').
+ '
';
}
} else {
- my $sections;
- if (lc($env{'form.Status'}) eq 'any') {
- $Str .= ''.
- &mt('There are no students in the selected sections.').
- ' ';
- } elsif (lc($env{'form.Status'}) eq 'active') {
- $Str .= ''.
+ if (lc($env{'form.Status'}) eq 'active') {
+ $Str .= ' '.
&mt('There are no currently enrolled students in the selected sections.').
- '';
+ '
';
} elsif (lc($env{'form.Status'}) eq 'expired') {
- $Str .= ''.
+ $Str .= ' '.
&mt('There are no previously enrolled students in the selected sections.').
- '';
+ '
';
+ } elsif (lc($env{'form.Status'}) eq 'future') {
+ $Str .= ''.
+ &mt('There are no students with future access in the selected sections.').
+ '
';
+ } else { # 'any' and any others
+ $Str .= ''.
+ &mt('There are no students in the selected sections.').
+ '
';
}
}
- $Str.= ''.
- &mt('Click here to return to the chart').' ';
+ $Str.= ''
+ .''
+ .&mt('Return to the chart').' '
+ .'
';
$r->print($Str);
$r->rflush();
return;
}
- # "Click" is asinine but it is probably not my place to change the world.
- $Str .= 'Click on a students name or username to view their chart ';
- $Str .= ''."\n";
- $Str .= ''."\n";
+ $Str .= ''.&mt('Select One Student').' '
+ .''.&mt("Click on a student's name or username to view their chart.").'
'
+ .&Apache::loncommon::start_data_table()
+ .&Apache::loncommon::start_data_table_header_row();
foreach my $field (@Fields) {
$Str .= ''.&mt($field).
' ';
}
- $Str .= ' '."\n";
+ $Str .= &Apache::loncommon::end_data_table_header_row();
#
- my $alternate = 0;
foreach my $student (@Students) { # @Students is a package variable
my $sname = $student->{'username'}.':'.$student->{'domain'};
- if($alternate) {
- $Str .= '';
- } else {
- $Str .= ' ';
- }
- $alternate = ($alternate + 1) % 2;
+ $Str .= &Apache::loncommon::start_data_table_row();
#
foreach my $field (@Fields) {
$Str .= '';
if ($field eq 'fullname' || $field eq 'username') {
$Str .= '';
- $Str .= $student->{$field}.' ';
+ $Str .= $student->{$field};
$Str .= ' ';
} elsif ($field eq 'status') {
$Str .= &mt($student->{$field});
} else {
- $Str .= $student->{$field};
+ if ($student->{$field} eq 'none') {
+ $Str .= &mt('none')
+ } else {
+ $Str .= $student->{$field};
+ }
}
$Str .= ' ';
}
- $Str .= " \n";
+ $Str .= &Apache::loncommon::end_data_table_row();
}
- $Str .= '
'."\n";
+ $Str .= &Apache::loncommon::end_data_table();
#
$r->print($Str);
$r->rflush();
@@ -1043,84 +751,65 @@ sub DisplayClasslist {
return;
}
-##############################################
-##############################################
+
+
sub CreateMainMenu {
#
# 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 reports of student submissions.'),
- },
- { internal_name => 'survey_reports',
- name => &mt('Survey Reports'),
- short_description =>
- &mt('Prepare reports on survey results.'),
- },
- { internal_name => 'correct_problems_plot',
- name => &mt('Correct Problems Plot'),
- short_description =>
- &mt('Display a histogram of student performance in the course.'),
- },
-# { internal_name => 'grading_analysis',
-# name => &mt('Detailed Grading Analysis'),
-# short_description =>
-# &mt('Display statistics about who graded who.'),
-# },
-# { 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',
- );
- #
- # 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;
+ my @reports = (
+ {categorytitle => 'Statistics and Analyses',
+ items => [
+ {url => '/adm/statistics?reportSelected=problem_statistics',
+ permission => 'F',
+ icon => 'document-open.png',
+ linktext => ('Overall Problem Statistics'),
+ linktitle => ('Student performance statistics on all problems.')},
+
+ {url => '/adm/statistics?reportSelected=problem_analysis',
+ permission => 'F',
+ icon => 'prob_ana.png',
+ linktext => ('Detailed Problem Analysis'),
+ linktitle => ('Detailed statistics and graphs of student performance on problems.')},
+ ]},
+ {categorytitle => 'Plots',
+ items => [
+ {url => '/adm/statistics?reportSelected=submissiontime_analysis',
+ permission => 'F',
+ icon => 'subtimpl.png',
+ linktext => ('Submission Time Plots'),
+ linktitle => ('Display and analysis of submission times on assessments.')},
+
+ {url => '/adm/statistics?reportSelected=correct_problems_plot',
+ permission => 'F',
+ icon => 'coprplot.png',
+ linktext => ('Correct Problems Plot'),
+ linktitle => ('Display a histogram of student performance in the course.')},
+ ]},
+ {categorytitle => 'Reports',
+ items => [
+ {url => '/adm/statistics?reportSelected=student_submission_reports',
+ permission => 'F',
+ icon => 'edit-copy.png',
+ linktext => ('Student Submission Reports'),
+ linktitle => ('Prepare reports of student submissions.')},
+
+ {url => '/adm/statistics?reportSelected=survey_reports',
+ permission => 'F',
+ icon => 'survey_rep.png',
+ linktext => ('Survey Reports'),
+ linktitle => ('Prepare reports on survey results.')},
+ ]});
+
+return &Apache::lonhtmlcommon::generate_menu(@reports);
+
}
-##############################################
-##############################################
+
+
sub handler {
my $r=shift;
my $c = $r->connection();
#
- # Check for overloading
- 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; }
- #
# Check for access
if (! &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
$env{'user.error.msg'}=
@@ -1143,6 +832,8 @@ sub handler {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['sort','reportSelected',
'SelectedStudent']);
+ my $GoToPage = $env{'form.reportSelected'};
+
#
# Give the LON-CAPA page header
my $style = <
ENDSTYLE
+
+ my $head_extra = $style;
+ if (($env{'form.reportSelected'} eq 'student_submission_reports') &&
+ ($env{'form.renderprob'})) {
+ my @Symbs = &Apache::lonstathelpers::get_selected_symbs('problemchoice');
+ if (scalar(@Symbs) == 1) {
+ $head_extra .= &Apache::loncommon::css_links($Symbs[0]);
+ }
+ } elsif ($env{'form.reportSelected'} eq 'submissiontime_analysis') {
+ my ($navmap,$current_problem) =
+ &Apache::lonsubmissiontimeanalysis::get_current_problem();
+ if (ref($current_problem) eq 'HASH') {
+ my $symb = $current_problem->{'symb'};
+ if ($symb) {
+ $head_extra .= &Apache::loncommon::css_links($symb);
+ }
+ }
+ } elsif (($env{'form.reportSelected'} eq 'problem_analysis') &&
+ ($env{'form.show_prob'})) {
+ my $problem_types = &Apache::lonproblemanalysis::analyzable_types();
+ my ($navmap,$current_problem) =
+ &Apache::lonproblemanalysis::get_current_problem($problem_types);
+ if (ref($current_problem) eq 'HASH') {
+ my $symb = $current_problem->{'symb'};
+ my $res = $current_problem->{'resource'};
+ if ($symb) {
+ $head_extra .= &Apache::loncommon::css_links($symb);
+ }
+ }
+ }
$r->print(&Apache::loncommon::start_page('Course Statistics and Charts',
- $style));
+ $head_extra));
$r->rflush();
#
# Either print out a menu for them or send them to a report
@@ -1165,23 +886,23 @@ ENDSTYLE
text =>'Statistics',
faq=>139,
bug=>'Statistics and Charts'});
- if (! exists($env{'form.reportSelected'}) ||
- $env{'form.reportSelected'} eq '') {
+ if ($GoToPage eq '') {
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Statistics Main Page').
&CreateMainMenu());
} else {
#
if (! &Apache::lonmysql::verify_sql_connection()) {
my $serveradmin = $r->dir_config('lonAdmEMail');
- $r->print(''.
+ $r->print(''.
&mt('Unable to connect to database!').
- '
');
- $r->print(''.
- &mt('Please notify the server administrator ').
- ''.$serveradmin.'
');
+ '');
+ $r->print(''
+ .&mt('Please notify the server administrator [_1]',
+ ,''.$serveradmin.' ')
+ .'
');
$r->print(''.
&mt('Course Statistics and Charts cannot be '.
- 'retrieved until the database is restarted. '.
+ 'retrieved until the database is restarted. '.
'Your data is intact but cannot be displayed '.
'at this time.').'
');
$r->print(&Apache::loncommon::end_page());
@@ -1190,18 +911,18 @@ ENDSTYLE
#
# Clean out the caches
if (exists($env{'form.ClearCache'})) {
- &Apache::loncoursedata::delete_caches($env{'requres.course.id'});
+ &Apache::loncoursedata::delete_caches($env{'request.course.id'});
}
#
# Begin form output
$r->print('