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);
|