diff --git a/lib/WeBWorK/AchievementItems.pm b/lib/WeBWorK/AchievementItems.pm index a9ad736516..3ee7e5b5ec 100644 --- a/lib/WeBWorK/AchievementItems.pm +++ b/lib/WeBWorK/AchievementItems.pm @@ -80,7 +80,7 @@ sub UserItems ($c, $userName, $set, $records) { push(@items, $achievementItem); next; } - next unless $achievementItem->can_use($set, $records); + next unless $achievementItem->can_use($set, $records, $c); # Use the achievement item. if ($use_item_id eq $item) { @@ -104,7 +104,7 @@ sub UserItems ($c, $userName, $set, $records) { my @new_items; for (@items) { my $item = $_->[0]; - next unless $item->{count} && $item->can_use($set, $records); + next unless $item->{count} && $item->can_use($set, $records, $c); push(@new_items, [ $item, $item->print_form($set, $records, $c) ]); } return \@new_items; diff --git a/lib/WeBWorK/AchievementItems/AddNewTestGW.pm b/lib/WeBWorK/AchievementItems/AddNewTestGW.pm index 9eadafbe69..8204d8d0ab 100644 --- a/lib/WeBWorK/AchievementItems/AddNewTestGW.pm +++ b/lib/WeBWorK/AchievementItems/AddNewTestGW.pm @@ -17,7 +17,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type =~ /gateway/ && $set->set_id !~ /,v\d+$/ diff --git a/lib/WeBWorK/AchievementItems/DoubleProb.pm b/lib/WeBWorK/AchievementItems/DoubleProb.pm index 15ca7dc072..296f5c17a2 100644 --- a/lib/WeBWorK/AchievementItems/DoubleProb.pm +++ b/lib/WeBWorK/AchievementItems/DoubleProb.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && after($set->open_date); } diff --git a/lib/WeBWorK/AchievementItems/DoubleSet.pm b/lib/WeBWorK/AchievementItems/DoubleSet.pm index b91629f717..aa85bf2b01 100644 --- a/lib/WeBWorK/AchievementItems/DoubleSet.pm +++ b/lib/WeBWorK/AchievementItems/DoubleSet.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && after($set->open_date); } diff --git a/lib/WeBWorK/AchievementItems/DuplicateProb.pm b/lib/WeBWorK/AchievementItems/DuplicateProb.pm index 20c90d726d..d5fb9e0e9c 100644 --- a/lib/WeBWorK/AchievementItems/DuplicateProb.pm +++ b/lib/WeBWorK/AchievementItems/DuplicateProb.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && between($set->open_date, $set->due_date); } diff --git a/lib/WeBWorK/AchievementItems/ExtendDueDate.pm b/lib/WeBWorK/AchievementItems/ExtendDueDate.pm index ed355a6e21..a141e29675 100644 --- a/lib/WeBWorK/AchievementItems/ExtendDueDate.pm +++ b/lib/WeBWorK/AchievementItems/ExtendDueDate.pm @@ -19,7 +19,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && between($set->open_date, $set->due_date + ONE_DAY); } diff --git a/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm b/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm index c2310c47b1..ced050a6a0 100644 --- a/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm +++ b/lib/WeBWorK/AchievementItems/ExtendDueDateGW.pm @@ -16,7 +16,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type =~ /gateway/ && $set->set_id !~ /,v\d+$/ diff --git a/lib/WeBWorK/AchievementItems/ExtendReducedDate.pm b/lib/WeBWorK/AchievementItems/ExtendReducedDate.pm index 7c24c0d4b8..f9422baf43 100644 --- a/lib/WeBWorK/AchievementItems/ExtendReducedDate.pm +++ b/lib/WeBWorK/AchievementItems/ExtendReducedDate.pm @@ -20,9 +20,10 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' + && $c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} && $set->enable_reduced_scoring && $set->reduced_scoring_date && $set->reduced_scoring_date < $set->due_date; diff --git a/lib/WeBWorK/AchievementItems/FullCreditProb.pm b/lib/WeBWorK/AchievementItems/FullCreditProb.pm index 50e15639b5..1645c92c19 100644 --- a/lib/WeBWorK/AchievementItems/FullCreditProb.pm +++ b/lib/WeBWorK/AchievementItems/FullCreditProb.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && after($set->open_date); diff --git a/lib/WeBWorK/AchievementItems/FullCreditSet.pm b/lib/WeBWorK/AchievementItems/FullCreditSet.pm index 6c9065fa48..fa025c339f 100644 --- a/lib/WeBWorK/AchievementItems/FullCreditSet.pm +++ b/lib/WeBWorK/AchievementItems/FullCreditSet.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && after($set->open_date); diff --git a/lib/WeBWorK/AchievementItems/HalfCreditProb.pm b/lib/WeBWorK/AchievementItems/HalfCreditProb.pm index 073c09ea83..26ec5545db 100644 --- a/lib/WeBWorK/AchievementItems/HalfCreditProb.pm +++ b/lib/WeBWorK/AchievementItems/HalfCreditProb.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && after($set->open_date); diff --git a/lib/WeBWorK/AchievementItems/HalfCreditSet.pm b/lib/WeBWorK/AchievementItems/HalfCreditSet.pm index 3f49e53a61..eb6861c9f1 100644 --- a/lib/WeBWorK/AchievementItems/HalfCreditSet.pm +++ b/lib/WeBWorK/AchievementItems/HalfCreditSet.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && after($set->open_date); diff --git a/lib/WeBWorK/AchievementItems/NoReducedCred.pm b/lib/WeBWorK/AchievementItems/NoReducedCred.pm index d0e034eab2..bc46b3601b 100644 --- a/lib/WeBWorK/AchievementItems/NoReducedCred.pm +++ b/lib/WeBWorK/AchievementItems/NoReducedCred.pm @@ -18,9 +18,10 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' + && $c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} && $set->enable_reduced_scoring && $set->reduced_scoring_date && $set->reduced_scoring_date < $set->due_date diff --git a/lib/WeBWorK/AchievementItems/ReducedCred.pm b/lib/WeBWorK/AchievementItems/ReducedCred.pm index 340d960815..0a2349c9fc 100644 --- a/lib/WeBWorK/AchievementItems/ReducedCred.pm +++ b/lib/WeBWorK/AchievementItems/ReducedCred.pm @@ -21,7 +21,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && between($set->open_date, $set->due_date + ONE_DAY); } diff --git a/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm b/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm index cd0ef5a330..94a7c7b83c 100644 --- a/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm +++ b/lib/WeBWorK/AchievementItems/ResetIncorrectAttempts.pm @@ -14,7 +14,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && between($set->open_date, $set->due_date); diff --git a/lib/WeBWorK/AchievementItems/ResurrectGW.pm b/lib/WeBWorK/AchievementItems/ResurrectGW.pm index 2a48181005..bbd93b419f 100644 --- a/lib/WeBWorK/AchievementItems/ResurrectGW.pm +++ b/lib/WeBWorK/AchievementItems/ResurrectGW.pm @@ -13,26 +13,74 @@ sub new ($class) { id => 'ResurrectGW', name => x('Necromancers Charm'), description => x( - 'Reopens any test for an additional 24 hours. This allows you to take a test even if the ' - . 'close date has past. This item does not allow you to take additional versions of the test.' + 'Reopens any test for an additional 24 hours. If you are allowed to start new versions of the test, ' + . 'then this allows you to start a new test even if the close date has past. ' + . 'If you were not allowed to start a new version of the test, ' + . 'then this item will not allow you to take additional versions of the test. ' + . 'This item will not extend the time limit for any tests that you have already started.' ) }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type =~ /gateway/ - && (after($set->due_date) || ($set->reduced_scoring_date && after($set->reduced_scoring_date))); + && ( + after($set->due_date) + || ($c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} + && $set->enable_reduced_scoring + && after($set->reduced_scoring_date)) + ); # TODO: Check if a new version can be created, and only allow using this reward in that case. } sub print_form ($self, $set, $records, $c) { - return $c->tag( - 'p', - $c->maketext( - 'Reopen this test for the next 24 hours. This item does not allow you to take any additional ' - . 'versions of the test.' - ) - ); + if (after($set->due_date)) { + return $c->tag( + 'p', + $c->maketext( + 'Reopen this test for the next 24 hours. If you were allowed to start new versions of the test, ' + . 'then this will allow you to start a new test. ' + . 'If you have already started all of the versions of the test that you are allowed to start, ' + . 'then you should not use this item. ' + . 'This item will not extend the time limit for any tests that you have already started.' + ) + ); + } else { + if (after($set->due_date - ONE_DAY)) { + return $c->tag( + 'p', + $c->maketext( + 'Reopen this test for full credit for the next 24 hours. If you are allowed to start new versions ' + . 'of the test, then this will allow you to start a new test. ' + . 'If you have already started all of the versions of the test that you are allowed to start, ' + . 'then you should not use this item. ' + . 'This item will not extend the time limit for any tests that you have already started.' + ) + ); + } else { + return $c->c( + $c->tag( + 'p', + $c->maketext( + 'Reopen this test for full credit for the next 24 hours. After 24 hours any tests will revert ' + . 'to counting for [_1]% of their value until [_2].', + $c->ce->{pg}{ansEvalDefaults}{reducedScoringValue} * 100, + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ) + ), + $c->tag( + 'p', + $c->maketext( + ' If you are allowed to start new versions of the test, ' + . 'then this will allow you to start a new test. ' + . 'If you have already started all of the versions of the test that you are allowed to start, ' + . 'then you should not use this item. ' + . 'This item will not extend the time limit for any tests that you have already started.' + ) + ) + )->join(''); + } + } } sub use_item ($self, $set, $records, $c) { @@ -44,18 +92,33 @@ sub use_item ($self, $set, $records, $c) { $set->reduced_scoring_date(time + ONE_DAY); $userSet->reduced_scoring_date($set->reduced_scoring_date); } - $set->due_date(time + ONE_DAY); - $userSet->due_date($set->due_date); - if ($set->due_date > $set->answer_date) { - $set->answer_date(time + ONE_DAY); - $userSet->answer_date($set->answer_date); + if (after($set->due_date - ONE_DAY)) { + $set->due_date(time + ONE_DAY); + $userSet->due_date($set->due_date); + if ($set->due_date > $set->answer_date) { + $set->answer_date($set->due_date); + $userSet->answer_date($set->answer_date); + } } $db->putUserSet($userSet); - return $c->maketext( - 'This assignment has been reopened and will now close on [_1].', - $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) - ); + if ($c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} + && $set->enable_reduced_scoring + && ($set->reduced_scoring_date != $set->due_date)) + { + return $c->maketext( + 'This assignment has been reopened and is due on [_1]. After that date any work ' + . 'completed will count for [_2]% of its value until [_3].', + $c->formatDateTime($set->reduced_scoring_date, $c->ce->{studentDateDisplayFormat}), + $c->ce->{pg}{ansEvalDefaults}{reducedScoringValue} * 100, + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ); + } else { + return $c->maketext( + 'This assignment has been reopened and will now close on [_1].', + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ); + } } 1; diff --git a/lib/WeBWorK/AchievementItems/ResurrectHW.pm b/lib/WeBWorK/AchievementItems/ResurrectHW.pm index c237b737f4..4c5e9e862d 100644 --- a/lib/WeBWorK/AchievementItems/ResurrectHW.pm +++ b/lib/WeBWorK/AchievementItems/ResurrectHW.pm @@ -16,28 +16,58 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' - && (after($set->due_date) || ($set->reduced_scoring_date && after($set->reduced_scoring_date))); + && ( + after($set->due_date) + || ($c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} + && $set->enable_reduced_scoring + && after($set->reduced_scoring_date)) + ); } sub print_form ($self, $set, $records, $c) { - return $c->tag('p', - $c->maketext('Reopen this homework assignment for the next 24 hours. All problems will be rerandomized.')); + if (after($set->due_date)) { + return $c->tag( + 'p', + $c->maketext( + 'Reopen this homework assignment for the next 24 hours. All problems will be rerandomized.') + ); + } else { + if (after($set->due_date - ONE_DAY)) { + return $c->tag('p', + $c->maketext('Reopen this homework assignment for full credit for the next 24 hours. ')); + } else { + return $c->tag( + 'p', + $c->maketext( + 'Reopen this homework assignment for full credit for the next 24 hours. After 24 hours ' + . 'any progress will revert to counting for [_1]% of the value until [_2].', + $c->ce->{pg}{ansEvalDefaults}{reducedScoringValue} * 100, + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ) + ); + } + } } sub use_item ($self, $set, $records, $c) { - my $db = $c->db; - my $userSet = $db->getUserSet($set->user_id, $set->set_id); - - # Change the seed for all of the problems since the set is currently closed. - my %userProblems = - map { $_->problem_id => $_ } $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); - for my $problem (@$records) { - my $userProblem = $userProblems{ $problem->problem_id }; - $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); - $problem->problem_seed($userProblem->problem_seed); - $db->putUserProblem($userProblem); + my $db = $c->db; + my $userSet = $db->getUserSet($set->user_id, $set->set_id); + my $rerandomizeMessage = ''; + + # Change the seed for all of the problems if the set is currently closed. + if (after($set->due_date)) { + my %userProblems = + map { $_->problem_id => $_ } + $db->getUserProblemsWhere({ user_id => $set->user_id, set_id => $set->set_id }); + for my $problem (@$records) { + my $userProblem = $userProblems{ $problem->problem_id }; + $userProblem->problem_seed($userProblem->problem_seed % 2**31 + 1); + $problem->problem_seed($userProblem->problem_seed); + $db->putUserProblem($userProblem); + } + $rerandomizeMessage = $c->maketext('Problems have been rerandomized.'); } # Add time to the reduced scoring date if it was defined in the first place @@ -45,19 +75,35 @@ sub use_item ($self, $set, $records, $c) { $set->reduced_scoring_date(time + ONE_DAY); $userSet->reduced_scoring_date($set->reduced_scoring_date); } - # Add time to the close date - $set->due_date(time + ONE_DAY); - $userSet->due_date($set->due_date); - # This may require also extending the answer date. - if ($set->due_date > $set->answer_date) { - $set->answer_date($set->due_date); - $userSet->answer_date($set->answer_date); + # Add time to the close date if necessary + if (after($set->due_date - ONE_DAY)) { + $set->due_date(time + ONE_DAY); + $userSet->due_date($set->due_date); + # This may require also extending the answer date. + if ($set->due_date > $set->answer_date) { + $set->answer_date($set->due_date); + $userSet->answer_date($set->answer_date); + } } $db->putUserSet($userSet); - return $c->maketext( - 'This assignment has been reopened and will now close on [_1]. Problems have been rerandomized.', - $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat})); + if ($c->ce->{pg}{ansEvalDefaults}{enableReducedScoring} + && $set->enable_reduced_scoring + && ($set->reduced_scoring_date != $set->due_date)) + { + return $c->maketext( + 'This assignment has been reopened and is due on [_1]. After that date any work ' + . 'completed will count for [_2]% of its value until [_3].', + $c->formatDateTime($set->reduced_scoring_date, $c->ce->{studentDateDisplayFormat}), + $c->ce->{pg}{ansEvalDefaults}{reducedScoringValue} * 100, + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ) . ($rerandomizeMessage ? " $rerandomizeMessage" : ''); + } else { + return $c->maketext( + 'This assignment has been reopened and will now close on [_1].', + $c->formatDateTime($set->due_date, $c->ce->{studentDateDisplayFormat}) + ) . ($rerandomizeMessage ? " $rerandomizeMessage" : ''); + } } 1; diff --git a/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm b/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm index 58d1760f22..61fcf7f4b1 100644 --- a/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm +++ b/lib/WeBWorK/AchievementItems/SuperExtendDueDate.pm @@ -19,7 +19,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return $set->assignment_type eq 'default' && between($set->open_date, $set->due_date + TWO_DAYS); } diff --git a/lib/WeBWorK/AchievementItems/SuperExtendReducedDate.pm b/lib/WeBWorK/AchievementItems/SuperExtendReducedDate.pm index 8e5fa42c79..656b85d5ac 100644 --- a/lib/WeBWorK/AchievementItems/SuperExtendReducedDate.pm +++ b/lib/WeBWorK/AchievementItems/SuperExtendReducedDate.pm @@ -20,7 +20,7 @@ sub new ($class) { }, $class; } -sub can_use ($self, $set, $records) { +sub can_use ($self, $set, $records, $c) { return 0 unless $set->assignment_type eq 'default' && $set->enable_reduced_scoring diff --git a/lib/WeBWorK/AchievementItems/Surprise.pm b/lib/WeBWorK/AchievementItems/Surprise.pm index b598b75352..c3c4331a86 100644 --- a/lib/WeBWorK/AchievementItems/Surprise.pm +++ b/lib/WeBWorK/AchievementItems/Surprise.pm @@ -18,7 +18,7 @@ sub remaining_title ($self, $c) { return $c->maketext($self->name); } -sub can_use ($self, $set, $records) { return 1; } +sub can_use ($self, $set, $records, $c) { return 1; } sub print_form ($self, $set, $records, $c) { $self->{hideUseButton} = 1;