Skip to content

Commit 27cda6d

Browse files
committed
Merge pull request #12 from dlglin/master
Add some functionality for customizing the display of dates
2 parents 1391cd7 + 8760244 commit 27cda6d

File tree

6 files changed

+115
-14
lines changed

6 files changed

+115
-14
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: Wed Jun 27 at 10:30am
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

conf/site.conf.dist

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,14 @@ $problemLibrary{root} = "";
221221
#
222222
$siteDefaults{timezone} = "America/New_York";
223223

224+
# Locale for time format localization
225+
# Set the following variable to localize the format of things like days
226+
# of the week and month names (i.e. translate them)
227+
# This variable must match one of the locales available on your system
228+
# To show the current locale in use on the system, type 'locale' at the
229+
# command prompt. For a list of installed locales, type 'locale -a' and
230+
# enter one of the listed values here.
231+
# If you do not fill this in, the system will default to "en_US"
232+
$siteDefaults{locale}="";
233+
224234
1; #final line of the file to reassure perl that it was read properly.

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: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,56 @@ sub defineProblemEnvir {
9898

9999
$envir{openDate} = $set->open_date;
100100
$envir{formattedOpenDate} = formatDateTime($envir{openDate}, $ce->{siteDefaults}{timezone});
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});
101116
$envir{dueDate} = $set->due_date;
102117
$envir{formattedDueDate} = formatDateTime($envir{dueDate}, $ce->{siteDefaults}{timezone});
103118
$envir{formatedDueDate} = $envir{formattedDueDate}; # typo in many header files
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});
104134
$envir{answerDate} = $set->answer_date;
105135
$envir{formattedAnswerDate} = formatDateTime($envir{answerDate}, $ce->{siteDefaults}{timezone});
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});
106151
$envir{numOfAttempts} = ($problem->num_correct || 0) + ($problem->num_incorrect || 0);
107152
$envir{problemValue} = $problem->value;
108153
$envir{sessionKey} = $key;

lib/WeBWorK/Utils.pm

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -591,18 +591,53 @@ the datetime is converted from the server's timezone to the timezone specified.
591591
592592
=cut
593593

594-
sub formatDateTime($;$) {
595-
my ($dateTime, $display_tz) = @_;
594+
#sub formatDateTime($;$) {
595+
# my ($dateTime, $display_tz) = @_;
596+
# warn "Utils::formatDateTime is not a method. ", join(" ",caller(2)) if ref($dateTime); # catch bad calls to Utils::formatDateTime
597+
# warn "not defined formatDateTime('$dateTime', '$display_tz') ",join(" ",caller(2)) unless $display_tz;
598+
# $dateTime = $dateTime ||0; # do our best to provide default values
599+
# $display_tz ||= "local"; # do our best to provide default vaules
600+
#
601+
# my $dt = DateTime->from_epoch(epoch => $dateTime, time_zone => $display_tz);
602+
# #warn "\t\$dt = ", $dt->strftime(DATE_FORMAT), "\n";
603+
# return $dt->strftime(DATE_FORMAT);
604+
#}
605+
606+
=item $string = formatDateTime($dateTime, $display_tz, $format_string, $locale)
607+
608+
Formats the UNIX datetime $dateTime in the custom format provided by $format_string.
609+
If $format_string is not provided, the standard WeBWorK datetime format is used.
610+
$dateTime is assumed to be in the server's time zone. If $display_tz is given,
611+
the datetime is converted from the server's timezone to the timezone specified.
612+
The available patterns for $format_string can be found in the documentation for
613+
the perl DateTime package under the heading of strftime Patterns.
614+
$dateTime is assumed to be in the server's time zone. If $display_tz is given,
615+
the datetime is converted from the server's timezone to the timezone specified.
616+
If $locale is provided, the string returned will be in the format of that locale,
617+
which is useful for automatically translating things like days of the week and
618+
month names. If $locale is not provided, perl defaults to en_US.
619+
620+
=cut
621+
622+
sub formatDateTime($;$;$;$) {
623+
my ($dateTime, $display_tz, $format_string, $locale) = @_;
596624
warn "Utils::formatDateTime is not a method. ", join(" ",caller(2)) if ref($dateTime); # catch bad calls to Utils::formatDateTime
597625
warn "not defined formatDateTime('$dateTime', '$display_tz') ",join(" ",caller(2)) unless $display_tz;
598626
$dateTime = $dateTime ||0; # do our best to provide default values
599627
$display_tz ||= "local"; # do our best to provide default vaules
600-
601-
my $dt = DateTime->from_epoch(epoch => $dateTime, time_zone => $display_tz);
628+
$format_string ||= DATE_FORMAT; # If a format is not provided, use the default WeBWorK date format
629+
my $dt;
630+
if($locale) {
631+
$dt = DateTime->from_epoch(epoch => $dateTime, time_zone => $display_tz, locale=>$locale);
632+
}
633+
else {
634+
$dt = DateTime->from_epoch(epoch => $dateTime, time_zone => $display_tz);
635+
}
602636
#warn "\t\$dt = ", $dt->strftime(DATE_FORMAT), "\n";
603-
return $dt->strftime(DATE_FORMAT);
637+
return $dt->strftime($format_string);
604638
}
605639

640+
606641
=item $string = textDateTime($string_or_dateTime)
607642
608643
Accepts a UNIX datetime or a formatted string, returns a formatted string.

0 commit comments

Comments
 (0)