--- loncom/homework/grades.pm 2008/02/04 13:46:35 1.505
+++ loncom/homework/grades.pm 2008/02/06 16:32:30 1.510
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.505 2008/02/04 13:46:35 raeburn Exp $
+# $Id: grades.pm,v 1.510 2008/02/06 16:32:30 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -3960,31 +3960,31 @@ sub csvuploadassign {
$grades{$store_key}=$entries{$fields{$dest}};
}
}
- if (! %grades) { push(@skipped,"$username:$domain no data to save"); }
- $grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}";
- my $result=&Apache::lonnet::cstore(\%grades,$symb,
+ if (! %grades) {
+ push(@skipped,&mt("[_1]: no data to save","$username:$domain"));
+ } else {
+ $grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}";
+ my $result=&Apache::lonnet::cstore(\%grades,$symb,
$env{'request.course.id'},
$domain,$username);
- if ($result eq 'ok') {
- $request->print('.');
- } else {
- $request->print("
-
- Failed to save student $username:$domain.
- Message when trying to save was ($result)
-
-
" );
- }
- $request->rflush();
- $countdone++;
+ if ($result eq 'ok') {
+ $request->print('.');
+ } else {
+ $request->print("".
+ &mt("Failed to save data for student [_1]. Message when trying to save was: [_2]",
+ "$username:$domain",$result)."
");
+ }
+ $request->rflush();
+ $countdone++;
+ }
}
- $request->print("
Saved $countdone students\n");
+ $request->print('
'.&mt("Saved [_1] students",$countdone)."\n");
if (@skipped) {
- $request->print('Skipped Students
');
+ $request->print(''.&mt('Skipped Students').'
');
foreach my $student (@skipped) { $request->print("$student
\n"); }
}
if (@notallowed) {
- $request->print('Students Not Allowed to Modify
');
+ $request->print(''.&mt('Students Not Allowed to Modify').'
');
foreach my $student (@notallowed) { $request->print("$student
\n"); }
}
$request->print("
\n");
@@ -4681,9 +4681,10 @@ my %bubble_lines_per_response; # no.
my %first_bubble_line; # First bubble line no. for each bubble.
-my %subdivided_bubble_lines; # no. bubble lines for optionresponse
- # or matchresponse where an individual
- # response can have multiple lines
+my %subdivided_bubble_lines; # no. bubble lines for optionresponse,
+ # matchresponse or rankresponse, where
+ # an individual response can have multiple
+ # lines
my %responsetype_per_response; # responsetype for each response
@@ -5457,7 +5458,10 @@ sub scantron_validator_lettnum {
my $occurrences = 0;
if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
- ($responsetype_per_response{$questnum-1} eq 'stringresponse')) {
+ ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
my @singlelines = split('',$currquest);
foreach my $entry (@singlelines) {
$occurrences = &occurence_count($entry,$matchon);
@@ -5524,6 +5528,10 @@ sub scantron_validator_positional {
# If the split only gives us one element.. the full length of the
# answer string, no bubbles are filled in:
+ if ($answers_needed eq '') {
+ return;
+ }
+
if (length($array[0]) eq $$scantron_config{'Qlength'}*$answers_needed) {
for (my $ans=0; $ans<$answers_needed; $ans++ ) {
$record->{"scantron.$ansnum.answer"}='';
@@ -5552,7 +5560,10 @@ sub scantron_validator_positional {
#
if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
- ($responsetype_per_response{$questnum-1} eq 'stringresponse')) {
+ ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
my $doubleerror = 0;
while (($currquest >= $$scantron_config{'Qlength'}) &&
(!$doubleerror)) {
@@ -6762,7 +6773,7 @@ sub questions_to_line_list {
$first = $first_bubble_line{$question-1} + 1;
$count = $bubble_lines_per_response{$question-1};
}
- my $last = $first+$count-1;
+ $last = $first+$count-1;
push(@lines, ($first..$last));
}
return join(',', @lines);
@@ -6788,13 +6799,14 @@ for multi and missing bubble cases).
Numbered from 0 (but question numbers are from
1.
%first_bubble_line - Starting bubble line for each question.
- %subdivided_bubble_lines - optionresponse and matchresponse type
- problems render as separate sub-questions,
+ %subdivided_bubble_lines - optionresponse, matchresponse and rankresponse
+ type problems render as separate sub-questions,
in exam mode. This hash contains a
comma-separated list of the lines per
sub-question.
- %responsetype_per_response - essayresponse, forumalaresponse, and
- stringresponse type problem parts can have
+ %responsetype_per_response - essayresponse, formularesponse,
+ stringresponse, imageresponse, reactionresponse,
+ and organicresponse type problem parts can have
multiple lines per response if the weight
assigned exceeds 10. In this case, only
one bubble per line is permitted, but more
@@ -6828,7 +6840,10 @@ sub prompt_for_corrections {
$r->print(&mt('The group of bubble lines below responds to a single question.').'
');
if (($responsetype_per_response{$question-1} eq 'essayresponse') ||
($responsetype_per_response{$question-1} eq 'formularesponse') ||
- ($responsetype_per_response{$question-1} eq 'stringresponse')) {
+ ($responsetype_per_response{$question-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$question-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$question-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$question-1} eq 'organicresponse')) {
$r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the exam directed students to leave [quant,_1,line] blank on their scantron sheets.",$lines).'
'.&mt('A non-zero score can be assigned to the student during scantron grading by selecting a bubble in at least one line.').'
'.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').'
'.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'
');
} else {
$r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")."
");
@@ -7109,7 +7124,7 @@ sub scantron_validate_doublebubble {
which are the total number of bubble, lines, the number of bubble
lines for response n and number of the first bubble line for response n,
and a comma separated list of numbers of bubble lines for sub-questions
- (for optionresponse items only), for response n.
+ (for optionresponse, matchresponse, and rankresponse items), for response n.
=cut
@@ -7141,8 +7156,9 @@ sub scantron_get_maxbubble {
my $response_number = 0;
my $bubble_line = 0;
foreach my $resource (@resources) {
- # Need to retrieve part IDs and response IDs because essayresponse
- # items are not included in $analysis{'parts'} from lonnet::ssi.
+ # Need to retrieve part IDs and response IDs because essayresponse,
+ # reactionresponse and organicresponse items are not included in
+ # $analysis{'parts'} from lonnet::ssi.
my %possible_part_ids;
if (ref($resource->parts()) eq 'ARRAY') {
foreach my $part (@{$resource->parts()}) {
@@ -7170,7 +7186,9 @@ sub scantron_get_maxbubble {
}
# Add part_ids for any essayresponse items.
foreach my $part_id (keys(%possible_part_ids)) {
- if ($analysis{$part_id.'.type'} eq 'essayresponse') {
+ if (($analysis{$part_id.'.type'} eq 'essayresponse') ||
+ ($analysis{$part_id.'.type'} eq 'reactionresponse') ||
+ ($analysis{$part_id.'.type'} eq 'organicresponse')) {
if (!grep(/^\Q$part_id\E$/,@parts)) {
push (@parts,$part_id);
}
@@ -7182,10 +7200,11 @@ sub scantron_get_maxbubble {
# TODO - make this a persistent hash not an array.
- # optionresponse and matchresponse type items render as
- # separate sub-questions in exam mode.
+ # optionresponse, matchresponse and rankresponse type items
+ # render as separate sub-questions in exam mode.
if (($analysis{$part_id.'.type'} eq 'optionresponse') ||
- ($analysis{$part_id.'.type'} eq 'matchresponse')) {
+ ($analysis{$part_id.'.type'} eq 'matchresponse') ||
+ ($analysis{$part_id.'.type'} eq 'rankresponse')) {
my ($numbub,$numshown);
if ($analysis{$part_id.'.type'} eq 'optionresponse') {
if (ref($analysis{$part_id.'.options'}) eq 'ARRAY') {
@@ -7195,6 +7214,10 @@ sub scantron_get_maxbubble {
if (ref($analysis{$part_id.'.items'}) eq 'ARRAY') {
$numbub = scalar(@{$analysis{$part_id.'.items'}});
}
+ } elsif ($analysis{$part_id.'.type'} eq 'rankresponse') {
+ if (ref($analysis{$part_id.'.foils'}) eq 'ARRAY') {
+ $numbub = scalar(@{$analysis{$part_id.'.foils'}});
+ }
}
if (ref($analysis{$part_id.'.shown'}) eq 'ARRAY') {
$numshown = scalar(@{$analysis{$part_id.'.shown'}});