From: Gavin L. v. a. <we...@ma...> - 2005-07-26 20:47:35
|
Log Message: ----------- Update Scoring.pm to deal with versioned (gateway) sets. For sets with assignment_type of 'gateway' or 'proctored_gateway' we report the user's score to be the score s/he attained on her or his most successful version of the set. Modified Files: -------------- webwork2/lib/WeBWorK/ContentGenerator/Instructor: Scoring.pm Revision Data ------------- Index: Scoring.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm,v retrieving revision 1.47 retrieving revision 1.48 diff -Llib/WeBWorK/ContentGenerator/Instructor/Scoring.pm -Llib/WeBWorK/ContentGenerator/Instructor/Scoring.pm -u -r1.47 -r1.48 --- lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm +++ lib/WeBWorK/ContentGenerator/Instructor/Scoring.pm @@ -380,10 +380,40 @@ # pre-fetch user problems $WeBWorK::timer->continue("pre-fetching user problems for set $setID") if defined($WeBWorK::timer); my %UserProblems; # $UserProblems{$userID}{$problemID} - foreach my $userID (@sortedUserIDs) { - my %CurrUserProblems = map { $_->problem_id => $_ } - $db->getAllUserProblems($userID, $setID); - $UserProblems{$userID} = \%CurrUserProblems; + + # Gateway change here: for non-gateway (non-versioned) sets, we just get each user's + # problems. For gateway (versioned) sets, we get the user's best version and return + # that + if ( ! defined( $setRecord->assignment_type() ) || + $setRecord->assignment_type() !~ /gateway/ ) { + foreach my $userID (@sortedUserIDs) { + my %CurrUserProblems = map { $_->problem_id => $_ } + $db->getAllUserProblems($userID, $setID); + $UserProblems{$userID} = \%CurrUserProblems; + } + } else { # versioned sets; get the problems for the best version + + foreach my $userID (@sortedUserIDs) { + my %CurrUserProblems; + my $numVersions = $db->getUserSetVersionNumber( $userID, $setID ); + my $bestScore = -1; + + for ( my $i=1; $i<=$numVersions; $i++ ) { + my %versionUserProblems = map { $_->problem_id => $_ } + $db->getAllUserProblems( $userID, "$setID,v$i" ); + my $score = 0; + foreach ( values ( %versionUserProblems ) ) { + my $status = $_->status || 0; + my $value = $_->value || 1; + $score += $status*$value; + } + if ( $score > $bestScore ) { + %CurrUserProblems = %versionUserProblems; + $bestScore = $score; + } + } + $UserProblems{$userID} = \%CurrUserProblems; + } } $WeBWorK::timer->continue("done pre-fetching user problems for set $setID") if defined($WeBWorK::timer); |