[LON-CAPA-cvs] cvs: loncom /interface/statistics lonstudentsubmissions.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Thu, 02 Sep 2004 21:02:54 -0000
This is a MIME encoded message
--matthew1094158974
Content-Type: text/plain
matthew Thu Sep 2 17:02:54 2004 EDT
Modified files:
/loncom/interface/statistics lonstudentsubmissions.pm
Log:
Pretty much a complete rewrite. Provides both html & excel output for
(currently) one problem. It's generally pretty concise and works just fine
on a 500 student class.
--matthew1094158974
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040902170254.txt"
Index: loncom/interface/statistics/lonstudentsubmissions.pm
diff -u loncom/interface/statistics/lonstudentsubmissions.pm:1.15 loncom/interface/statistics/lonstudentsubmissions.pm:1.16
--- loncom/interface/statistics/lonstudentsubmissions.pm:1.15 Wed Sep 1 17:13:04 2004
+++ loncom/interface/statistics/lonstudentsubmissions.pm Thu Sep 2 17:02:54 2004
@@ -1,6 +1,6 @@
# The LearningOnline Network with CAPA
#
-# $Id: lonstudentsubmissions.pm,v 1.15 2004/09/01 21:13:04 matthew Exp $
+# $Id: lonstudentsubmissions.pm,v 1.16 2004/09/02 21:02:54 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -46,7 +46,7 @@
{ name => 'SelectAnother',
text => 'Choose a different Problem' },
{ name => 'Generate',
- text => 'Generate Spreadsheet'},
+ text => 'Generate Report'},
);
sub BuildStudentSubmissionsPage {
@@ -131,10 +131,13 @@
my $ProblemData = $Data{$current_problem->{'part'}.
'.'.
$current_problem->{'respid'}};
- &prepare_html_output($r,$current_problem,
- $ProblemData,\@Students);
-# &prepare_excel_output($r,$current_problem,
-# $ProblemData,\@Students);
+ if ($ENV{'form.output'} eq 'excel') {
+ &prepare_excel_output($r,$current_problem,
+ $ProblemData,\@Students);
+ } else {
+ &prepare_html_output($r,$current_problem,
+ $ProblemData,\@Students);
+ }
}
$r->print('<hr />');
} else {
@@ -148,6 +151,27 @@
#########################################################
#########################################################
+
+my @DefaultColumns =
+ (
+ {name=>'username',
+ display=>'Student'},
+ {name=>'domain',
+ display=>'Domain'},
+ {name => 'id',
+ display => 'Id'},
+ {name => 'time',
+ display =>'Time'},
+ {name => 'attempt',
+ display =>'Attempt'},
+ {name => 'awarddetail',
+ display =>'Awarddetail'},
+ {name => 'grading',
+ display =>'Score'},
+ );
+
+#########################################################
+#########################################################
##
## prepare_html_output
##
@@ -159,14 +183,16 @@
my ($resource,$respid,$partid) = ($problem->{'resource'},
$problem->{'respid'},
$problem->{'part'});
- $r->print('<h2>'.&mt('Student Responses').'</h2>');
#
if ($ENV{'form.correctans'} eq 'true') {
+ $r->print('<h2>'.&mt('Generating Correct Answers').'</h2>');
&Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students,
'Statistics',
'stats_status');
}
#
+ $r->print('<h2>'.&mt('Student Responses').'</h2>');
+ #
$r->rflush();
my $response_type;
for (my $i=0;
@@ -182,22 +208,30 @@
$r->print('<h2>'.&mt('Unable to determine response type').'</h2>');
} else {
my $count = 0;
- my $header;
+ my @Columns;
+ if (exists($ENV{'form.concise'}) && $ENV{'form.concise'} eq 'true') {
+ foreach (@DefaultColumns) {
+ if ($_->{'name'} =~ /^(username|domain|id)$/){
+ push(@Columns,$_);
+ }
+ }
+ } else {
+ @Columns = @DefaultColumns;
+ }
+ my $header = '<table>'.$/.&html_headers(\@Columns);
if ($response_type eq 'essay') {
- $header = &html_essay_header();
- } elsif ($response_type eq 'radiobutton') {
- $header = &html_radiobutton_header();
+ $header .= &html_essay_headers();
} elsif ($response_type eq 'option') {
- $header = &html_option_header();
+ $header .= &html_option_headers();
} else {
- $header = &html_generic_header();
+ $header .= &html_generic_headers();
}
$header = '<tr>'.$header.'</tr>';
#
- $r->print($/.'<table>'.$/.$header.$/);
+ $r->print($/.$header.$/);
foreach my $student (@$Students) {
if ($count >= 50) {
- $r->print('</table>'.$/.'<table>'.$/.$header.$/);
+ $r->print('</table>'.$/.$header.$/);
$count = 0;
}
last if ($c->aborted());
@@ -211,25 +245,45 @@
next;
}
my $data;
- $data->{'sname'} = $student->{'username'}.'@'.
- $student->{'domain'};
+ $data->{'username'} = $student->{'username'};
+ $data->{'domain'} = $student->{'domain'};
+ $data->{'id'} = $student->{'id'};
+ $data->{'fullname'} = $student->{'fullanem'};
+ $data->{'status'} = $student->{'status'};
$data->{'time'} = &Apache::lonlocal::locallocaltime
($response->[&Apache::loncoursedata::RDs_timestamp()]);
$data->{'attempt'} =
$response->[&Apache::loncoursedata::RDs_tries()];
- $data->{'submission'} =
- $response->[&Apache::loncoursedata::RDs_submission()];
- $data->{'correct'} = $student->{'answer'};
- my $row;
+ $data->{'awarded'} =
+ $response->[&Apache::loncoursedata::RDs_awarded()];
+ $data->{'awarddetail'} =
+ $response->[&Apache::loncoursedata::RDs_awarddetail()];
+ my $rowextra = 'bgcolor="#CCCCCC"';
+ if ($count % 2 == 1) {
+ $rowextra = 'bgcolor="#EEEEEE"';
+ }
+ my $row = '<tr '.$rowextra.'>';
+ foreach my $col (@Columns) {
+ $row .= '<td valign="top">'.
+ $data->{$col->{'name'}}.'</td>';
+ }
if ($response_type eq 'essay') {
- $row = &html_essay($data);
- } elsif ($response_type eq 'radiobutton') {
- $row = &html_radiobutton($data);
+ $row .= &html_essay
+ ($response->[&Apache::loncoursedata::RDs_submission()],
+ $student->{'answer'},
+ scalar(@Columns),$rowextra);
} elsif ($response_type eq 'option') {
- $row = &html_option($data);
+ $row .= &html_option
+ ($response->[&Apache::loncoursedata::RDs_submission()],
+ $student->{'answer'},
+ scalar(@Columns),$rowextra);
} else {
- $row = &html_generic($data);
+ $row .= &html_generic
+ ($response->[&Apache::loncoursedata::RDs_submission()],
+ $student->{'answer'},
+ scalar(@Columns),$rowextra);
}
+ $row .= '</tr>';
$r->print($row.$/);
$count++;
}
@@ -244,59 +298,31 @@
## HTML helper routines
##
#####################################################
-my @FullHeaders = (
- {name=>'sname',
- display=>'Student'},
- {name => 'id',
- display => 'Id'},
- {name => 'time',
- display =>'Time'},
- {name => 'attempt',
- display =>'Attempt'},
- {name => 'grading',
- display =>'Grading'},
- );
-
-sub html_essay_header {
- my $header;
- if ($ENV{'form.subdata'} eq 'true') {
- foreach (@FullHeaders) {
- $header .= '<th>'.&mt($_->{'display'}).'</th>';
- }
- } else {
- $header = '<th>'.&mt('Username and Submission').'</th>';
+sub html_headers {
+ my ($Columns) = @_;
+ my $Str;
+ foreach my $column (@$Columns) {
+ $Str .= '<th align="left">'.$column->{'display'}.'</th>';
}
- return $header;
+ return $Str;
}
sub html_essay {
- my ($data)=@_;
+ my ($submission,$correct,$tablewidth,$rowextra)=@_;
#
- $data->{'submission'} =~ s|\\r\\n|$/|g;
- $data->{'submission'} =
- &HTML::Entities::encode($data->{'submission'},'<>&"');
- $data->{'submission'} =~ s|$/\s*$/|$/</p><p>$/|g;
- $data->{'submission'} =~ s|\\||g;
- $data->{'submission'} = '<p>'.$data->{'submission'}.'</p>';
- #
- my $Str = '<tr>';
- if ($ENV{'form.subdata'} eq 'true') {
- $Str .=
- '<td><b>'.$data->{'sname'}.'</b></td>'.
- '<td>'.$data->{'time'}.'</td>'.
- '<td>'.$data->{'attempt'}.'</td>';
- $Str .= '</tr>';
- $Str .= '<tr><td colspan="'.scalar(@FullHeaders).'">'.
- $data->{'submission'}.'</td>';
- } else {
- $Str .= '<td><b>'.$data->{'sname'}.'</b>'.
- $data->{'submission'}.'</td>';
- }
+ $submission =~ s|\\r\\n|$/|g;
+ $submission = &HTML::Entities::encode($submission,'<>&"');
+ $submission =~ s|$/\s*$/|$/</p><p>$/|g;
+ $submission =~ s|\\||g;
+ $submission = '<p>'.$submission.'</p>';
+ #
+ my $Str = '</tr><tr '.$rowextra.'>'.
+ '<td colspan="'.$tablewidth.'">'.$submission.'</td>';
if ($ENV{'form.correctans'} eq 'true') {
$Str .= '</tr>';
- if (defined($data->{'correct'}) && $data->{'correct'} !~ /^\s*$/) {
- $Str .= '<tr><td colspan="'.scalar(@FullHeaders).'">'.
- '<b>'.&mt('Correct Answer:').'</b>'.$data->{'correct'}.'</td>';
+ if (defined($correct) && $correct !~ /^\s*$/) {
+ $Str .= '<tr '.$rowextra.'><td colspan="'.$tablewidth.'">'.
+ '<b>'.&mt('Correct Answer:').'</b>'.$correct.'</td>';
}
}
$Str .= '</tr>';
@@ -304,17 +330,12 @@
return $Str;
}
-sub html_radiobutton_header {
- my $header;
- if ($ENV{'form.subdata'} eq 'true') {
- foreach (@FullHeaders) {
- $header .= '<th>'.&mt($_->{'display'}).'</th>';
- }
- } else {
- $header =
- '<th>'.&mt('Username').'</th>';
- }
- $header .='<th>'.&mt('Submission').'</th>';
+sub html_essay_headers {
+ return '';
+}
+
+sub html_generic_headers {
+ my $header ='<th>'.&mt('Submission').'</th>';
if ($ENV{'form.correctans'} eq 'true') {
$header .= '<th>'.&mt('Correct').'</th>';
}
@@ -322,256 +343,48 @@
}
sub html_radiobutton {
- my ($data)=@_;
- #
- $data->{'submission'} =~ s/=([^=])$//;
- #
- my $Str = '<tr>';
- if ($ENV{'form.subdata'} eq 'true') {
- $Str .=
- '<td>'.'<b>'.$data->{'sname'}.'</b></td>'.
- '<td>'.$data->{'time'}.'</td>'.
- '<td>'.$data->{'attempt'}.'</td>';
- $Str .= '<td>'.$data->{'submission'}.'</td>';
- if ($ENV{'form.correctans'} eq 'true') {
- $Str .= '<td>'.$data->{'correct'}.'</td>';
- }
- } else {
- $Str .= '<td><b>'.$data->{'sname'}.'</b></td>';
- $Str .= '<td>'.$data->{'submission'}.'</td>';
- if ($ENV{'form.correctans'} eq 'true') {
- $Str .= '<td>'.$data->{'correct'}.'</td>';
- }
- }
- $Str .= '</tr>';
- #
- return $Str;
-}
-
-sub html_generic_header {
- my $header;
- if ($ENV{'form.subdata'} eq 'true') {
- foreach (@FullHeaders) {
- $header .= '<th>'.&mt($_->{'display'}).'</th>';
- }
- } else {
- $header =
- '<th>'.&mt('Username').'</th>';
- }
- $header .= '<th>'.&mt('Submission').'</th>';
- if ($ENV{'form.correctans'} eq 'true') {
- $header .= '<th>'.&mt('Correct').'</th>';
- }
- return $header;
+ my ($submission,$correct,$tablewidth,$rowclass)=@_;
+ $submission =~ s/=([^=])$//;
+ return &html_generic_results($submission,$correct,$tablewidth,$rowclass);
}
sub html_generic {
- my ($data)=@_;
- $data->{'submission'} = &Apache::lonnet::unescape($data->{'submission'});
- my $Str = '<tr>';
- if ($ENV{'form.subdata'} eq 'true') {
- $Str .=
- '<td><b>'.$data->{'sname'}.'</b></td>'.
- '<td>'.$data->{'time'}.'</td>'.
- '<td>'.$data->{'attempt'}.'</td>';
- } else {
- $Str .= '<td><b>'.$data->{'sname'}.'</b></td>';
- }
- $Str .= '<td>'.$data->{'submission'}.'</td>';
+ my ($submission,$correct,$tablewidth,$rowclass)=@_;
+ my $Str .= '<td>'.$submission.'</td>';
if ($ENV{'form.correctans'} eq 'true') {
- $Str .= '<td>'.$data->{'correct'}.'</td>';
+ $Str .= '<td>'.$correct.'</td>';
}
$Str .= '</tr>';
return $Str;
}
-sub html_option_header {
- my $header;
- if ($ENV{'form.subdata'} eq 'true') {
- foreach (@FullHeaders) {
- $header .= '<th>'.&mt($_->{'display'}).'</th>';
- }
- } else {
- $header =
- '<th>'.&mt('Username').'</th>';
- }
- $header .= '<th>'.&mt('Submission').'</th>';
- if ($ENV{'form.correctans'} eq 'true') {
- $header .= '<th>'.&mt('Correct').'</th>';
- }
- return $header;
+sub html_option_headers {
+ return &html_generic_headers();
}
sub html_option {
- my ($data)=@_;
- $data->{'submission'} = '<ul class="studentans">'.
- '<li>'.join('</li><li>',
- map {
- &Apache::lonnet::unescape($_) ;
- } sort split('&',$data->{'submission'})).
- '</li><ul>';
- $data->{'correct'} = '<ul class="correctans">'.
+ my ($submission,$correct,$tablewidth,$rowclass)=@_;
+ $submission =
+ '<ul class="sub_studentans">'.
'<li>'.join('</li><li>',
map {
&Apache::lonnet::unescape($_) ;
- } sort split('&',$data->{'correct'})).'</li></ul>';
- my $Str = '<tr>';
- if ($ENV{'form.subdata'} eq 'true') {
- $Str .=
- '<td><b>'.$data->{'sname'}.'</b></td>'.
- '<td>'.$data->{'time'}.'</td>'.
- '<td>'.$data->{'attempt'}.'</td>';
- } else {
- $Str .= '<td><b>'.$data->{'sname'}.'</b></td>';
- }
- $Str .= '<td>'.$data->{'submission'}.'</td>';
- if ($ENV{'form.correctans'} eq 'true') {
- $Str .= '<td>'.$data->{'correct'}.'</td>';
- }
- $Str .= '</tr>';
- return $Str;
-}
-
-
-=pod
-
- my @Columns;
- push(@Columns,'username');
- push(@Columns,'domain');
- push(@Columns,'attempt');
- push(@Columns,'time');
- push(@Columns,'submission');
- if ($ENV{'form.correctans'} eq 'true') { push(@Columns,'correct'); }
- push(@Columns,'grading');
- push(@Columns,'awarded');
- my $awarded_col = $#Columns;
- push(@Columns,'weight');
- my $weight_col = $#Columns;
- push(@Columns,'score');
- #
- # Create excel worksheet
- my $filename = '/prtspool/'.
- $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
- time.'_'.rand(1000000000).'.xls';
- my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
- if (! defined($workbook)) {
- $r->log_error("Error creating excel spreadsheet $filename: $!");
- $r->print('<p>'.&mt("Unable to create new Excel file. ".
- "This error has been logged. ".
- "Please alert your LON-CAPA administrator").
- '</p>');
- return undef;
- }
- #
- $workbook->set_tempdir('/home/httpd/perl/tmp');
- #
- my $format = &Apache::loncommon::define_excel_formats($workbook);
- my $worksheet = $workbook->addworksheet('Student Submission Data');
- #
- # Make sure we get new weight data instead of data on a 10 minute delay
- &Apache::lonnet::clear_EXT_cache_status();
- #
- # Put on the standard headers and whatnot
- my $rows_output=0;
- $worksheet->write($rows_output++,0,$resource->{'title'},$format->{'h1'});
- $worksheet->write($rows_output++,0,$resource->{'src'},$format->{'h3'});
- $rows_output++;
- $worksheet->write_row($rows_output++,0,\@Columns,$format->{'bold'});
- #
- # Populate the worksheet with the student data
- foreach my $student (@$Students) {
- last if ($c->aborted());
- my $results = &Apache::loncoursedata::get_response_data_by_student
- ($student,$resource->{'symb'},$respid);
- my %row;
- $row{'username'} = $student->{'username'};
- $row{'domain'} = $student->{'domain'};
- $row{'correct'} = $student->{'answer'};
- $row{'weight'} = &Apache::lonnet::EXT
- ('resource.'.$partid.'.weight',$resource->{'symb'},
- undef,undef,undef);
- if (! defined($results) || ref($results) ne 'ARRAY') {
- $row{'score'} = '='.
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($rows_output,$awarded_col)
- .'*'.
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($rows_output,$weight_col);
- my $cols_output = 0;
- foreach my $col (@Columns) {
- if (! exists($row{$col})) {
- $cols_output++;
- next;
- }
- $worksheet->write($rows_output,$cols_output++,$row{$col});
- }
- $rows_output++;
- } else {
- for (my $i=0;$i<scalar(@$results);$i++) {
- my $response = $results->[$i];
- if ($ENV{'form.last_sub_only'} eq 'true' &&
- $i < (scalar(@$results)-1)) {
- next;
- }
- delete($row{'time'});
- delete($row{'attempt'});
- delete($row{'submission'});
- delete($row{'awarded'});
- delete($row{'grading'});
- delete($row{'score'});
- my %row_format;
- #
- # Time is handled differently
- $row{'time'} = &Apache::lonstathelpers::calc_serial
- ($response->[&Apache::loncoursedata::RDs_timestamp()]);
- $row_format{'time'}=$format->{'date'};
- #
- $row{'attempt'} = $response->[
- &Apache::loncoursedata::RDs_tries()];
- $row{'submission'} = $response->[
- &Apache::loncoursedata::RDs_submission()];
- if ($row{'submission'} =~ m/^=/) {
- # This will be interpreted as a formula. That is bad!
- $row{'submission'} = " ".$row{'submission'};
- }
- $row{'grading'} = $response->[
- &Apache::loncoursedata::RDs_awarddetail()];
- $row{'awarded'} = $response->[
- &Apache::loncoursedata::RDs_awarded()];
- $row{'score'} = '='.
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($rows_output,$awarded_col)
- .'*'.
- &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
- ($rows_output,$weight_col);
- my $cols_output = 0;
- foreach my $col (@Columns) {
- $worksheet->write($rows_output,$cols_output++,$row{$col},
- $row_format{$col});
- }
- $rows_output++;
- }
- } # End of else clause on if (! defined($results) ....
+ } sort split('&',$submission)
+ ).
+ '</li><ul>';
+ if (defined($correct) && $correct !~ /^\s*$/) {
+ $correct = '<ul class="sub_correctans">'.
+ '<li>'.join('</li><li>',
+ map {
+ &Apache::lonnet::unescape($_) ;
+ } sort split('&',$correct)
+ ).
+ '</li></ul>';
}
#
- # Close the excel file
- $workbook->close();
- #
- # Write a link to allow them to download it
- $r->print('<p><a href="'.$filename.'">'.
- &mt('Your Excel spreadsheet.').
- '</a></p>'."\n");
- $r->print('<script>'.
- 'window.document.Statistics.stats_status.value="'.
- 'Done compiling spreadsheet. See link below to download.'.
- '";</script>');
- $r->rflush();
- return;
-
+ return &html_generic($submission,$correct,$tablewidth,$rowclass);
}
-=cut
-
#########################################################
#########################################################
##
@@ -596,12 +409,12 @@
&Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students,
'Statistics',
'stats_status');
+ $r->print('<script>'.
+ 'window.document.Statistics.stats_status.value="'.
+ 'Done computing student answers. Compiling spreadsheet.'.
+ '";</script>');
}
#
- $r->print('<script>'.
- 'window.document.Statistics.stats_status.value="'.
- 'Done computing student answers. Compiling spreadsheet.'.
- '";</script>');
$r->rflush();
my @Columns;
push(@Columns,'username');
@@ -647,8 +460,13 @@
$worksheet->write_row($rows_output++,0,\@Columns,$format->{'bold'});
#
# Populate the worksheet with the student data
+ my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,'Excel File Compilation Status',
+ 'Excel File Compilation Progress',
+ scalar(@$Students),'inline',undef,'Statistics','stats_status');
foreach my $student (@$Students) {
last if ($c->aborted());
+
my $results = &Apache::loncoursedata::get_response_data_by_student
($student,$resource->{'symb'},$respid);
my %row;
@@ -720,7 +538,10 @@
$rows_output++;
}
} # End of else clause on if (! defined($results) ....
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
+ 'last student');
}
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
#
# Close the excel file
$workbook->close();
@@ -746,6 +567,17 @@
#########################################################
sub CreateInterface {
##
+ ## Output Selection
+ my $OutputSelector = $/.'<select name="output">'.$/;
+ foreach ('HTML','Excel') {
+ $OutputSelector .= ' <option value="'.lc($_).'"';
+ if ($ENV{'form.output'} eq lc($_)) {
+ $OutputSelector .= ' selected ';
+ }
+ $OutputSelector .='>'.&mt($_).'</option>'.$/;
+ }
+ $OutputSelector .= '</select>'.$/;
+ ##
## Environment variable initialization
my $Str = '';
$Str .= &Apache::lonhtmlcommon::breadcrumbs
@@ -753,9 +585,9 @@
$Str .= '<p>';
$Str .= '<table cellspacing="5">'."\n";
$Str .= '<tr>';
- $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
- $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';
- $Str .= '<td> </td>';
+ $Str .= '<th>'.&mt('Sections').'</th>';
+ $Str .= '<th>'.&mt('Enrollment Status').'</th>';
+ $Str .= '<th>'.&mt('Output Options').'</th>';
$Str .= '</tr>'."\n";
#
$Str .= '<tr><td align="center">'."\n";
@@ -788,22 +620,23 @@
}
$last_sub_checkbox.= 'value="true" />';
#
- # extra submission data checkbox
- my $subdata_checkbox = '<input type="checkbox" name="subdata" ';
- if (exists($ENV{'form.subdata'}) &&
- $ENV{'form.subdata'} eq 'true') {
- $subdata_checkbox .= 'checked ';
+ # Concise view checkbox
+ my $concise_view_checkbox = '<input type="checkbox" name="concise" ';
+ if (exists($ENV{'form.concise'}) && $ENV{'form.concise'} eq 'true') {
+ $concise_view_checkbox .= 'checked ';
}
- $subdata_checkbox.= 'value="true" />';
+ $concise_view_checkbox .= 'value="true" />';
#
- $Str .= '<td align="right" halign="top">'.'<label><b>'.
+ $Str .= '<td align="right" halign="top">'.
+ '<b>'.&mt('Output Format: [_1]',$OutputSelector).'</b><br />'.$/.
+ '<label><b>'.
&mt('show problem [_1]',$prob_checkbox).'</b></label><br />'.
'<label><b>'.
&mt('compute correct answers [_1]',$ans_checkbox).'</b></label><br />'.
'<label><b>'.
&mt('final answer only [_1]',$last_sub_checkbox).'</b></label><br />'.
- '<label><b>'.&mt('show extra submission data [_1]',$subdata_checkbox).
- '</b></label><br />'.
+ '<label><b>'.
+ &mt('concise view [_1]',$concise_view_checkbox).'</b></label><br />'.
'</td>';
#
$Str .= '</tr>'."\n";
--matthew1094158974--