'."\n";
+
+ return $Str;
+}
+
+=pod
+
+=item &FormatStudentData()
+
+First, FormatStudentInformation is called and prefixes the course information.
+This function produces a formatted string of the student's course information.
+Each column of data represents all the problems for a given sequence. For
+valid grade data, a link is created for that problem to a submission record
+for that problem.
+
+=over 4
+
+Input: $name, $studentInformation, $ChartDB
+
+$name: The name and domain of the current student in name:domain format
+
+$studentInformation: A pointer to an array holding the names used to
+remove data from the hash. They represent
+the name of the data to be removed.
+
+$ChartDB: The name of the cached data database which will be tied to that
+database.
+
+Output: $Str
+
+$Str: Formatted string that is an entire row of the chart. It is a
+concatenation of student information and student course information.
+
+=back
+
+=cut
+
sub StudentReport {
- my ($cache, $name)=@_;
+ my ($cache,$name,$spacing,$showSequences)=@_;
+ my ($username,$domain)=split(':',$name);
my $Str = '';
if($cache->{$name.':error'} =~ /course/) {
- my ($username)=split(':',$name);
$Str .= 'No course data for student ';
$Str .= ''.$username.'. ';
return $Str;
}
- $Str .= "
\#
Set Title
";
- $Str .= '
Results
Tries
'."\n";
-
- my $codes;
- my $attempts;
- foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
- if($cache->{'StudentAssessmentMap'} ne 'All Maps' &&
- $cache->{'StudentAssessmentMap'} ne $cache->{$sequence.':title'}) {
- next;
- }
-
- $Str .= '
'.$sequence.'
';
- $Str .= '
'.$cache->{$sequence.':title'}.'
';
-
- $codes = '';
- $attempts = '';
+ my $Version;
+ my $problemsCorrect = 0;
+ my $totalProblems = 0;
+ my $problemsSolved = 0;
+ my $numberOfParts = 0;
+# foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
+ foreach my $sequence (@$showSequences) {
+ my $characterCount=0;
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {
my $problem = $cache->{$problemID.':problem'};
my $LatestVersion = $cache->{$name.':version:'.$problem};
@@ -172,8 +272,9 @@ sub StudentReport {
foreach my $part (split(/\:/,$cache->{$sequence.':'.
$problemID.
':parts'})) {
- $codes .= "-,";
- $attempts .= "0,";
+ $Str .= ' ';
+ $totalProblems++;
+ $characterCount++;
}
next;
}
@@ -186,7 +287,7 @@ sub StudentReport {
$problemID.
':parts'})) {
$partData{$part.':tries'}=0;
- $partData{$part.':code'}='-';
+ $partData{$part.':code'}=' ';
}
# Looping through all the versions of each part, starting with the
@@ -204,43 +305,326 @@ sub StudentReport {
}
my $tries=0;
- my $code='U';
+ my $code=' ';
- $tries = $cache->{$name.":$Version:$problem".
- ":resource.$part.tries"};
+ $tries = $cache->{$name.':'.$Version.':'.$problem.
+ ':resource.'.$part.'.tries'};
$partData{$part.':tries'}=($tries) ? $tries : 0;
- my $val = $cache->{$name.":$Version:$problem".
- ":resource.$part.solved"};
- if ($val eq 'correct_by_student') {$code = 'Y';}
- elsif ($val eq 'correct_by_override') {$code = 'y';}
- elsif ($val eq 'incorrect_attempted') {$code = 'N';}
- elsif ($val eq 'incorrect_by_override'){$code = 'N';}
+ my $val = $cache->{$name.':'.$Version.':'.$problem.
+ ':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 = ' ';}
$partData{$part.':code'}=$code;
}
}
- # Loop through all the parts for the current problem in the
- # correct order and prepare the output
- foreach (split(/\:/,$cache->{$sequence.':'.$problemID.
- ':parts'})) {
- $codes .= $partData{$_.':code'}.',';
- $attempts .= $partData{$_.':tries'}.',';
- }
- }
- $codes =~ s/,$//;
- $attempts =~ s/,$//;
- $Str .= '
'."\n";
+ # Output the total correct problems over the total number of problems.
+ # I don't like this type of formatting, but it is a solution. Need
+ # a way to dynamically determine the space requirements.
+ my $outputProblemsSolved = sprintf( "%4d", $problemsSolved );
+ my $outputTotalProblems = sprintf( "%4d", $totalProblems );
+ $Str .= ''.$outputProblemsSolved.
+ ' / '.$outputTotalProblems.'';
return $Str;
}
+=pod
+
+=item &CreateLegend()
+
+This function returns a formatted string containing the legend for the
+chart. The legend describes the symbols used to represent grades for
+problems.
+
+=cut
+
+sub CreateLegend {
+ my $Str = "
".
+ "1..9: correct by student in 1..9 tries\n".
+ " *: correct by student in more than 9 tries\n".
+ " +: correct by override\n".
+ " -: incorrect by override\n".
+ " .: incorrect attempted\n".
+ " #: ungraded attempted\n".
+ " : not attempted\n".
+ " x: excused".
+ "
";
+ return $Str;
+}
+
+=pod
+
+=item &CreateColumnSelectionBox()
+
+If there are columns not being displayed then this selection box is created
+with a list of those columns. When selections are made and the page
+refreshed, the columns will be removed from this box and the column is
+put back in the chart. If there is no columns to select, no row is added
+to the interface table.
+
+=over 4
+Input: $CacheData, $headings
+
+
+$CacheData: A pointer to a hash tied to the cached data
+
+$headings: An array of the names of the columns for the student information.
+They are used for displaying which columns are missing.
+
+Output: $notThere
+
+$notThere: The string contains one row of a table. The first column has the
+name of the selection box. The second contains the selection box
+which has a size of four.
+
+=back
+
+=cut
+
+sub CreateColumnSelectionBox {
+ my ($CacheData,$headings)=@_;
+
+ my $missing=0;
+ my $notThere='
Select column to view:';
+ my $name;
+ $notThere .= '
';
+ $notThere .= '';
+ } else {
+ $notThere='
';
+ }
+
+ return $notThere.'
';
+}
+
+=pod
+
+=item &CreateColumnSelectors()
+
+This function generates the checkboxes above the column headings. The
+column will be removed if the checkbox is unchecked.
+
+=over 4
+
+Input: $CacheData, $headings
+
+$CacheData: A pointer to a hash tied to the cached data
+
+$headings: An array of the names of the columns for the student
+information. They are used to know what are the student information columns
+
+Output: $present
+
+$present: The string contains the first row of a table. Each column contains
+a checkbox which is left justified. Currently left justification is used
+for consistency of location over the column in which it presides.
+
+=back
+
+=cut
+
+sub CreateColumnSelectors {
+ my ($headings)=@_;
+=pod
+ my $found=0;
+ my ($name, $length, $position);
+
+ my $present = '