Skip to content

Commit 3c03e09

Browse files
committed
ability to cap the number of problems per page in a test
1 parent c818053 commit 3c03e09

File tree

4 files changed

+99
-18
lines changed

4 files changed

+99
-18
lines changed

conf/defaults.config

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,6 @@ $achievementPointsPerProblemReduced = 3;
142142
$achievementPreambleFile = "preamble.at";
143143
$achievementExcludeSet = [];
144144
$mail{achievementEmailFrom} = '';
145-
146-
################################################################################
147-
# Achievements
148-
################################################################################
149145
$showCourseHomeworkTotals = 1;
150146

151147
################################################################################
@@ -1441,6 +1437,14 @@ $pg{assignOpenPriorToDue} = 10080;
14411437
# set for answers to be made available;
14421438
$pg{answersOpenAfterDueDate} = 2880;
14431439

1440+
###############################################################################
1441+
# Default Test settings
1442+
###############################################################################
1443+
1444+
# Cap for the number of problems that can be used on a page.
1445+
# If 0, there is no cap. Otherwise, should be a positive integer.
1446+
$test{maxProblemsPerPage} = 0;
1447+
14441448
###############################################################################
14451449
# Progress Bar switch
14461450
###############################################################################

conf/localOverrides.conf.dist

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,4 +742,12 @@ $mail{feedbackRecipients} = [
742742
# };
743743
# };
744744

745+
###############################################################################
746+
# Test settings
747+
###############################################################################
748+
749+
# Cap for the number of problems that can be used on a page.
750+
# If 0, there is no cap. Otherwise, should be a positive integer.
751+
#$test{maxProblemsPerPage} = 1;
752+
745753
1; #final line of the file to reassure perl that it was read properly.

lib/WeBWorK/ContentGenerator/GatewayQuiz.pm

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,21 @@ async sub pre_header_initialize ($c) {
385385
}
386386
}
387387
} else {
388+
# If there is a cap on problems per page, make sure that is respected in the global set in
389+
# case something higher snuck in.
390+
if ($ce->{test}{maxProblemsPerPage}) {
391+
my $globalSet = $db->getGlobalSet($setID);
392+
if (
393+
$ce->{test}{maxProblemsPerPage}
394+
&& ($globalSet->problems_per_page == 0
395+
|| $globalSet->problems_per_page > $ce->{test}{maxProblemsPerPage})
396+
)
397+
{
398+
$globalSet->problems_per_page($ce->{test}{maxProblemsPerPage});
399+
$db->putGlobalSet($globalSet);
400+
}
401+
}
402+
388403
# Get the template set, i.e., the non-versioned set that's assigned to the user.
389404
# If this failed in authz->checkSet, then $c->{invalidSet} is set.
390405
$tmplSet = $db->getMergedSet($effectiveUserID, $setID);
@@ -394,6 +409,13 @@ async sub pre_header_initialize ($c) {
394409
# to be able to continue.
395410
$c->{assignment_type} = $tmplSet->assignment_type || 'gateway';
396411

412+
# If there is a cap on problems per page, make sure that is respected in case something higher snuck in.
413+
if ($ce->{test}{maxProblemsPerPage}
414+
&& ($tmplSet->problems_per_page == 0 || $tmplSet->problems_per_page > $ce->{test}{maxProblemsPerPage}))
415+
{
416+
$tmplSet->problems_per_page($ce->{test}{maxProblemsPerPage});
417+
}
418+
397419
# next, get the latest (current) version of the set if we don't have a
398420
# requested version number
399421
my @allVersionIds = $db->listSetVersions($effectiveUserID, $setID);
@@ -430,6 +452,13 @@ async sub pre_header_initialize ($c) {
430452
$set->set_id($setID); # redundant?
431453
$set->version_id(0);
432454
}
455+
456+
# If there is a cap on problems per page, make sure that is respected in case something higher snuck in.
457+
if ($ce->{test}{maxProblemsPerPage}
458+
&& ($set->problems_per_page == 0 || $set->problems_per_page > $ce->{test}{maxProblemsPerPage}))
459+
{
460+
$set->problems_per_page($ce->{test}{maxProblemsPerPage});
461+
}
433462
}
434463
my $setVersionNumber = $set ? $set->version_id : 0;
435464

@@ -559,6 +588,16 @@ async sub pre_header_initialize ($c) {
559588
$set = $db->getMergedSetVersion($effectiveUserID, $setID, $setVersionNumber);
560589
$set->visible(1);
561590

591+
# If there is a cap on problems per page, make sure that is respected in case something higher snuck in.
592+
if (
593+
$ce->{test}{maxProblemsPerPage}
594+
&& ($tmplSet->problems_per_page == 0
595+
|| $tmplSet->problems_per_page > $ce->{test}{maxProblemsPerPage})
596+
)
597+
{
598+
$tmplSet->problems_per_page($ce->{test}{maxProblemsPerPage});
599+
}
600+
562601
$problem = $db->getMergedProblemVersion($effectiveUserID, $setID, $setVersionNumber, $setPNum[0]);
563602

564603
# Convert the floating point value from Time::HiRes to an integer for use below. Truncate toward 0.

lib/WeBWorK/ContentGenerator/Instructor/ProblemSetDetail.pm

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ use constant JITAR_SET_FIELD_ORDER => [qw(restrict_prob_progression email_instru
6666
# All but name are optional
6767
# some_field => {
6868
# name => "Some Field",
69-
# type => "edit", # edit, choose, hidden, view - defines how the data is displayed
69+
# type => "edit", # edit, choose, hidden, view, [min, max, step] - defines how the data is displayed
70+
# [min, max, step] will introduce validation, so should not be used on just any
71+
# input where we expect numbers
7072
# size => "50", # size of the edit box (if any)
7173
# override => "none", # none, one, any, all - defines for whom this data can/must be overidden
7274
# module => "problem_list", # WeBWorK module
@@ -298,7 +300,7 @@ use constant FIELD_PROPERTIES => {
298300
},
299301
attempts_per_version => {
300302
name => x("Graded Submissions per Version"),
301-
type => 'edit',
303+
type => [ 0, undef, 1 ],
302304
size => '3',
303305
override => 'any',
304306
default => '0',
@@ -327,7 +329,7 @@ use constant FIELD_PROPERTIES => {
327329
},
328330
versions_per_interval => {
329331
name => x('Versions per Interval'),
330-
type => 'edit',
332+
type => [ 0, undef, 1 ],
331333
size => '3',
332334
override => 'any',
333335
default => '0',
@@ -350,7 +352,7 @@ use constant FIELD_PROPERTIES => {
350352
},
351353
problems_per_page => {
352354
name => x('Problems per Page'),
353-
type => 'edit',
355+
type => [ 0, undef, 1 ],
354356
size => '3',
355357
override => 'any',
356358
default => '1',
@@ -452,7 +454,7 @@ use constant FIELD_PROPERTIES => {
452454
},
453455

454456
# In addition to the set fields above, there are a number of things
455-
# that are set but aren"t in this table:
457+
# that are set but aren't in this table:
456458
# any set proctor information (which is in the user tables), and
457459
# any set location restriction information (which is in the
458460
# location tables)
@@ -478,7 +480,7 @@ use constant FIELD_PROPERTIES => {
478480
},
479481
max_attempts => {
480482
name => x('Max Attempts'),
481-
type => 'edit',
483+
type => [ -1, undef, 1 ],
482484
size => 6,
483485
override => 'any',
484486
default => '-1',
@@ -491,7 +493,7 @@ use constant FIELD_PROPERTIES => {
491493
},
492494
showMeAnother => {
493495
name => x('Show Me Another'),
494-
type => 'edit',
496+
type => [ -2, undef, 1 ],
495497
size => '6',
496498
override => 'any',
497499
default => '-1',
@@ -507,7 +509,7 @@ use constant FIELD_PROPERTIES => {
507509
},
508510
showHintsAfter => {
509511
name => x('Show Hints After'),
510-
type => 'edit',
512+
type => [ -2, undef, 1 ],
511513
size => '6',
512514
override => 'any',
513515
default => '-2',
@@ -524,7 +526,7 @@ use constant FIELD_PROPERTIES => {
524526
},
525527
prPeriod => {
526528
name => x('Rerandomize After'),
527-
type => 'edit',
529+
type => [ -1, undef, 1 ],
528530
size => '6',
529531
override => 'any',
530532
default => '-1',
@@ -540,7 +542,7 @@ use constant FIELD_PROPERTIES => {
540542
},
541543
problem_seed => {
542544
name => x('Seed'),
543-
type => 'edit',
545+
type => [ 0, undef, 1 ],
544546
size => 6,
545547
override => 'one',
546548
help_text => x(
@@ -604,7 +606,7 @@ use constant FIELD_PROPERTIES => {
604606
},
605607
att_to_open_children => {
606608
name => x('Attempt Threshold for Children'),
607-
type => 'edit',
609+
type => [ -1, undef, 1 ],
608610
size => 6,
609611
override => 'any',
610612
default => '0',
@@ -819,14 +821,29 @@ sub fieldHTML ($c, $userID, $setID, $problemID, $globalRecord, $userRecord, $fie
819821
if $forOneUser && $globalRecord && !$userRecord;
820822

821823
my %properties = %{ FIELD_PROPERTIES()->{$field} };
824+
if ($field eq 'problems_per_page') {
825+
if ($c->ce->{test}{maxProblemsPerPage} == 1) {
826+
$properties{override} = 'none';
827+
} elsif ($c->ce->{test}{maxProblemsPerPage} > 1) {
828+
my $max = $c->ce->{test}{maxProblemsPerPage};
829+
$properties{type} = [ 1, $max, 1 ];
830+
$properties{help_text} =
831+
'A test is broken up into pages with this many problems on each page. Students can '
832+
. 'move from page to page without clicking to grade the test, and their temporary answers will be '
833+
. "saved. The site administator has capped this setting at $max. If only using 1 problem per page, "
834+
. 'the student has many pages and may be frustrated trying to reach a particular problem. However, '
835+
. 'their answers will be saved more frequently as they move from page to page.';
836+
}
837+
}
822838

823839
return '' if $properties{type} eq 'hidden';
824840
return '' if $properties{override} eq 'one' && !$forOneUser;
825841
return '' if $properties{override} eq 'none' && !$forOneUser;
826842
return '' if $properties{override} eq 'all' && $forUsers;
827843

828-
my $edit = $properties{type} eq 'edit' && $properties{override} ne 'none';
829-
my $choose = $properties{type} eq 'choose' && $properties{override} ne 'none';
844+
my $edit = $properties{type} eq 'edit' && $properties{override} ne 'none';
845+
my $number = ref($properties{type}) eq 'ARRAY' && $properties{override} ne 'none';
846+
my $choose = $properties{type} eq 'choose' && $properties{override} ne 'none';
830847

831848
my ($globalValue, $userValue, $blankField) = (undef, undef, '');
832849
if ($field =~ /:/) {
@@ -870,7 +887,7 @@ sub fieldHTML ($c, $userID, $setID, $problemID, $globalRecord, $userRecord, $fie
870887
# This contains either a text input or a select for changing a given database field.
871888
my $input = '';
872889

873-
if ($edit) {
890+
if ($edit || $number) {
874891
if ($field =~ /_date/) {
875892
$input = $c->tag(
876893
'div',
@@ -907,6 +924,10 @@ sub fieldHTML ($c, $userID, $setID, $problemID, $globalRecord, $userRecord, $fie
907924
);
908925
} else {
909926
my $value = $forUsers ? ($labels{$userValue} || $userValue) : ($labels{$globalValue} || $globalValue);
927+
$value = $c->ce->{test}{maxProblemsPerPage}
928+
if ($field eq 'problems_per_page'
929+
&& $c->ce->{test}{maxProblemsPerPage}
930+
&& ($value == 0 || $value > $c->ce->{test}{maxProblemsPerPage}));
910931
$value = format_set_name_display($value =~ s/\s*,\s*/,/gr) if $field eq 'restricted_release';
911932

912933
my @field_args = (
@@ -936,6 +957,15 @@ sub fieldHTML ($c, $userID, $setID, $problemID, $globalRecord, $userRecord, $fie
936957
)
937958
)->join('')
938959
);
960+
} elsif ($number) {
961+
$input = $c->number_field(
962+
@field_args,
963+
min => ($properties{type}[0] || 0),
964+
max => ($properties{type}[1] || undef),
965+
step => ($properties{type}[2] || 1),
966+
placeholder => $value,
967+
$forUsers && $canOverride ? (placeholder => $c->maketext('Set Default')) : ()
968+
);
939969
} else {
940970
$input = $c->text_field(@field_args,
941971
$forUsers && $canOverride ? (placeholder => $c->maketext('Set Default')) : ());

0 commit comments

Comments
 (0)