Skip to content

Commit e98c6f7

Browse files
author
dlglin
committed
Simplify code for custom formatting of dates, and add the ability to customize format of dates visible to students
Beefed up the formatDateTime function to accept custom date format strings and locales, then added the ability to provide a custom string to change the format of the dates displayed on the Problem Sets page for students.
1 parent f8c5e94 commit e98c6f7

File tree

5 files changed

+86
-70
lines changed

5 files changed

+86
-70
lines changed

conf/localOverrides.conf.dist

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,16 @@ $problemDefaults{max_attempts} = -1;
268268
#$courseURLs{html_temp} = "/wwtmp/$courseName";
269269

270270
################################################################################
271+
# Student Date Format
272+
################################################################################
273+
274+
# Uncomment the following line to customize the format of the dates displayed to
275+
# students. As it is written, the line below will display open, due and answer
276+
# dates in the following format:
277+
# For all available options, consult the documentation for perl DateTime under
278+
# "strftime patterns".
279+
#$studentDateDisplayFormat="%a %b %d at %l:%M%P";
280+
271281

272282
################################################################################
273283
# Authentication Methods

lib/WeBWorK/ContentGenerator.pm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,10 +2103,11 @@ $siteDefaults{timezone} is used.
21032103
=cut
21042104

21052105
sub formatDateTime {
2106-
my ($self, $dateTime, $display_tz) = @_;
2106+
my ($self, $dateTime, $display_tz,$formatString,$locale) = @_;
21072107
my $ce = $self->r->ce;
21082108
$display_tz ||= $ce->{siteDefaults}{timezone};
2109-
return WeBWorK::Utils::formatDateTime($dateTime, $display_tz);
2109+
$locale ||= $ce->{siteDefaults}{locale};
2110+
return WeBWorK::Utils::formatDateTime($dateTime, $display_tz,$formatString,$locale);
21102111
}
21112112

21122113
=item read_scoring_file($fileName)

lib/WeBWorK/ContentGenerator/ProblemSets.pm

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ sub setListRow {
405405
$status = $r->maketext("over time: closed.");
406406
} else {
407407
$status = $r->maketext("open: complete by [_1]",
408-
$self->formatDateTime($set->due_date()));
408+
$self->formatDateTime($set->due_date(),undef,$ce->{studentDateDisplayFormat}));
409409
}
410410
# we let people go back to old tests
411411
$setIsOpen = 1;
@@ -417,7 +417,7 @@ sub setListRow {
417417
} else {
418418
my $t = time();
419419
if ( $t < $set->open_date() ) {
420-
$status = $r->maketext("will open on [_1]", $self->formatDateTime($set->open_date));
420+
$status = $r->maketext("will open on [_1]", $self->formatDateTime($set->open_date,undef,$ce->{studentDateDisplayFormat}));
421421
if ( $preOpenSets ) {
422422
# reset the link
423423
$interactive = CGI::a({-href=>$interactiveURL},
@@ -427,7 +427,7 @@ sub setListRow {
427427
$interactive = $r->maketext("[_1] test", $name);
428428
}
429429
} elsif ( $t < $set->due_date() ) {
430-
$status = $r->maketext("now open, due ") . $self->formatDateTime($set->due_date);
430+
$status = $r->maketext("now open, due ") . $self->formatDateTime($set->due_date,undef,$ce->{studentDateDisplayFormat});
431431
$setIsOpen = 1;
432432
$interactive = CGI::a({-href=>$interactiveURL},
433433
$r->maketext("Take [_1] test", $name));
@@ -445,23 +445,23 @@ sub setListRow {
445445

446446
# old conditional
447447
} elsif (time < $set->open_date) {
448-
$status = $r->maketext("will open on [_1]", $self->formatDateTime($set->open_date));
448+
$status = $r->maketext("will open on [_1]", $self->formatDateTime($set->open_date,undef,$ce->{studentDateDisplayFormat}));
449449
$control = "" unless $preOpenSets;
450450
$interactive = $name unless $preOpenSets;
451451
} elsif (time < $set->due_date) {
452-
$status = $r->maketext("now open, due ") . $self->formatDateTime($set->due_date);
452+
$status = $r->maketext("now open, due ") . $self->formatDateTime($set->due_date,undef,$ce->{studentDateDisplayFormat});
453453
my $enable_reduced_scoring = $set->enable_reduced_scoring;
454454
my $reducedScoringPeriod = $ce->{pg}->{ansEvalDefaults}->{reducedScoringPeriod};
455455
if ($reducedScoringPeriod > 0 and $enable_reduced_scoring ) {
456456
my $reducedScoringPeriodSec = $reducedScoringPeriod*60; # $reducedScoringPeriod is in minutes
457-
my $beginReducedScoringPeriod = $self->formatDateTime($set->due_date() - $reducedScoringPeriodSec);
457+
my $beginReducedScoringPeriod = $self->formatDateTime($set->due_date() - $reducedScoringPeriodSec,undef,$ce->{studentDateDisplayFormat});
458458
# $status .= '. <FONT COLOR="#cc6600">Reduced Credit starts ' . $beginReducedScoringPeriod . '</FONT>';
459459
$status .= CGI::div({-class=>"ResultsAlert"}, $r->maketext("Reduced Credit Starts: [_1]", $beginReducedScoringPeriod));
460460

461461
}
462462
$setIsOpen = 1;
463463
} elsif (time < $set->answer_date) {
464-
$status = $r->maketext("closed, answers on [_1]", $self->formatDateTime($set->answer_date));
464+
$status = $r->maketext("closed, answers on [_1]", $self->formatDateTime($set->answer_date,undef,$ce->{studentDateDisplayFormat}));
465465
} elsif ($set->answer_date <= time and time < $set->answer_date +RECENT ) {
466466
$status = $r->maketext("closed, answers recently available");
467467
} else {

lib/WeBWorK/PG.pm

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ API.
2626
use strict;
2727
use warnings;
2828
use WeBWorK::PG::ImageGenerator;
29-
use WeBWorK::Utils qw(runtime_use formatDateTime formatDateTimeCustom makeTempDirectory);
29+
use WeBWorK::Utils qw(runtime_use formatDateTime makeTempDirectory);
3030
use WeBWorK::Utils::RestrictedClosureClass;
3131

3232
use constant DISPLAY_MODES => {
@@ -98,56 +98,56 @@ sub defineProblemEnvir {
9898

9999
$envir{openDate} = $set->open_date;
100100
$envir{formattedOpenDate} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone});
101-
$envir{OpenDateDayOfWeek} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
102-
$envir{OpenDateDayOfWeekAbbrev} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
103-
$envir{OpenDateDay} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
104-
$envir{OpenDateMonthNumber} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
105-
$envir{OpenDateMonthWord} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
106-
$envir{OpenDateMonthAbbrev} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
107-
$envir{OpenDateYear2Digit} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
108-
$envir{OpenDateYear4Digit} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
109-
$envir{OpenDateHour12} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
110-
$envir{OpenDateHour24} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
111-
$envir{OpenDateMinute} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
112-
$envir{OpenDateAMPM} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
113-
$envir{OpenDateTimeZone} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
114-
$envir{OpenDateTime12} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
115-
$envir{OpenDateTime24} = formatDateTimeCustom($envir{openDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
101+
$envir{OpenDateDayOfWeek} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
102+
$envir{OpenDateDayOfWeekAbbrev} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
103+
$envir{OpenDateDay} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
104+
$envir{OpenDateMonthNumber} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
105+
$envir{OpenDateMonthWord} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
106+
$envir{OpenDateMonthAbbrev} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
107+
$envir{OpenDateYear2Digit} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
108+
$envir{OpenDateYear4Digit} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
109+
$envir{OpenDateHour12} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
110+
$envir{OpenDateHour24} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
111+
$envir{OpenDateMinute} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
112+
$envir{OpenDateAMPM} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
113+
$envir{OpenDateTimeZone} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
114+
$envir{OpenDateTime12} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
115+
$envir{OpenDateTime24} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
116116
$envir{dueDate} = $set->due_date;
117117
$envir{formattedDueDate} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone});
118118
$envir{formatedDueDate} = $envir{formattedDueDate}; # typo in many header files
119-
$envir{DueDateDayOfWeek} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
120-
$envir{DueDateDayOfWeekAbbrev} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
121-
$envir{DueDateDay} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
122-
$envir{DueDateMonthNumber} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
123-
$envir{DueDateMonthWord} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
124-
$envir{DueDateMonthAbbrev} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
125-
$envir{DueDateYear2Digit} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
126-
$envir{DueDateYear4Digit} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
127-
$envir{DueDateHour12} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
128-
$envir{DueDateHour24} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
129-
$envir{DueDateMinute} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
130-
$envir{DueDateAMPM} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
131-
$envir{DueDateTimeZone} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
132-
$envir{DueDateTime12} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
133-
$envir{DueDateTime24} = formatDateTimeCustom($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
119+
$envir{DueDateDayOfWeek} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
120+
$envir{DueDateDayOfWeekAbbrev} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
121+
$envir{DueDateDay} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
122+
$envir{DueDateMonthNumber} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
123+
$envir{DueDateMonthWord} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
124+
$envir{DueDateMonthAbbrev} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
125+
$envir{DueDateYear2Digit} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
126+
$envir{DueDateYear4Digit} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
127+
$envir{DueDateHour12} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
128+
$envir{DueDateHour24} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
129+
$envir{DueDateMinute} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
130+
$envir{DueDateAMPM} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
131+
$envir{DueDateTimeZone} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
132+
$envir{DueDateTime12} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
133+
$envir{DueDateTime24} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
134134
$envir{answerDate} = $set->answer_date;
135135
$envir{formattedAnswerDate} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone});
136-
$envir{AnsDateDayOfWeek} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
137-
$envir{AnsDateDayOfWeekAbbrev} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
138-
$envir{AnsDateDay} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
139-
$envir{AnsDateMonthNumber} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
140-
$envir{AnsDateMonthWord} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
141-
$envir{AnsDateMonthAbbrev} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
142-
$envir{AnsDateYear2Digit} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
143-
$envir{AnsDateYear4Digit} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
144-
$envir{AnsDateHour12} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
145-
$envir{AnsDateHour24} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
146-
$envir{AnsDateMinute} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
147-
$envir{AnsDateAMPM} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
148-
$envir{AnsDateTimeZone} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
149-
$envir{AnsDateTime12} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
150-
$envir{AnsDateTime24} = formatDateTimeCustom($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
136+
$envir{AnsDateDayOfWeek} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%A", $ce->{siteDefaults}{locale});
137+
$envir{AnsDateDayOfWeekAbbrev} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%a", $ce->{siteDefaults}{locale});
138+
$envir{AnsDateDay} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%d", $ce->{siteDefaults}{locale});
139+
$envir{AnsDateMonthNumber} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%m", $ce->{siteDefaults}{locale});
140+
$envir{AnsDateMonthWord} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%B", $ce->{siteDefaults}{locale});
141+
$envir{AnsDateMonthAbbrev} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%b", $ce->{siteDefaults}{locale});
142+
$envir{AnsDateYear2Digit} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%y", $ce->{siteDefaults}{locale});
143+
$envir{AnsDateYear4Digit} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%Y", $ce->{siteDefaults}{locale});
144+
$envir{AnsDateHour12} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%I", $ce->{siteDefaults}{locale});
145+
$envir{AnsDateHour24} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%H", $ce->{siteDefaults}{locale});
146+
$envir{AnsDateMinute} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%M", $ce->{siteDefaults}{locale});
147+
$envir{AnsDateAMPM} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%P", $ce->{siteDefaults}{locale});
148+
$envir{AnsDateTimeZone} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%Z", $ce->{siteDefaults}{locale});
149+
$envir{AnsDateTime12} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%I:%M%P", $ce->{siteDefaults}{locale});
150+
$envir{AnsDateTime24} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone}, "%R", $ce->{siteDefaults}{locale});
151151
$envir{numOfAttempts} = ($problem->num_correct || 0) + ($problem->num_incorrect || 0);
152152
$envir{problemValue} = $problem->value;
153153
$envir{sessionKey} = $key;

0 commit comments

Comments
 (0)