version 1.45, 2002/06/28 19:34:12
|
version 1.49, 2002/07/01 21:12:06
|
Line 55 use Apache::loncommon();
|
Line 55 use Apache::loncommon();
|
use HTML::TokeParser; |
use HTML::TokeParser; |
use GDBM_File; |
use GDBM_File; |
|
|
#my $jr; |
my $jr; |
# ----- FORMAT PRINT DATA ---------------------------------------------- |
# ----- FORMAT PRINT DATA ---------------------------------------------- |
|
|
sub FormatStudentInformation { |
sub FormatStudentInformation { |
my ($cache,$name,$studentInformation,$spacePadding)=@_; |
my ($cache,$name,$studentInformation,$reselected,$spacePadding)=@_; |
my $Str='<pre>'; |
my $Str='<pre>'; |
|
|
foreach (@$studentInformation) { |
for(my $index=0; $index<(scalar @$studentInformation); $index++) { |
my $data=$cache->{$name.':'.$_}; |
if(!&ShouldShowColumn($reselected, 'heading', $index)) { |
|
next; |
|
} |
|
my $data=$cache->{$name.':'.$studentInformation->[$index]}; |
$Str .= $data; |
$Str .= $data; |
|
|
my @dataLength=split(//,$data); |
my @dataLength=split(//,$data); |
my $length=scalar @dataLength; |
my $length=scalar @dataLength; |
$Str .= (' 'x($cache->{$_.'Length'}-$length)); |
$Str .= (' 'x($cache->{$studentInformation->[$index].'Length'}- |
|
$length)); |
$Str .= $spacePadding; |
$Str .= $spacePadding; |
} |
} |
|
|
Line 76 sub FormatStudentInformation {
|
Line 80 sub FormatStudentInformation {
|
} |
} |
|
|
sub FormatStudentData { |
sub FormatStudentData { |
my ($name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_; |
my ($reselected,$name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_; |
my ($sname,$sdom) = split(/\:/,$name); |
my ($sname,$sdom) = split(/\:/,$name); |
my $Str; |
my $Str; |
my %CacheData; |
my %CacheData; |
Line 87 sub FormatStudentData {
|
Line 91 sub FormatStudentData {
|
# Handle Student information ------------------------------------------ |
# Handle Student information ------------------------------------------ |
# Handle user data |
# Handle user data |
$Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation, |
$Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation, |
$spacePadding); |
$reselected, $spacePadding); |
|
|
# Handle errors |
# Handle errors |
if($CacheData{$name.':error'} =~ /environment/) { |
if($CacheData{$name.':error'} =~ /environment/) { |
Line 116 sub FormatStudentData {
|
Line 120 sub FormatStudentData {
|
my $problemsSolved = 0; |
my $problemsSolved = 0; |
my $numberOfParts = 0; |
my $numberOfParts = 0; |
foreach my $sequence (split(/\:/,$CacheData{'orderedSequences'})) { |
foreach my $sequence (split(/\:/,$CacheData{'orderedSequences'})) { |
|
if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) { |
|
next; |
|
} |
|
|
my $characterCount=0; |
my $characterCount=0; |
foreach my $problemID (split(/\:/,$CacheData{$sequence.':problems'})) { |
foreach my $problemID (split(/\:/,$CacheData{$sequence.':problems'})) { |
my $problem = $CacheData{$problemID.':problem'}; |
my $problem = $CacheData{$problemID.':problem'}; |
Line 215 sub FormatStudentData {
|
Line 223 sub FormatStudentData {
|
} |
} |
|
|
sub CreateTableHeadings { |
sub CreateTableHeadings { |
my ($CacheData,$studentInformation,$headings,$spacePadding)=@_; |
my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_; |
my $Str='<pre>'; |
my $Str='<pre>'; |
|
|
for(my $index=0; $index<(scalar @$headings); $index++) { |
for(my $index=0; $index<(scalar @$headings); $index++) { |
|
if(!&ShouldShowColumn($reselected, 'heading', $index)) { |
|
next; |
|
} |
|
|
my $data=$$headings[$index]; |
my $data=$$headings[$index]; |
$Str .= $data; |
$Str .= $data; |
|
|
Line 230 sub CreateTableHeadings {
|
Line 242 sub CreateTableHeadings {
|
} |
} |
|
|
foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) { |
foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) { |
$Str .= $CacheData->{$sequence.':title'}; |
if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) { |
|
next; |
|
} |
|
|
|
my $name = $CacheData->{$sequence.':title'}; |
|
$Str .= $name; |
my @titleLength=split(//,$CacheData->{$sequence.':title'}); |
my @titleLength=split(//,$CacheData->{$sequence.':title'}); |
my $leftover=$CacheData->{$sequence.':columnWidth'}- |
my $leftover=$CacheData->{$sequence.':columnWidth'}- |
(scalar @titleLength); |
(scalar @titleLength); |
Line 244 sub CreateTableHeadings {
|
Line 261 sub CreateTableHeadings {
|
return $Str; |
return $Str; |
} |
} |
|
|
|
sub CreateColumnSelectionBox { |
|
my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_; |
|
|
|
my $missing=0; |
|
my $notThere='<br><br><b>Select column to view:</b><br><br>'; |
|
my $name; |
|
$notThere .= '  '; |
|
$notThere .= '<select name="reselect" size="4" multiple="true">'."\n"; |
|
|
|
for(my $index=0; $index<(scalar @$headings); $index++) { |
|
if(&ShouldShowColumn($reselected, 'heading', $index)) { |
|
next; |
|
} |
|
$name = $headings->[$index]; |
|
$notThere .= '<option value="heading'.$index.'">'; |
|
$notThere .= $name.'</option>'."\n"; |
|
$missing++; |
|
} |
|
|
|
foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) { |
|
if(&ShouldShowColumn($reselected, 'sequence', $sequence)) { |
|
next; |
|
} |
|
$name = $CacheData->{$sequence.':title'}; |
|
$notThere .= '<option value="sequence'.$sequence.'">'; |
|
$notThere .= $name.'</option>'."\n"; |
|
$missing++; |
|
} |
|
|
|
if($missing) { |
|
$notThere .= '</select><br><br>'; |
|
} else { |
|
$notThere=''; |
|
} |
|
|
|
return $notThere; |
|
} |
|
|
|
sub CreateColumnSelectors { |
|
my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_; |
|
|
|
my $found=0; |
|
my ($name, $length, $position); |
|
my $present='<pre>'; |
|
for(my $index=0; $index<(scalar @$headings); $index++) { |
|
if(!&ShouldShowColumn($reselected, 'heading', $index)) { |
|
next; |
|
} |
|
$name = $headings->[$index]; |
|
$length=$CacheData->{$$studentInformation[$index].'Length'}; |
|
$position=int($length/2); |
|
$present .= (' 'x($position)); |
|
$present .= '<input type="checkbox" checked="on" '; |
|
$present .= 'name="heading'.$index.'">'; |
|
$position+=2; |
|
$present .= (' 'x($length-$position)); |
|
$present .= $spacePadding; |
|
$found++; |
|
} |
|
|
|
foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) { |
|
if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) { |
|
next; |
|
} |
|
$name = $CacheData->{$sequence.':title'}; |
|
$length=$CacheData->{$sequence.':columnWidth'}; |
|
$position=int($length/2); |
|
$present .= (' 'x($position)); |
|
$present .= '<input type="checkbox" checked="on" '; |
|
$present .= 'name="sequence'.$sequence.'">'; |
|
$position+=2; |
|
$present .= (' 'x($length-$position)); |
|
$present .= $spacePadding; |
|
$found++; |
|
} |
|
|
|
if($found) { |
|
$present .= '</pre>'; |
|
$present = $present; |
|
} else { |
|
$present = ''; |
|
} |
|
|
|
return $present.'</form>'."\n";; |
|
} |
|
|
sub CreateForm { |
sub CreateForm { |
my $OpSel1=''; |
my $OpSel1=''; |
my $OpSel2=''; |
my $OpSel2=''; |
Line 254 sub CreateForm {
|
Line 357 sub CreateForm {
|
else { $OpSel1 = 'selected'; } |
else { $OpSel1 = 'selected'; } |
|
|
my $Ptr = '<form name="stat" method="post" action="/adm/chart" >'."\n"; |
my $Ptr = '<form name="stat" method="post" action="/adm/chart" >'."\n"; |
|
$Ptr .= '<input type="submit" name="sort" value="Recalculate Chart"/>'; |
|
$Ptr .= "\n"; |
|
$Ptr .= ' '; |
|
$Ptr .= '<input type="submit" name="refresh" value="Refresh Chart"/>'; |
|
$Ptr .= "\n"; |
|
$Ptr .= '<br><br>'; |
$Ptr .= '<b> Sort by: </b>'."\n"; |
$Ptr .= '<b> Sort by: </b>'."\n"; |
$Ptr .= ' '; |
$Ptr .= ' '; |
$Ptr .= '<input type="submit" name="sort" value="User Name" />'."\n"; |
$Ptr .= '<input type="submit" name="sort" value="User Name" />'."\n"; |
Line 263 sub CreateForm {
|
Line 372 sub CreateForm {
|
$Ptr .= '<input type="submit" name="sort" value="Section"/>'."\n"; |
$Ptr .= '<input type="submit" name="sort" value="Section"/>'."\n"; |
$Ptr .= '<br><br>'; |
$Ptr .= '<br><br>'; |
$Ptr .= '<b> Student Status: </b>'."\n". |
$Ptr .= '<b> Student Status: </b>'."\n". |
|
' '. |
'<select name="status">'. |
'<select name="status">'. |
'<option '.$OpSel1.' >Active</option>'."\n". |
'<option '.$OpSel1.' >Active</option>'."\n". |
'<option '.$OpSel2.' >Expired</option>'."\n". |
'<option '.$OpSel2.' >Expired</option>'."\n". |
'<option '.$OpSel3.' >Any</option> </select> '."\n"; |
'<option '.$OpSel3.' >Any</option> </select> '."\n"; |
$Ptr .= '<br><br>'; |
|
$Ptr .= '<input type="submit" name="sort" value="Recalculate Chart"/>'; |
|
$Ptr .= "\n"; |
|
$Ptr .= ' '; |
|
$Ptr .= '<input type="submit" name="sort" value="Refresh Chart"/>'; |
|
$Ptr .= "\n"; |
|
$Ptr .= '</form>'."\n"; |
|
|
|
return $Ptr; |
return $Ptr; |
} |
} |
Line 393 sub ProcessTopResourceMap {
|
Line 496 sub ProcessTopResourceMap {
|
my ($currentSequence, $currentResourceID, $lastResourceID); |
my ($currentSequence, $currentResourceID, $lastResourceID); |
|
|
$currentResourceID=$hash{'ids_/res/'.$ENV{'request.course.uri'}}; |
$currentResourceID=$hash{'ids_/res/'.$ENV{'request.course.uri'}}; |
|
push(@currentResource, $currentResourceID); |
$lastResourceID=-1; |
$lastResourceID=-1; |
$currentSequence=-1; |
$currentSequence=-1; |
my $topLevelSequenceNumber = $currentSequence; |
my $topLevelSequenceNumber = $currentSequence; |
Line 466 sub ProcessTopResourceMap {
|
Line 570 sub ProcessTopResourceMap {
|
if($currentResourceID eq $lastResourceID) { |
if($currentResourceID eq $lastResourceID) { |
#pop off last resource of sequence |
#pop off last resource of sequence |
$currentResourceID=pop(@currentResource); |
$currentResourceID=pop(@currentResource); |
#pop to get last resource in previous sequence |
|
$currentResourceID=pop(@currentResource); |
|
$lastResourceID=pop(@finishResource); |
$lastResourceID=pop(@finishResource); |
|
|
if(defined($CacheData{$currentSequence.':problems'})) { |
if(defined($CacheData{$currentSequence.':problems'})) { |
Line 482 sub ProcessTopResourceMap {
|
Line 584 sub ProcessTopResourceMap {
|
$hash{'title_'.$currentResourceID}; |
$hash{'title_'.$currentResourceID}; |
|
|
my $totalProblems=0; |
my $totalProblems=0; |
foreach (split(/\:/,$CacheData{$currentSequence. |
foreach my $currentProblem (split(/\:/, |
|
$CacheData{$currentSequence. |
':problems'})) { |
':problems'})) { |
foreach ($CacheData{$currentSequence.':'.$_.':parts'}) { |
foreach (split(/\:/,$CacheData{$currentSequence.':'. |
|
$currentProblem. |
|
':parts'})) { |
$totalProblems++; |
$totalProblems++; |
} |
} |
} |
} |
Line 519 sub ProcessTopResourceMap {
|
Line 624 sub ProcessTopResourceMap {
|
foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { |
foreach (split(/\,/,$hash{'to_'.$currentResourceID})) { |
push(@nextResources, $hash{'goesto_'.$_}); |
push(@nextResources, $hash{'goesto_'.$_}); |
} |
} |
pop(@currentResource); |
|
push(@currentResource, @nextResources); |
push(@currentResource, @nextResources); |
# Set the next resource to be popped(processed) |
# Set the next resource to be processed |
$currentResourceID=$currentResource[-1]; |
$currentResourceID=pop(@currentResource); |
} |
} |
|
|
unless (untie(%hash)) { |
unless (untie(%hash)) { |
Line 635 sub ProcessClassList {
|
Line 739 sub ProcessClassList {
|
my %CacheData; |
my %CacheData; |
if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) { |
if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) { |
foreach my $name (keys(%$classlist)) { |
foreach my $name (keys(%$classlist)) { |
if($name =~ /\:section/ || $name =~ /\:studentInformation/) { |
if($name =~ /\:section/ || $name =~ /\:studentInformation/ || |
|
$name eq '') { |
next; |
next; |
} |
} |
if($c->aborted()) { |
if($c->aborted()) { |
Line 650 sub ProcessClassList {
|
Line 755 sub ProcessClassList {
|
$name,$courseID,$c); |
$name,$courseID,$c); |
} |
} |
|
|
$CacheData{'NamesOfStudents'}=join(":::",@names); |
|
# $CacheData{'NamesOfStudents'}=&Apache::lonnet::arrayref2str(\@names); |
|
untie(%CacheData); |
untie(%CacheData); |
} |
} |
|
|
Line 730 sub ProcessFullName {
|
Line 833 sub ProcessFullName {
|
} |
} |
|
|
sub SortStudents { |
sub SortStudents { |
my ($CacheData)=@_; |
my ($students,$CacheData)=@_; |
my @students = split(/:::/,$CacheData->{'NamesOfStudents'}); |
|
# my @students=&Apache::lonnet::str2array($CacheData->{'NamesOfStudents'}); |
|
|
|
my @sorted1Students=(); |
my @sorted1Students=(); |
foreach (@students) { |
foreach (@$students) { |
my ($end,$start)=split(/\:/,$CacheData->{$_.':date'}); |
my ($end,$start)=split(/\:/,$CacheData->{$_.':date'}); |
my $active=1; |
my $active=1; |
my $now=time; |
my $now=time; |
Line 772 sub SortStudents {
|
Line 873 sub SortStudents {
|
} |
} |
|
|
my @order = (); |
my @order = (); |
foreach my $key (sort keys(%sortData)) { |
foreach my $key (sort(keys(%sortData))) { |
push (@order,$sortData{$key}); |
push (@order,$sortData{$key}); |
} |
} |
|
|
Line 825 sub ExtractStudentData {
|
Line 926 sub ExtractStudentData {
|
foreach my $key (keys (%$courseData)) { |
foreach my $key (keys (%$courseData)) { |
$CacheData{$name.':'.$key}=$courseData->{$key}; |
$CacheData{$name.':'.$key}=$courseData->{$key}; |
} |
} |
|
if(defined($CacheData{'NamesOfStudents'})) { |
|
$CacheData{'NamesOfStudents'}.=':::'.$name; |
|
} else { |
|
$CacheData{'NamesOfStudents'}=$name; |
|
} |
} |
} |
untie(%CacheData); |
untie(%CacheData); |
} |
} |
Line 832 sub ExtractStudentData {
|
Line 938 sub ExtractStudentData {
|
return; |
return; |
} |
} |
|
|
|
sub ShouldShowColumn { |
|
my ($reselected,$type,$value)=@_; |
|
|
|
if($ENV{'form.sort'} eq 'Recalculate Chart') { |
|
return 1; |
|
} |
|
|
|
if(defined($ENV{'form.'.$type.$value})) { |
|
return 1; |
|
} |
|
|
|
return &CheckForStringInArray($reselected, $type.$value); |
|
} |
|
|
|
sub CheckForStringInArray { |
|
my ($inputArray,$checkString)=@_; |
|
foreach (@$inputArray) { |
|
# $jr->print('a:'.$_.' b:'.$checkString.'<br>'); |
|
if($_ eq $checkString) { |
|
return 1; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
# ----- END HELPER FUNCTIONS -------------------------------------------- |
# ----- END HELPER FUNCTIONS -------------------------------------------- |
|
|
sub BuildChart { |
sub BuildChart { |
Line 849 sub BuildChart {
|
Line 980 sub BuildChart {
|
my $cid=$ENV{'request.course.id'}; |
my $cid=$ENV{'request.course.id'}; |
my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". |
my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". |
"_$ENV{'user.domain'}_$cid\_chart.db"; |
"_$ENV{'user.domain'}_$cid\_chart.db"; |
|
# $ENV{'form.domains'} can be either a scalar or an array reference. |
|
# We need an array. |
|
my @reselected = (ref($ENV{'form.reselect'}) ? @{$ENV{'form.reselect'}} |
|
: ($ENV{'form.reselect'})); |
|
|
$isCached=&TestCacheData($ChartDB); |
$isCached=&TestCacheData($ChartDB); |
if($isCached < 0) { |
if($isCached < 0) { |
Line 858 sub BuildChart {
|
Line 993 sub BuildChart {
|
} |
} |
|
|
# Download class list information if not using cached data |
# Download class list information if not using cached data |
|
my %CacheData; |
my @students=(); |
my @students=(); |
my @studentInformation=('username','domain','section','id','fullname'); |
my @studentInformation=('username','domain','section','id','fullname'); |
my @headings=('User Name','Domain','Section','PID','Full Name'); |
my @headings=('User Name','Domain','Section','PID','Full Name'); |
Line 881 sub BuildChart {
|
Line 1017 sub BuildChart {
|
&SpaceColumns(\@students,\@studentInformation,\@headings, |
&SpaceColumns(\@students,\@studentInformation,\@headings, |
$ChartDB); |
$ChartDB); |
if($c->aborted()) { return; } |
if($c->aborted()) { return; } |
|
} else { |
|
if(!$c->aborted() && tie(%CacheData,'GDBM_File',$ChartDB, |
|
&GDBM_READER,0640)) { |
|
@students=split(/:::/,$CacheData{'NamesOfStudents'}); |
|
} |
} |
} |
|
|
# Sort students and print out table desciptive data |
# Sort students and print out table desciptive data |
my %CacheData; |
|
if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) { |
if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) { |
if(!$c->aborted()) { @students=&SortStudents(\%CacheData); } |
if(!$c->aborted()) { @students=&SortStudents(\@students,\%CacheData); } |
if(!$c->aborted()) { $r->print(&CreateLegend()); } |
if(!$c->aborted()) { $r->print(&CreateLegend()); } |
|
if(!$c->aborted()) { $r->rflush(); } |
if(!$c->aborted()) { $r->print(&CreateForm()); } |
if(!$c->aborted()) { $r->print(&CreateForm()); } |
if(!$c->aborted()) { $r->print('<h3>'.(scalar @students). |
if(!$c->aborted()) { $r->print(&CreateColumnSelectionBox( |
|
\%CacheData, |
|
\@studentInformation, |
|
\@headings, |
|
\@reselected, |
|
$spacePadding)); } |
|
if(!$c->aborted()) { $r->print('<h3>'.(scalar @students). |
' students</h3>'); } |
' students</h3>'); } |
if(!$c->aborted()) { $r->rflush(); } |
if(!$c->aborted()) { $r->print(&CreateColumnSelectors( |
|
\%CacheData, |
|
\@studentInformation, |
|
\@headings, |
|
\@reselected, |
|
$spacePadding)); } |
if(!$c->aborted()) { $r->print(&CreateTableHeadings( |
if(!$c->aborted()) { $r->print(&CreateTableHeadings( |
\%CacheData, |
\%CacheData, |
\@studentInformation, |
\@studentInformation, |
\@headings, |
\@headings, |
|
\@reselected, |
$spacePadding)); } |
$spacePadding)); } |
|
if(!$c->aborted()) { $r->rflush(); } |
untie(%CacheData); |
untie(%CacheData); |
} else { |
} else { |
$r->print("Init2: Unable to tie hash to db file"); |
$r->print("Init2: Unable to tie hash to db file"); |
Line 923 sub BuildChart {
|
Line 1077 sub BuildChart {
|
push(@updateStudentList, $_); |
push(@updateStudentList, $_); |
&ExtractStudentData($courseData, $_, $ChartDB); |
&ExtractStudentData($courseData, $_, $ChartDB); |
} |
} |
$r->print(&FormatStudentData($_, $cid, \@studentInformation, |
$r->print(&FormatStudentData(\@reselected, $_, $cid, |
|
\@studentInformation, |
$spacePadding, $ChartDB)); |
$spacePadding, $ChartDB)); |
$r->rflush(); |
$r->rflush(); |
} |
} |
Line 938 sub BuildChart {
|
Line 1093 sub BuildChart {
|
|
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
# $jr=$r; |
$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'}= |
$r->uri.":vgr:0:0:Cannot view grades for complete course"; |
$r->uri.":vgr:0:0:Cannot view grades for complete course"; |