--- loncom/interface/Attic/lonchart.pm 2002/02/19 20:22:00 1.31 +++ loncom/interface/Attic/lonchart.pm 2002/06/05 05:05:38 1.43 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonchart.pm,v 1.31 2002/02/19 20:22:00 minaeibi Exp $ +# $Id: lonchart.pm,v 1.43 2002/06/05 05:05:38 stredwic Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,7 +25,6 @@ # # http://www.lon-capa.org/ # -# # Homework Performance Chart # # (Navigate Maps Handler @@ -43,7 +42,7 @@ # 9/8 Gerd Kortemeyer # 10/1, 10/19, 11/17, 11/22, 11/24, 11/28 12/18 Behrouz Minaei # YEAR=2002 -# 2/1, 2/6, 2/19 Behrouz Minaei +# 2/1, 2/6, 2/19, 2/28 Behrouz Minaei # ### @@ -60,126 +59,220 @@ use GDBM_File; my %hash; my %CachData; my @cols; -my @rowlabels; -my @students; -my @PreCol; my $r; - +my $c; + # ------------------------------------------------------------- Find out status sub ExtractStudentData { - my ($index,$coid)=@_; - my ($sname,$sdom) = split( /\:/, $students[$index] ); - my $shome=&Apache::lonnet::homeserver( $sname,$sdom ); - my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$coid,$shome ); - my %result=(); + my ($name,$coid)=@_; + my ($sname,$sdom) = split(/\:/,$name); my $ResId; my $Code; my $Tries; my $Wrongs; my %TempHash; my $Version; - my $ProbNo; - my $ProbSolved; - my $ProbTotal; - my $LatestVersion; - my $Str=substr($students[$index]. - ' ',0,14).' ! '. - substr($rowlabels[$index]. - ' ',0,45).' ! '; - unless ($reply=~/^error\:/) { - foreach (split(/\&/,$reply)) { - my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_)); - $result{$name}=$value; - } - $ProbNo = 0; - $ProbTotal = 0; - $ProbSolved = 0; - my $IterationNo = 0; - foreach $ResId (@cols) { - if ($IterationNo == 0) {$IterationNo++; next;} - if (!$ResId) { - my $PrNo = sprintf( "%3d", $ProbNo ); - $Str .= ' '.''.$PrNo.' '; - $ProbSolved += $ProbNo; - $ProbNo=0; - next; - } - $ResId=~/(\d+)\.(\d+)/; - my $meta=$hash{'src_'.$ResId}; - my $PartNo = 0; - undef %TempHash; - foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) { - if ($_=~/^stores\_(\d+)\_tries$/) { - my $Part=&Apache::lonnet::metadata($meta,$_.'.part'); - if ( $TempHash{"$Part"} eq '' ) { - $TempHash{"$Part"} = $Part; - $TempHash{$PartNo}=$Part; - $TempHash{"$Part.Code"} = ' '; - $PartNo++; - } + my $problemsCorrect; + my $problemsSolved; + my $totalProblems; + my $LatestVersion; + my $Str; + + # Handle Student information ------------------------------------------ + # Handle errors +# if($CachData{$name.':error'} =~ /environment/) { +# my $errorMessage = $CachData{$name.':error'}; +# return ''.$sname.''.$sdom. +# ''.$errorMessage.''; +# } + + # Handle user data + $Str = '
'.$sname.'
'.$sdom;
+    $Str .= '
'.$CachData{$name.':section'};
+    $Str .= '
'.$CachData{$name.':id'};
+    $Str .= '
'.$CachData{$name.':fullname'};
+    $Str .= '
'; + + if($CachData{$name.':error'} =~ /course/) { + return $Str; +# my $errorMessage = 'May have no course data or '. +# $CachData{$name.':error'}; +# return ''.$sname.''.$sdom. +# ''.$errorMessage.''; + } + + # Handle problem data ------------------------------------------------ + $Str .= '
';
+    $problemsCorrect = 0;
+    $totalProblems = 0;
+    $problemsSolved = 0;
+    my $IterationNo = 0;
+    foreach $ResId (@cols) {
+	if ($IterationNo == 0) {
+	    # Looks to be skipping start resource
+	    $IterationNo++; 
+	    next;
+	}
+
+	# ResId is 0 for sequences and pages, 
+	# please check tracetable for changes
+	if (!$ResId) {
+	    my $outputProblemsCorrect = sprintf( "%3d", $problemsCorrect );
+	    $Str .= ''.$outputProblemsCorrect.
+		    '
'; + $Str .= '
';
+	    $problemsSolved += $problemsCorrect;
+	    $problemsCorrect=0;
+	    next; 
+	}
+
+	# Set $1 and $2
+	$ResId=~/(\d+)\.(\d+)/;
+	my $meta=$hash{'src_'.$ResId};
+	my $numberOfParts = 0;
+	undef %TempHash;
+	foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
+#----------- Overwrite $1 in next statement ---------------------------------
+	    if ($_=~/^stores\_(\d+)\_tries$/) {
+		my $Part=&Apache::lonnet::metadata($meta,$_.'.part');
+		if ( $TempHash{"$Part"} eq '' ) { 
+		    $TempHash{"$Part"} = $Part;
+		    $TempHash{$numberOfParts}=$Part;
+		    $TempHash{"$Part.Code"} = ' ';  
+		    $numberOfParts++;
 		}
-            }
+	    }
+	}
 
-            my $Prob = &Apache::lonnet::declutter( $hash{'map_id_'.$1} ).
+#----------- Using $1 and $2 -----------------------------------------------
+	my $Prob = &Apache::lonnet::symbclean(
+		       &Apache::lonnet::declutter($hash{'map_id_'.$1} ).
                        '___'.$2.'___'.
-                       &Apache::lonnet::declutter( $hash{'src_'.$ResId} );
-            $Code=' ';
-            $Tries = 0;
-  	    $LatestVersion = $result{"version:$Prob"};
-
-            if ( $LatestVersion ) {
-		for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) {
-		    my $vkeys = $result{"$Version:keys:$Prob"};
-		    my @keys = split(/\:/,$vkeys);		  
-
-		    foreach my $Key (@keys) {		  
-			if (($Key=~/\.(\w+)\.solved$/) && ($Key!~/^\d+\:/)) {
-			    my $Part = $1;
-			    $Tries = $result{"$Version:$Prob:resource.$Part.tries"};
-			    $TempHash{"$Part.Tries"}=($Tries) ? $Tries : 0;
-			    my $Val = $result{"$Version:$Prob:resource.$Part.solved"};
-			    if ($Val eq 'correct_by_student'){$Code='*';} 
-			    elsif ($Val eq 'correct_by_override'){$Code = '+';}                        
-			    elsif ($Val eq 'incorrect_attempted'){$Code = '.';} 
-			    elsif ($Val eq 'incorrect_by_override'){$Code = '-';}
-			    elsif ($Val eq 'excused'){$Code = 'x';}
-			    elsif ($Val eq 'ungraded_attempted'){$Code = '#';}
-			    else {$Code = ' ';}
-			    $TempHash{"$Part.Code"} = $Code;
-			}
-      		    }
-                } 
-		for ( my $n = 0; $n < $PartNo; $n++ ) {		  
-		    my $part = $TempHash{$n};
-		    my $Code = $TempHash{"$part.Code"};
-                    if ( $Code eq '*') {
-			$ProbNo++;
-                        if (($TempHash{"$part.Tries"}<10) ||
-                            ($TempHash{"$part.Tries"} eq '')) {
-			    $TempHash{"$part.Code"}=$TempHash{"$part.Tries"};
-			}
-                    }
-		    elsif ( $Code eq '+' ) {$ProbNo++;}
-		    $Str .= $TempHash{"$part.Code"};
-		    if ( $Code ne 'x' ) {$ProbTotal++;}
+                       &Apache::lonnet::declutter( $hash{'src_'.$ResId} ));
+	$Code=' ';
+	$Tries = 0;
+	$LatestVersion = $CachData{$name.":version:$Prob"};
+
+	if ( $LatestVersion ) {
+	    for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) {
+		my $vkeys = $CachData{$name.":$Version:keys:$Prob"};
+		my @keys = split(/\:/,$vkeys);		  
+
+		foreach my $Key (@keys) {
+#---------------------- Changing $1 -------------------------------------------
+		    if (($Key=~/\.(\w+)\.solved$/) && ($Key!~/^\d+\:/)) {
+#---------------------- Using $1 -----------------------------------------------
+			my $Part = $1;
+			$Tries = $CachData{$name.":$Version:$Prob".
+					   ":resource.$Part.tries"};
+			$TempHash{"$Part.Tries"}=($Tries) ? $Tries : 0;
+			my $Val = $CachData{$name.":$Version:$Prob".
+					    ":resource.$Part.solved"};
+			if    ($Val eq 'correct_by_student')   {$Code = '*';} 
+			elsif ($Val eq 'correct_by_override')  {$Code = '+';}
+			elsif ($Val eq 'incorrect_attempted')  {$Code = '.';} 
+			elsif ($Val eq 'incorrect_by_override'){$Code = '-';}
+			elsif ($Val eq 'excused')              {$Code = 'x';}
+			elsif ($Val eq 'ungraded_attempted')   {$Code = '#';}
+			else                                   {$Code = ' ';}
+
+			$TempHash{"$Part.Code"} = $Code;
+		    }
+		}
+	    }
+# Actually append problem to output (all parts)
+	    $Str.=''; 
+	    for(my $n = 0; $n < $numberOfParts; $n++) {		  
+		my $part = $TempHash{$n};
+		my $code2 = $TempHash{"$part.Code"};
+		if($code2 eq '*') {
+		    $problemsCorrect++;
+# !!!!!!!!!!!------------------------- Should 10 not be maxtries? ------------
+		    if (($TempHash{"$part.Tries"}<10) ||
+			($TempHash{"$part.Tries"} eq '')) {
+			$TempHash{"$part.Code"}=$TempHash{"$part.Tries"};
+		    }
+		} elsif($code2 eq '+') {
+		    $problemsCorrect++;
 		}
-            }   
-	    else {
-		for(my $n=0; $n<$PartNo; $n++) {
-		    $Str.=' ';
-		    $ProbTotal++;
+
+		$Str .= $TempHash{"$part.Code"};
+
+		if($code2 ne 'x') {
+		    $totalProblems++;
 		}
 	    }
-        } 
+	    $Str.='';
+	} else {
+	    for(my $n=0; $n<$numberOfParts; $n++) {
+		$Str.=' ';
+		$totalProblems++;
+	    }
+	}
     }
-    my $PrTot = sprintf( "%5d", $ProbTotal );
-    my $PrSvd = sprintf( "%5d", $ProbSolved );
-    $Str .= ' '.''.$PrSvd.'  /'.$PrTot.' ';
 
-    return $Str ;
+    $Str .= '
'.$problemsSolved.
+	    ' / '.$totalProblems.'
'; + + return $Str; } +sub CreateForm { + my $OpSel1=''; + my $OpSel2=''; + my $OpSel3=''; + my $Status = $ENV{'form.status'}; + if ( $Status eq 'Any' ) { $OpSel3='selected'; } + elsif ($Status eq 'Expired' ) { $OpSel2 = 'selected'; } + else { $OpSel1 = 'selected'; } + + my $Ptr = '
'."\n"; + $Ptr .= ' Sort by:   '."\n"; + $Ptr .= '   '; + $Ptr .= ''."\n"; + $Ptr .= '   '; + $Ptr .= ''."\n"; + $Ptr .= '   '; + $Ptr .= ''."\n"; + $Ptr .= '

'; + $Ptr .= ' Student Status:   '."\n". + ' '."\n"; + $Ptr .= '   '; + $Ptr .= ''."\n"; + $Ptr .= '
'."\n"; + $r->print( $Ptr ); +} + +sub CreateTableHeadings { + $r->print(''); + $r->print('User Name'); + $r->print('Domain'); + $r->print('Section'); + $r->print('PID'); + $r->print('Full Name'); + + my $ResId; + my $IterationNo = 0; + foreach $ResId (@cols) { + if ($IterationNo == 0) {$IterationNo++; next;} + if (!$ResId) { +# my $PrNo = sprintf( "%3d", $ProbNo ); +# $Str .= 'Chapter '.$PrNo.''; + $r->print('Chapter '.'0'.''); + } + } + + $r->print(''); + $r->rflush(); + + return; +} # ------------------------------------------------------------ Build page table @@ -224,141 +317,310 @@ sub tracetable { } } +sub usection { + my ($udom,$unam,$courseid,$ActiveFlag)=@_; + $courseid=~s/\_/\//g; + $courseid=~s/^(\w)/\/$1/; + + my %result=&Apache::lonnet::dump('roles',$udom,$unam); + + my($checkForError)=keys (%result); + if($checkForError =~ /^(con_lost|error|no_such_host)/i) { + return -1; + } -sub BuildChart { -# ----------------------- Get first and last resource, see if there is anything - my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}}; - my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}}; - if (($firstres) && ($lastres)) { -# ----------------------------------------------------------------- Render page - my $cid=$ENV{'request.course.id'}; - my $chome=$ENV{'course.'.$cid.'.home'}; - my ($cdom,$cnum)=split(/\_/,$cid); -# ---------------------------------------------- Read class list and row labels - my $classlst=&Apache::lonnet::reply - ('dump:'.$cdom.':'.$cnum.':classlist',$chome); - my $now=time; - unless ($classlst=~/^error\:/) { - foreach my $KeyPoint(sort split(/\&/,$classlst)) { - my ($name,$value)=split(/\=/,$KeyPoint); - my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value)); - my $active=1; - if (($end) && ($now>$end)) { $active=0; } - if ($active) { - my $thisindex=$#students+1; - $name=&Apache::lonnet::unescape($name); - $students[$thisindex]=$name; - my ($sname,$sdom)=split(/\:/,$name); - $PreCol[$thisindex]=$sname.':'; - my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid); - if ($ssec==-1) { - $rowlabels[$thisindex]= - 'Data not available: '.$name; - } else { - my %reply=&Apache::lonnet::idrget($sdom,$sname); - my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. - ':environment:lastname&generation&firstname&middlename', - &Apache::lonnet::homeserver($sname,$sdom)); - #$ssec=(int($ssec)) ? int($ssec) : $ssec; - my $sec=sprintf('%3s',$ssec); - $rowlabels[$thisindex]=$sec.' '.$reply{$sname}.' '; - $PreCol[$thisindex] .= $reply.':'.$sec; - my $i=0; - foreach (split(/\&/,$reply)) { - $i++; - if ( $_ ne '') { - $rowlabels[$thisindex].=&Apache::lonnet::unescape($_).' '; - } - if ($i == 2) { - chop($rowlabels[$thisindex]); - $rowlabels[$thisindex].=', '; - } - } - } + my $cursection='-1'; + my $oldsection='-1'; + my $status='Expired'; + foreach my $key (keys (%result)) { + my $value = $result{$key}; + if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) { + my $section=$1; + if ($key eq $courseid.'_st') { $section=''; } + my ($dummy,$end,$start)=split(/\_/,$value); + my $now=time; + my $notactive=0; + if ($start) { + if($now<$start) { + $notactive=1; + } + } + if($end) { + if ($now>$end) { + $notactive=1; } } + if($notactive == 0) { + $status='Active'; + $cursection=$section; + } + if($notactive == 1) { + $oldsection=$section; + } + } + } + if($status eq $ActiveFlag) { + if($cursection eq '-1') { + return $oldsection; + } + return $cursection; + } + if($ActiveFlag eq 'Any') { + if($cursection eq '-1') { + return $oldsection; + } + return $cursection; + } + return '-1'; +} +sub ProcessFullName { + my ($name)=@_; + my $Str = ''; + + if($CachData{$name.':lastname'} ne '') { + $Str .= $CachData{$name.':lastname'}.' '; + if($CachData{$name.':generation'} ne '') { + $Str .= $CachData{$name.':generation'}; } else { - $r->print('

Could not access course data

'); + chop($Str); } + $Str .= ', '; + if($CachData{$name.':firstname'} ne '') { + $Str .= $CachData{$name.':firstname'}.' '; + } + if($CachData{$name.':middlename'} ne '') { + $Str .= $CachData{$name.':middlename'}; + } else { + chop($Str); + if($CachData{$name.'firstname'} eq '') { + chop($Str); + } + } + } else { + if($CachData{$name.':firstname'} ne '') { + $Str .= $CachData{$name.':firstname'}.' '; + } + if($CachData{$name.':middlename'} ne '') { + $Str .= $CachData{$name.':middlename'}.' '; + } + if($CachData{$name.':generation'} ne '') { + $Str .= $CachData{$name.':generation'}; + } else { + chop($Str); + } + } - my $allstudents=$#students+1; - $r->print('

'.$allstudents.' students

'); - &CreateForm(); - $r->rflush(); + return $Str; +} -# --------------- Find all assessments and put them into some linear-like order - &tracetable($firstres,'&'.$lastres.'&'); -# ----------------------------------------------------------------- Start table +sub DownloadStudentInformation { + my ($name,$courseID)=@_; + my ($studentName,$studentDomain) = split(/\:/,$name); + my $checkForError; + my $key; + my $Status=$CachData{$name.':Status'}; + +#----------------------------------------------------------------- + # Download student environment data, specifically the full name and id. + my %studentInformation=&Apache::lonnet::get('environment', + ['lastname','generation', + 'firstname','middlename', + 'id'], + $studentDomain,$studentName); + if($c->aborted()) { + return; + } + ($checkForError)=keys (%studentInformation); + if($checkForError =~ /^(con_lost|error|no_such_host)/i) { + $CachData{$name.':error'}= + 'Could not download student environment data.'; +# return; + $CachData{$name.':lastname'}=''; + $CachData{$name.':generation'}=''; + $CachData{$name.':firstname'}=''; + $CachData{$name.':middlename'}=''; + $CachData{$name.':fullname'}=''; + $CachData{$name.':id'}=''; + } else { + $CachData{$name.':lastname'}=$studentInformation{'lastname'}; + $CachData{$name.':generation'}=$studentInformation{'generation'}; + $CachData{$name.':firstname'}=$studentInformation{'firstname'}; + $CachData{$name.':middlename'}=$studentInformation{'middlename'}; + $CachData{$name.':fullname'}=&ProcessFullName($name); + $CachData{$name.':id'}=$studentInformation{'id'}; + } - $r->print('

');
- 	my $index;
-        for ($index=0;$index<=$#students;$index++) {
-	    my $Str=&ExtractStudentData($index,$cid);
-	    $r->print($Str.'
'); - $r->rflush(); - $CachData{$PreCol[$index]}=$Str; - } - $r->print('
'); + # Download student course data + my %courseData=&Apache::lonnet::dump($courseID,$studentDomain, + $studentName); + if($c->aborted()) { + return; + } + ($checkForError)=keys (%courseData); + if($checkForError =~ /^(con_lost|error|no_such_host)/i) { + $CachData{$name.':error'}='Could not download course data.'; +# return; } else { - $r->print('

Undefined course sequence

'); + foreach $key (keys (%courseData)) { + $CachData{$name.':'.$key}=$courseData{$key}; + } + } + + # Get student's section number + my $sec=&usection($studentDomain, $studentName, $courseID, $Status); + if($sec != -1) { + $CachData{$name.':section'}=sprintf('%3s',$sec); + } else { + $CachData{$name.':section'}=''; } + + return; } -sub CreateForm { - my $Ptr = '
'."\n"; - $Ptr .= ' Sort by:   '."\n"; - $Ptr .= '   '; - $Ptr .= ''."\n"; - $Ptr .= '   '; - $Ptr .= ''."\n"; - $Ptr .= '   '; - $Ptr .= ''."\n"; - $Ptr .= '
'; - $Ptr .= ''."\n"; - $Ptr .= '
'."\n"; - $r->print( $Ptr ); +sub SortStudents { +# --------------------------------------------------------------- Sort Students + my $Pos = $ENV{'form.sort'}; + my @students = split(/:::/,$CachData{'NamesOfStudents'}); + my %sortData; + + if($Pos eq 'Last Name') { + for(my $index=0; $index<$#students+1; $index++) { + $sortData{$CachData{$students[$index].':fullname'}}= + $students[$index]; + } + } elsif($Pos eq 'Section') { + for(my $index=0; $index<$#students+1; $index++) { + $sortData{$CachData{$students[$index].':section'}. + $students[$index]}=$students[$index]; + } + } else { + # Sort by user name + for(my $index=0; $index<$#students+1; $index++) { + $sortData{$students[$index]}=$students[$index]; + } + } + + my @order = (); + foreach my $key (sort keys(%sortData)) { + push (@order,$sortData{$key}); + } + + return @order; } -sub CacheChart { - my @list = (); - my $count=0; +sub CollectClasslist { +# -------------------------------------------------------------- Get class list + my $cid=$ENV{'request.course.id'}; + my $chome=$ENV{'course.'.$cid.'.home'}; + my ($cdom,$cnum)=split(/\_/,$cid); + my %classlist=&Apache::lonnet::dump('classlist',$cdom,$cnum); + my @names = (); + + my($checkForError)=keys (%classlist); + if($checkForError =~ /^(con_lost|error|no_such_host)/i) { + $r->print('

Could not access course data

'); + push (@names, 'error'); + return @names; + } - my $Pos = $ENV{'form.sort'}; - if ( $Pos eq 'Last Name' ) {$Pos=1;} - elsif ( $Pos eq 'Section' ) {$Pos=2;} - else {$Pos=0;} +# ------------------------------------- Calculate Status and number of students + my $now=time; + foreach my $name (sort(keys(%classlist))) { + my $value=$classlist{$name}; + my ($end,$start)=split(/\:/,$value); + my $active=1; + my $Status=$ENV{'form.status'}; + $Status = ($Status) ? $Status : 'Active'; + if((($end) && $now > $end) && (($Status eq 'Active'))) { + $active=0; + } + if(($Status eq 'Expired') && ($end == 0 || $now < $end)) { + $active=0; + } + if($active) { + push(@names,$name); + $CachData{$name.':Status'}=$Status; + } + } + + $CachData{'NamesOfStudents'}=join(":::",@names); + + return @names; +} - foreach my $key( keys %CachData) { - my @Temp=split(/\:/,$key); - my $Use = $Temp[$Pos]; - $list[$count]=$Use.$key.'*'.$CachData{$key}; - $count++; +sub BuildChart { +# ----------------------- Get first and last resource, see if there is anything + my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}}; + my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}}; + if (!($firstres) || !($lastres)) { + $r->print('

Undefined course sequence

'); + return; } - @list = sort (@list); +# --------------- Find all assessments and put them into some linear-like order + &tracetable($firstres,'&'.$lastres.'&'); - $r->print('

'.$count.' students

'); +# ----------------------------------------------------------------- Render page &CreateForm(); + + my $cid=$ENV{'request.course.id'}; + my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". + "_$ENV{'user.domain'}_$cid\_chart.db"; + my $isCached = 0; + my @students; + if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) { + if (tie(%CachData,'GDBM_File',"$ChartDB",&GDBM_READER,0640)) { + $isCached = 1; + @students=&SortStudents(); + } else { + $r->print("Unable to tie hash to db file"); + $r->rflush(); + return; + } + } else { + if (tie(%CachData,'GDBM_File',$ChartDB,&GDBM_NEWDB,0640)) { + $isCached = 0; + @students=&CollectClasslist(); + if($students[0] eq 'error') { + return; + } + } else { + $r->print("Unable to tie hash to db file"); + return; + } + } + + $r->print('

'.($#students+1).' students

'); $r->rflush(); - - $r->print('

');
-    for ( my $n; $n < $count; $n++) {
-	my ($dummy, $Line) = split(/\*/,$list[$n]);
-	$r->print($Line.'
'); - } - $r->print('
'); + +# ----------------------------------------------------------------- Start table + $r->print(''); +# &CreateTableHeadings(); + my @updateStudentList = (); + foreach my $student (@students) { + if($c->aborted()) { + if($isCached == 0) { + $CachData{'NamesOfStudents'}=join(":::",@updateStudentList); + } + last; + } + if($isCached == 0) { + &DownloadStudentInformation($student,$cid); + push (@updateStudentList, $student); + } + my $Str=&ExtractStudentData($student,$cid); + $r->print(''.$Str.''); + } + $r->print('
'); + + untie(%CachData); + + return; } sub Start { - undef %hash; - undef %CachData; - undef @students; - undef @cols; - undef @rowlabels; - undef @PreCol; - - $r->print(''. + $r->print('<head><title>'. 'LON-CAPA Assessment Chart'); $r->print(''. ''. @@ -378,34 +640,22 @@ sub Start { # ------------------------------- This is going to take a while, produce output $r->rflush(); - my $cid=$ENV{'request.course.id'}; - my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}". - "_$ENV{'user.domain'}_$cid\_chart.db"; + &BuildChart(); - if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) { - if (tie(%CachData,'GDBM_File',"$ChartDB",&GDBM_READER,0640)) { - &CacheChart(); - } - else { - $r->print("Unable to tie hash to db file"); - } - } - else { - if (tie(%CachData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) { - foreach (keys %CachData) {delete $CachData{$_};} - &BuildChart(); - } - else { - $r->print("Unable to tie hash to db file"); - } - } - untie(%CachData); + $r->print(''); + + return; } # ================================================================ Main Handler sub handler { + undef %hash; + undef %CachData; + undef @cols; + $r=shift; + $c = $r->connection; if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { # ------------------------------------------- Set document type for header only if ($r->header_only) { @@ -429,8 +679,10 @@ sub handler { # ---------------------------------------------------------------- Send headers $r->content_type('text/html'); $r->send_http_header; + $r->print(''); &Start(); - $r->print(''); + $r->print(''); + $r->rflush(); # ------------------------------------------------------------- End render page } else { $r->content_type('text/html'); @@ -459,10 +711,3 @@ sub handler { } 1; __END__ - - - - - - -