version 1.30, 2002/07/24 14:52:32
|
version 1.37, 2002/07/30 21:31:48
|
Line 31
|
Line 31
|
# 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei |
# 11/1,11/4,11/16,12/14,12/16,12/18,12/20,12/31 Behrouz Minaei |
# YEAR=2002 |
# YEAR=2002 |
# 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei |
# 1/22,2/1,2/6,2/25,3/2,3/6,3/17,3/21,3/22,3/26,4/7,5/6 Behrouz Minaei |
# 5/12,5/14,5/15,5/19,5/26,7/16 Behrouz Minaei |
# 5/12,5/14,5/15,5/19,5/26,7/16,25/7,29/7 Behrouz Minaei |
# |
# |
### |
### |
|
|
Line 51 use Apache::lonchart;
|
Line 51 use Apache::lonchart;
|
use HTML::TokeParser; |
use HTML::TokeParser; |
use GDBM_File; |
use GDBM_File; |
|
|
my $r; |
|
my %color; |
|
|
|
sub CheckFormElement { |
sub CheckFormElement { |
my ($cache, $ENVName, $cacheName, $default)=@_; |
my ($cache, $ENVName, $cacheName, $default)=@_; |
Line 72 sub ProcessFormData{
|
Line 70 sub ProcessFormData{
|
$cache->{'reportKey'} = 'false'; |
$cache->{'reportKey'} = 'false'; |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['sort','download','reportSelected', |
['sort','download', |
|
'reportSelected', |
'StudentAssessmentStudent']); |
'StudentAssessmentStudent']); |
&CheckFormElement($cache, 'Status', 'Status', 'Active'); |
&CheckFormElement($cache, 'Status', 'Status', 'Active'); |
&CheckFormElement($cache, 'postdata', 'reportSelected', 'Class list'); |
&CheckFormElement($cache, 'postdata', 'reportSelected', 'Class list'); |
Line 96 sub ProcessFormData{
|
Line 95 sub ProcessFormData{
|
} else { |
} else { |
$cache->{'StudentAssessmentMove'} = 'selected'; |
$cache->{'StudentAssessmentMove'} = 'selected'; |
} |
} |
&CheckFormElement($cache, 'StudentAssessmentMap', 'StudentAssessmentMap', |
|
'All Maps'); |
|
&CheckFormElement($cache, 'StudentAssessmentStudent', |
&CheckFormElement($cache, 'StudentAssessmentStudent', |
'StudentAssessmentStudent', 'All Students'); |
'StudentAssessmentStudent', 'All Students'); |
$cache->{'StudentAssessmentStudent'} = |
$cache->{'StudentAssessmentStudent'} = |
&Apache::lonnet::unescape($cache->{'StudentAssessmentStudent'}); |
&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'}; |
|
} |
|
|
|
my @headingColumns=(); |
|
my @sequenceColumns=(); |
|
my $foundColumn = 0; |
|
if(defined($ENV{'form.ReselectColumns'})) { |
|
my @reselected = (ref($ENV{'form.ReselectColumns'}) ? |
|
@{$ENV{'form.ReselectColumns'}} |
|
: ($ENV{'form.ReselectColumns'})); |
|
foreach (@reselected) { |
|
if(/HeadingColumn/) { |
|
push(@headingColumns, $_); |
|
$foundColumn = 1; |
|
} elsif(/SequenceColumn/) { |
|
push(@sequenceColumns, $_); |
|
$foundColumn = 1; |
|
} |
|
} |
|
} |
|
|
|
$cache->{'reportKey'} = 'false'; |
|
if($cache->{'reportSelected'} eq 'Analyze') { |
|
$cache->{'reportKey'} = 'Analyze'; |
|
} |
|
|
foreach (keys(%ENV)) { |
foreach (keys(%ENV)) { |
if(/form\.Analyze:::/) { |
if(/form\.Analyze/) { |
# $cache->{'reportSelected'} = 'Analyze'; |
$cache->{'reportSelected'} = 'Analyze'; |
# $cache->{'reportKey'} = 'Problem Analysis'; |
$cache->{'reportKey'} = 'Analyze'; |
my ($uri, $title, $part, $problem); |
my $data; |
(undef, $uri, $title, $part, $problem)=split(':::', $_); |
(undef, $data)=split(':::', $_); |
$cache->{'AnalyzeURI'} = $uri; |
$cache->{'AnalyzeInfo'}=$data; |
$cache->{'AnalyzeTitle'} = $title; |
|
$cache->{'AnalyzePart'} = $part; |
|
$cache->{'AnalyzeProblem'} = $problem; |
|
|
|
&CheckFormElement($cache, 'Interval', 'Interval', '1'); |
&CheckFormElement($cache, 'Interval', 'Interval', '1'); |
|
} elsif(/form\.HeadingColumn/) { |
|
my $value = $_; |
|
$value =~ s/form\.//; |
|
push(@headingColumns, $value); |
|
$foundColumn=1; |
|
} elsif(/form\.SequenceColumn/) { |
|
my $value = $_; |
|
$value =~ s/form\.//; |
|
push(@sequenceColumns, $value); |
|
$foundColumn=1; |
} |
} |
} |
} |
|
|
|
if($foundColumn) { |
|
$cache->{'HeadingsFound'} = join(':', @headingColumns); |
|
$cache->{'SequencesFound'} = join(':', @sequenceColumns);; |
|
} |
|
if(!defined($cache->{'HeadingsFound'}) || |
|
$cache->{'DefaultColumns'} ne 'false') { |
|
$cache->{'HeadingsFound'}='HeadingColumnFull Name'; |
|
} |
|
if(!defined($cache->{'SequencesFound'}) || |
|
$cache->{'DefaultColumns'} ne 'false') { |
|
$cache->{'SequencesFound'}='All Sequences'; |
|
} |
|
$cache->{'DefaultColumns'} = 'false'; |
|
|
return; |
return; |
|
|
# Select page to display |
# Select page to display |
Line 197 sub SortStudents {
|
Line 248 sub SortStudents {
|
return \@order; |
return \@order; |
} |
} |
|
|
|
=pod |
|
|
|
=item &SpaceColumns() |
|
|
|
Determines the width of all the columns in the chart. It is based on |
|
the max of the data for that column and its header. |
|
|
|
=over 4 |
|
|
|
Input: $students, $studentInformation, $headings, $ChartDB |
|
|
|
$students: An array pointer to a list of students (username:domain) |
|
|
|
$studentInformatin: The type of data for the student information. It is |
|
used as part of the key in $CacheData. |
|
|
|
$headings: The name of the student information columns. |
|
|
|
$ChartDB: The name of the cache database which is opened for read/write. |
|
|
|
Output: None - All data stored in cache. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub SpaceColumns { |
|
my ($students,$studentInformation,$headings,$cache)=@_; |
|
|
|
# Initialize Lengths |
|
for(my $index=0; $index<(scalar @$headings); $index++) { |
|
my @titleLength=split(//,$headings->[$index]); |
|
$cache->{$studentInformation->[$index].':columnWidth'}= |
|
scalar @titleLength; |
|
} |
|
|
|
foreach my $name (@$students) { |
|
foreach (@$studentInformation) { |
|
my @dataLength=split(//,$cache->{$name.':'.$_}); |
|
my $length=(scalar @dataLength); |
|
if($length > $cache->{$_.':columnWidth'}) { |
|
$cache->{$_.':columnWidth'}=$length; |
|
} |
|
} |
|
} |
|
|
|
return; |
|
} |
|
|
sub PrepareData { |
sub PrepareData { |
my ($c, $cacheDB)=@_; |
my ($c, $cacheDB, $studentInformation, $headings)=@_; |
|
|
# Test for access to the cache data |
# Test for access to the cache data |
my $courseID=$ENV{'request.course.id'}; |
my $courseID=$ENV{'request.course.id'}; |
Line 257 sub PrepareData {
|
Line 357 sub PrepareData {
|
|
|
&ProcessFormData(\%cache); |
&ProcessFormData(\%cache); |
my $students = &SortStudents(\%cache); |
my $students = &SortStudents(\%cache); |
|
&SpaceColumns($students, $studentInformation, $headings, \%cache); |
|
$cache{'updateTime:columnWidth'}=24; |
|
|
if($cache{'download'} ne 'false') { |
if($cache{'download'} ne 'false') { |
my $who = $cache{'download'}; |
my $who = $cache{'download'}; |
Line 293 sub PrepareData {
|
Line 395 sub PrepareData {
|
return 'aborted'; |
return 'aborted'; |
} |
} |
|
|
if($c->aborted()) { |
|
untie(%cache); |
|
return 'aborted'; |
|
} |
|
|
|
untie(%cache); |
untie(%cache); |
|
|
return ('OK', $students); |
return ('OK', $students); |
} |
} |
|
|
|
|
# Create progress |
# Create progress |
sub Create_PrgWin { |
sub Create_PrgWin { |
|
my ($r)=@_; |
$r->print(<<ENDPOP); |
$r->print(<<ENDPOP); |
<script> |
<script> |
popwin=open('','popwin','width=400,height=100'); |
popwin=open('','popwin','width=400,height=100'); |
Line 323 ENDPOP
|
Line 422 ENDPOP
|
|
|
# update progress |
# update progress |
sub Update_PrgWin { |
sub Update_PrgWin { |
my ($totalStudents,$index,$name)=@_; |
my ($totalStudents,$index,$name,$r)=@_; |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
$r->print('<script>popwin.document.popremain.remaining.value="'. |
'Computing '.$index.'/'.$totalStudents.': '. |
'Computing '.$index.'/'.$totalStudents.': '. |
$name.'";</script>'); |
$name.'";</script>'); |
Line 332 sub Update_PrgWin {
|
Line 431 sub Update_PrgWin {
|
|
|
# close Progress Line |
# close Progress Line |
sub Close_PrgWin { |
sub Close_PrgWin { |
|
my ($r)=@_; |
$r->print('<script>popwin.close()</script>'); |
$r->print('<script>popwin.close()</script>'); |
$r->rflush(); |
$r->rflush(); |
} |
} |
|
|
# For loading the colored table for display or un-colored for print |
|
sub setbgcolor { |
|
my $PrintTable=shift; |
|
undef %color; |
|
if ($PrintTable){ |
|
$color{"gb"}="#FFFFFF"; |
|
$color{"red"}="#FFFFFF"; |
|
$color{"yellow"}="#FFFFFF"; |
|
$color{"green"}="#FFFFFF"; |
|
$color{"purple"}="#FFFFFF"; |
|
} else { |
|
$color{"gb"}="#DDFFFF"; |
|
$color{"red"}="#FFDDDD"; |
|
$color{"yellow"}="#EEFFCC"; |
|
$color{"green"}="#DDFFDD"; |
|
$color{"purple"}="#FFDDFF"; |
|
} |
|
|
|
return; |
|
} |
|
|
|
sub BuildClasslist { |
sub BuildClasslist { |
my ($cacheDB,$students,$studentInformation,$headings,$spacePadding)=@_; |
my ($cacheDB,$students,$studentInformation,$headings)=@_; |
|
|
my %cache; |
my %cache; |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
Line 371 sub BuildClasslist {
|
Line 451 sub BuildClasslist {
|
|
|
my $displayString = '<td align="left"><a href="/adm/statistics?'; |
my $displayString = '<td align="left"><a href="/adm/statistics?'; |
$displayString .= 'sort=LINKDATA">DISPLAYDATA </a></td>'."\n"; |
$displayString .= 'sort=LINKDATA">DISPLAYDATA </a></td>'."\n"; |
$Str .= &Apache::lonhtmlcommon::CreateStudentInformationHeadings(\%cache, |
$Str .= &Apache::lonhtmlcommon::CreateHeadings(\%cache, $studentInformation, |
$studentInformation, |
$headings, $displayString); |
$headings, |
|
$displayString); |
|
$Str .= '<td align="left">'; |
|
$Str .= '<a href="/adm/statistics?sort=lastDownloadTime">'; |
|
$Str .= 'Last Updated </a></td>'."\n"; |
|
$Str .= '</tr>'."\n"; |
$Str .= '</tr>'."\n"; |
my $alternate=0; |
my $alternate=0; |
foreach (@$students) { |
foreach (@$students) { |
my ($username, $domain) = split(':', $_); |
my ($username, $domain) = split(':', $_); |
if($alternate) { |
if($alternate) { |
$Str .= '<tr bgcolor="#ffffe6"><td>'; |
$Str .= '<tr bgcolor="#ffffe6">'; |
} else { |
} else { |
$Str .= '<tr bgcolor="#ffffc6"><td>'; |
$Str .= '<tr bgcolor="#ffffc6">'; |
} |
} |
$alternate = ($alternate + 1) % 2; |
$alternate = ($alternate + 1) % 2; |
foreach my $data (@$studentInformation) { |
foreach my $data (@$studentInformation) { |
|
$Str .= '<td>'; |
if($data eq 'fullname') { |
if($data eq 'fullname') { |
$Str .= '<a href="/adm/statistics?reportSelected='; |
$Str .= '<a href="/adm/statistics?reportSelected='; |
$Str .= &Apache::lonnet::escape('Student Assessment'); |
$Str .= &Apache::lonnet::escape('Student Assessment'); |
$Str .= '&StudentAssessmentStudent='; |
$Str .= '&StudentAssessmentStudent='; |
$Str .= &Apache::lonnet::escape($cache{$_.':'.$data}).'">'; |
$Str .= &Apache::lonnet::escape($cache{$_.':'.$data}).'">'; |
#$Str .= 'Student Assessment'.'">'; |
$Str .= $cache{$_.':'.$data}.' '; |
} |
|
|
|
$Str .= $cache{$_.':'.$data}.' '; |
|
|
|
if($data eq 'fullname') { |
|
$Str .= '</a>'; |
$Str .= '</a>'; |
|
} elsif($data eq 'updateTime') { |
|
$Str .= '<a href="/adm/statistics?reportSelected='; |
|
$Str .= &Apache::lonnet::escape('Class list'); |
|
$Str .= '&download='.$_.'">'; |
|
$Str .= $cache{$_.':'.$data}.' '; |
|
$Str .= ' </a>'; |
|
} else { |
|
$Str .= $cache{$_.':'.$data}.' '; |
} |
} |
|
|
$Str .= '</td><td>'; |
$Str .= '</td>'."\n"; |
} |
|
|
|
$Str .= '<a href="/adm/statistics?download='.$_.'">'; |
|
my $downloadTime = $cache{$_.':lastDownloadTime'}; |
|
if($downloadTime ne 'Not downloaded') { |
|
$downloadTime = localtime($downloadTime); |
|
} |
} |
$Str .= $downloadTime; |
|
|
|
$Str .= ' </a></td></tr>'."\n"; |
|
} |
} |
|
|
|
$Str .= '</tr>'."\n"; |
$Str .= '</table></td></tr></table>'."\n"; |
$Str .= '</table></td></tr></table>'."\n"; |
|
|
untie(%cache); |
untie(%cache); |
Line 423 sub BuildClasslist {
|
Line 494 sub BuildClasslist {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
sub CreateMainMenu { |
|
my ($status, $reports)=@_; |
|
|
|
my $Str = ''; |
|
|
|
$Str .= '<table border="0"><tbody><tr>'."\n"; |
|
$Str .= '<td></td><td></td>'."\n"; |
|
$Str .= '<td align="center"><b>Analysis Reports:</b></td>'."\n"; |
|
$Str .= '<td align="center"><b>Student Status:</b></td></tr>'."\n"; |
|
$Str .= '<tr>'."\n"; |
|
$Str .= '<td align="center"><input type="submit" name="Refresh" '; |
|
$Str .= 'value="Refresh" /></td>'."\n"; |
|
$Str .= '<td align="center"><input type="submit" name="DownloadAll" '; |
|
$Str .= 'value="Update All Student Data" /></td>'."\n"; |
|
$Str .= '<td align="center">'; |
|
$Str .= '<select name="reportSelected" onchange="document.'; |
|
$Str .= 'Statistics.submit()">'."\n"; |
|
|
|
foreach (sort(keys(%$reports))) { |
|
next if($_ eq 'reportSelected'); |
|
$Str .= '<option name="'.$_.'"'; |
|
if($reports->{'reportSelected'} eq $reports->{$_}) { |
|
$Str .= ' selected=""'; |
|
} |
|
$Str .= '>'.$reports->{$_}.'</option>'."\n"; |
|
} |
|
$Str .= '</select></td>'."\n"; |
|
|
|
$Str .= '<td align="center">'; |
|
$Str .= &Apache::lonhtmlcommon::StatusOptions($status, 'Statistics'); |
|
$Str .= '</td>'."\n"; |
|
|
|
$Str .= '</tr></tbody></table>'."\n"; |
|
$Str .= '<hr>'."\n"; |
|
|
|
return $Str; |
|
} |
|
|
sub BuildStatistics { |
sub BuildStatistics { |
my ($r)=@_; |
my ($r)=@_; |
|
|
my $c = $r->connection; |
my $c = $r->connection; |
my @studentInformation=('fullname','section','id','domain','username'); |
my @studentInformation=('fullname','section','id','domain','username', |
my @headings=('Full Name', 'Section', 'PID', 'Domain', 'User Name'); |
'updateTime'); |
my $spacePadding = ' '; |
my @headings=('Full Name', 'Section', 'PID', 'Domain', 'User Name', |
|
'Last Updated'); |
|
my $spacing = ' '; |
my %reports = ('classlist' => 'Class list', |
my %reports = ('classlist' => 'Class list', |
'problem_statistics' => 'Problem Statistics', |
'problem_statistics' => 'Problem Statistics', |
'student_assessment' => 'Student Assessment', |
'student_assessment' => 'Student Assessment', |
Line 440 sub BuildStatistics {
|
Line 551 sub BuildStatistics {
|
my $cacheDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". |
my $cacheDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". |
"_$ENV{'user.domain'}_$courseID\_statistics.db"; |
"_$ENV{'user.domain'}_$courseID\_statistics.db"; |
|
|
&setbgcolor(0); |
my ($returnValue, $students) = &PrepareData($c, $cacheDB, |
my ($returnValue, $students) = &PrepareData($c, $cacheDB); |
\@studentInformation, |
|
\@headings); |
if($returnValue ne 'OK') { |
if($returnValue ne 'OK') { |
$r->print('<html><body>'.$returnValue."\n".'</body></html>'); |
$r->print('<html><body>'.$returnValue."\n".'</body></html>'); |
return OK; |
return OK; |
Line 451 sub BuildStatistics {
|
Line 563 sub BuildStatistics {
|
if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER,0640)) { |
$GoToPage = $cache{'reportSelected'}; |
$GoToPage = $cache{'reportSelected'}; |
$reports{'reportSelected'} = $cache{'reportSelected'}; |
$reports{'reportSelected'} = $cache{'reportSelected'}; |
# if(defined($cache{'reportKey'}) && $cache{'reportKey'} ne 'false') { |
if(defined($cache{'reportKey'}) && |
# $reports{$cache{'reportKey'}} = $cache{'reportSelected'}; |
!exists($reports{$cache{'reportKey'}}) && |
# } |
$cache{'reportKey'} ne 'false') { |
|
$reports{$cache{'reportKey'}} = $cache{'reportSelected'}; |
|
} |
|
|
if(defined($cache{'OptionResponses'})) { |
if(defined($cache{'OptionResponses'})) { |
$reports{'problem_analysis'} = 'Problem Analysis'; |
$reports{'problem_analysis'} = 'Problem Analysis'; |
Line 462 sub BuildStatistics {
|
Line 576 sub BuildStatistics {
|
$r->print(&Apache::lonhtmlcommon::Title('LON-CAPA Statistics')); |
$r->print(&Apache::lonhtmlcommon::Title('LON-CAPA Statistics')); |
$r->print('<form name="Statistics" '); |
$r->print('<form name="Statistics" '); |
$r->print('method="post" action="/adm/statistics">'); |
$r->print('method="post" action="/adm/statistics">'); |
$r->print(&Apache::lonhtmlcommon::CreateStatisticsMainMenu( |
$r->print(&CreateMainMenu($cache{'Status'}, \%reports)); |
$cache{'Status'}, |
|
\%reports)); |
|
untie(%cache); |
untie(%cache); |
} else { |
} else { |
$r->print('<html><body>Unable to tie database.</body></html>'); |
$r->print('<html><body>Unable to tie database.</body></html>'); |
Line 474 sub BuildStatistics {
|
Line 586 sub BuildStatistics {
|
if($GoToPage eq 'Activity Log') { |
if($GoToPage eq 'Activity Log') { |
&Apache::lonproblemstatistics::Activity(); |
&Apache::lonproblemstatistics::Activity(); |
} elsif($GoToPage eq 'Problem Statistics') { |
} elsif($GoToPage eq 'Problem Statistics') { |
$r->print( |
|
&Apache::lonproblemstatistics::BuildProblemStatisticsPage($cacheDB, |
&Apache::lonproblemstatistics::BuildProblemStatisticsPage($cacheDB, |
$students, |
$students, |
$courseID, |
$courseID, |
$c,$r)); |
$c,$r); |
} elsif($GoToPage eq 'Problem Analysis') { |
} elsif($GoToPage eq 'Problem Analysis') { |
$r->print( |
$r->print( |
&Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB)); |
&Apache::lonproblemanalysis::BuildProblemAnalysisPage($cacheDB)); |
} elsif($GoToPage eq 'Student Assessment') { |
} elsif($GoToPage eq 'Student Assessment') { |
$r->print( |
$r->print( |
&Apache::lonstudentassessment::BuildStudentAssessmentPage($cacheDB, |
&Apache::lonstudentassessment::BuildStudentAssessmentPage($cacheDB, |
$students, |
$students, |
$courseID, |
$courseID, |
$c)); |
'Statistics', |
|
\@headings, |
|
$spacing, |
|
\@studentInformation, |
|
$r, $c)); |
} elsif($GoToPage eq 'Analyze') { |
} elsif($GoToPage eq 'Analyze') { |
$r->print(&Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, |
$r->print(&Apache::lonproblemanalysis::BuildAnalyzePage($cacheDB, |
$students, |
$students, |
$courseID)); |
$courseID,$r)); |
} elsif($GoToPage eq 'DoDiffGraph') { |
} elsif($GoToPage eq 'DoDiffGraph') { |
&Apache::lonproblemstatistics::BuildDiffGraph($courseID); |
&Apache::lonproblemstatistics::BuildDiffGraph($r); |
} elsif($GoToPage eq 'PercentWrongGraph') { |
} elsif($GoToPage eq 'PercentWrongGraph') { |
&Apache::lonproblemstatistics::BuildWrongGraph($courseID); |
&Apache::lonproblemstatistics::BuildWrongGraph($r); |
} elsif($GoToPage eq 'Class list') { |
} elsif($GoToPage eq 'Class list') { |
$r->print(&BuildClasslist($cacheDB, $students, \@studentInformation, |
$r->print(&BuildClasslist($cacheDB, $students, \@studentInformation, |
\@headings, $spacePadding)); |
\@headings)); |
} |
} |
|
|
$r->print('</form>'."\n"); |
$r->print('</form>'."\n"); |
Line 511 sub BuildStatistics {
|
Line 626 sub BuildStatistics {
|
# ================================================================ Main Handler |
# ================================================================ Main Handler |
|
|
sub handler { |
sub handler { |
$r=shift; |
my $r=shift; |
|
|
|
# $jr = $r; |
|
|
unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { |
unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { |
$ENV{'user.error.msg'}= |
$ENV{'user.error.msg'}= |
Line 546 sub handler {
|
Line 663 sub handler {
|
} |
} |
1; |
1; |
__END__ |
__END__ |
|
|