--- loncom/interface/Attic/lonchart.pm 2001/02/06 20:50:04 1.4 +++ loncom/interface/Attic/lonchart.pm 2002/07/01 21:12:06 1.49 @@ -1,4 +1,30 @@ # The LearningOnline Network with CAPA +# (Publication Handler +# +# $Id: lonchart.pm,v 1.49 2002/07/01 21:12:06 stredwic Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# # Homework Performance Chart # # (Navigate Maps Handler @@ -6,303 +32,1095 @@ # (Page Handler # # (TeX Content Handler -# +# YEAR=2000 # 05/29/00,05/30 Gerd Kortemeyer) # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23, # 10/02,10/10,10/14,10/16,10/18,10/19,10/31,11/6,11/14,11/16 Gerd Kortemeyer) +# YEAR=2001 +# 3/1/1,6/1,17/1,29/1,30/1,31/1 Gerd Kortemeyer) +# 7/10/01 Behrouz Minaei +# 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, 2/28 Behrouz Minaei # -# 3/1/1,6/1,17/1,29/1,30/1 Gerd Kortemeyer) -# -# 1/31 Gerd Kortemeyer +### package Apache::lonchart; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet(); +use Apache::loncommon(); use HTML::TokeParser; use GDBM_File; -# -------------------------------------------------------------- Module Globals -my %hash; -my @cols; -my @rowlabels; -my @students; - -# ------------------------------------------------------------- Find out status - -sub astatus { - my ($rid,$student)=@_; - my ($uname,$udom)=split(/\:/,$student); - my $code=' '; - $rid=~/(\d+)\.(\d+)/; - my $symb=&Apache::lonnet::declutter($hash{'map_id_'.$1}).'___'.$2.'___'. - &Apache::lonnet::declutter($hash{'src_'.$rid}); - my $answer=&Apache::lonnet::reply( - "restore:$udom:$uname:". - $ENV{'request.course.id'}.':'. - &Apache::lonnet::escape($symb), - &Apache::lonnet::homeserver($uname,$udom)); - my %returnhash=(); - map { - my ($name,$value)=split(/\=/,$_); - $returnhash{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } split(/\&/,$answer); - if ($returnhash{'version'}) { - my $version; - for ($version=1;$version<=$returnhash{'version'};$version++) { - map { - $returnhash{$_}=$returnhash{$version.':'.$_}; - } split(/\:/,$returnhash{$version.':keys'}); - } - my $totaltries=0; - map { - if (($_=~/\.(\w+)\.solved$/) && ($_!~/^\d+\:/)) { - my $part=$1; - if ($returnhash{$_} eq 'correct_by_student') { - unless (($code eq '.') || ($code eq '-')) { $code='*'; } - $totaltries+=$returnhash{'resource.'.$part.'.tries'}; - } elsif ($returnhash{$_} eq 'correct_by_override') { - unless (($code eq '.') || ($code eq '-')) { $code='+'; } - } elsif ($returnhash{$_} eq 'incorrect_attempted') { - $code='.'; - } elsif ($returnhash{$_} eq 'incorrect_by_override') { - $code='-'; - } elsif ($returnhash{$_} eq 'excused') { - unless (($code eq '.') || ($code eq '-')) { $code='x'; } - } - } - } keys %returnhash; - if (($code eq '*') && ($totaltries<10)) { $code="$totaltries"; } - } - return $code; -} - -# ------------------------------------------------------------ Build page table - -sub tracetable { - my ($rid,$beenhere)=@_; - unless ($beenhere=~/\&$rid\&/) { - $beenhere.=$rid.'&'; - if (defined($hash{'is_map_'.$rid})) { - if ($hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}} - eq 'sequence') { - $cols[$#cols+1]=0; - } - if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) && - (defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) { - my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}}; - - &tracetable($hash{'map_start_'.$hash{'src_'.$rid}}, - '&'.$frid.'&'); - - if ($hash{'src_'.$frid}) { - if ($hash{'src_'.$frid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $cols[$#cols+1]=$frid; - } - } - - } - } else { - if ($hash{'src_'.$rid}) { - if ($hash{'src_'.$rid}=~ - /\.(problem|exam|quiz|assess|survey|form)$/) { - $cols[$#cols+1]=$rid; - } - } - } - if (defined($hash{'to_'.$rid})) { - map { - &tracetable($hash{'goesto_'.$_},$beenhere); - } split(/\,/,$hash{'to_'.$rid}); - } +my $jr; +# ----- FORMAT PRINT DATA ---------------------------------------------- + +sub FormatStudentInformation { + my ($cache,$name,$studentInformation,$reselected,$spacePadding)=@_; + my $Str='
'; + + for(my $index=0; $index<(scalar @$studentInformation); $index++) { + if(!&ShouldShowColumn($reselected, 'heading', $index)) { + next; + } + my $data=$cache->{$name.':'.$studentInformation->[$index]}; + $Str .= $data; + + my @dataLength=split(//,$data); + my $length=scalar @dataLength; + $Str .= (' 'x($cache->{$studentInformation->[$index].'Length'}- + $length)); + $Str .= $spacePadding; } + + return $Str; } -# ================================================================ Main Handler +sub FormatStudentData { + my ($reselected,$name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_; + my ($sname,$sdom) = split(/\:/,$name); + my $Str; + my %CacheData; -sub handler { - my $r=shift; + unless(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) { + return ''; + } + # Handle Student information ------------------------------------------ + # Handle user data + $Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation, + $reselected, $spacePadding); + + # Handle errors + if($CacheData{$name.':error'} =~ /environment/) { + untie(%CacheData); + $Str .= ''; + return $Str; +# my $errorMessage = $CacheData{$name.':error'}; +# return '
'; + + for(my $index=0; $index<(scalar @$headings); $index++) { + if(!&ShouldShowColumn($reselected, 'heading', $index)) { + next; + } + + my $data=$$headings[$index]; + $Str .= $data; + + my @dataLength=split(//,$data); + my $length=scalar @dataLength; + $Str .= (' 'x($CacheData->{$$studentInformation[$index].'Length'}- + $length)); + $Str .= $spacePadding; + } + foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) { + if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) { + next; + } + + my $name = $CacheData->{$sequence.':title'}; + $Str .= $name; + my @titleLength=split(//,$CacheData->{$sequence.':title'}); + my $leftover=$CacheData->{$sequence.':columnWidth'}- + (scalar @titleLength); + $Str .= (' 'x$leftover); + $Str .= $spacePadding; + } + + $Str .= 'Total Solved/Total Problems'; + $Str .= ''; + + return $Str; +} + +sub CreateColumnSelectionBox { + my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_; + + my $missing=0; + my $notThere='
'; + 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 .= ''; + $position+=2; + $present .= (' 'x($length-$position)); + $present .= $spacePadding; + $found++; + } - &tracetable($firstres,'&'.$lastres.'&'); + 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 .= ''; + $position+=2; + $present .= (' 'x($length-$position)); + $present .= $spacePadding; + $found++; + } -# ----------------------------------------------------------------- Start table + if($found) { + $present .= ''; + $present = $present; + } else { + $present = ''; + } - $r->print('
'); - my $index; - for ($index=0;$index<=$#students;$index++) { - $r->print( - substr($students[$index]. - ' ',0,14).' ! '. - substr($rowlabels[$index]. - ' ',0,45).' ! '); - map { - if ($_) { - $r->print(&astatus($_,$students[$index])); - } else { - $r->print(' ! '); - } - } @cols; - $r->print("\n"); - $r->rflush(); - } - $r->print(''); - - } else { - $r->print('