[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Wed, 17 Sep 2008 15:53:37 -0000
raeburn Wed Sep 17 11:53:37 2008 EDT
Modified files:
/loncom/interface lonhelper.pm
Log:
Bug 5792.
Date/time selectors in helper now make use of a course-wide time zone (or the default time zone for the domain if no course-specific one set).
Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.165 loncom/interface/lonhelper.pm:1.166
--- loncom/interface/lonhelper.pm:1.165 Fri Sep 5 20:47:16 2008
+++ loncom/interface/lonhelper.pm Wed Sep 17 11:53:34 2008
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# .helper XML handler to implement the LON-CAPA helper
#
-# $Id: lonhelper.pm,v 1.165 2008/09/06 00:47:16 raeburn Exp $
+# $Id: lonhelper.pm,v 1.166 2008/09/17 15:53:34 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1725,7 +1725,7 @@
use strict;
use Apache::lonlocal; # A localization nightmare
use Apache::lonnet;
-use Time::localtime;
+use DateTime;
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::date',
@@ -1775,14 +1775,13 @@
my $time=time;
my ($anytime,$onclick);
-
# first check VARS for a valid new value from the user
# then check DEFAULT_VALUE for a valid default time value
# otherwise pick now as reasonably good time
if (defined($helper->{VARS}{$var})
&& $helper->{VARS}{$var} > 0) {
- $date = localtime($helper->{VARS}{$var});
+ $date = &get_date_object($helper->{VARS}{$var});
} elsif (defined($self->{DEFAULT_VALUE})) {
my $valueFunc = eval($self->{DEFAULT_VALUE});
die('Error in default value code for variable ' .
@@ -1790,17 +1789,17 @@
$time = &$valueFunc($helper, $self);
if (lc($time) eq 'anytime') {
$anytime=1;
- $date = localtime(time);
+ $date = &get_date_object(time);
$date->min(0);
} elsif (defined($time) && $time ne 0) {
- $date = localtime($time);
+ $date = &get_date_object($time);
} else {
# leave date undefined so it'll default to now
}
}
if (!defined($date)) {
- $date = localtime(time);
+ $date = &get_date_object(time);
$date->min(0);
}
@@ -1817,12 +1816,12 @@
my $i;
$result .= "<select $onclick name='${var}month'>\n";
for ($i = 0; $i < 12; $i++) {
- if ($i == $date->mon) {
+ if (($i + 1) == $date->mon) {
$result .= "<option value='$i' selected='selected'>";
} else {
$result .= "<option value='$i'>";
}
- $result .= &mt($months[$i]) . "</option>\n";
+ $result .= &mt($months[$i])."</option>\n";
}
$result .= "</select>\n";
@@ -1841,7 +1840,7 @@
# Year
$result .= "<select $onclick name='${var}year'>\n";
for ($i = 2000; $i < 2030; $i++) { # update this after 64-bit dates
- if ($date->year + 1900 == $i) {
+ if ($date->year == $i) {
$result .= "<option selected='selected'>";
} else {
$result .= "<option>";
@@ -1896,6 +1895,7 @@
}
$result .= "</select>\n";
}
+ $result .= ' '.$date->time_zone_short_name().' ';
if ($self->{'anytime'}) {
$result.=(<<CHECK);
<script type="text/javascript">
@@ -1923,7 +1923,8 @@
if ($env{'form.' . $var . 'anytime'}) {
$helper->{VARS}->{$var} = undef;
} else {
- my $month = $env{'form.' . $var . 'month'};
+ my $month = $env{'form.' . $var . 'month'};
+ $month ++;
my $day = $env{'form.' . $var . 'day'};
my $year = $env{'form.' . $var . 'year'};
my $min = 0;
@@ -1933,25 +1934,40 @@
$hour = $env{'form.' . $var . 'hour'};
}
- my $chosenDate;
- eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);};
+ my ($chosenDate,$checkDate);
+ my $timezone = &Apache::lonlocal::gettimezone();
+ my $dt;
+ eval {
+ $dt = DateTime->new( year => $year,
+ month => $month,
+ day => $day,
+ hour => $hour,
+ minute => $min,
+ second => 0,
+ time_zone => $timezone,
+ );
+ };
+
my $error = $@;
+ if (!$error) {
+ $chosenDate = $dt->epoch;
+ $checkDate = &get_date_object($chosenDate);
+ }
# Check to make sure that the date was not automatically co-erced into a
# valid date, as we want to flag that as an error
# This happens for "Feb. 31", for instance, which is coerced to March 2 or
# 3, depending on if it's a leap year
- my $checkDate = localtime($chosenDate);
if ($error || $checkDate->mon != $month || $checkDate->mday != $day ||
- $checkDate->year + 1900 != $year) {
+ $checkDate->year != $year) {
unless (Apache::lonlocal::current_language()== ~/^en/) {
$self->{ERROR_MSG} = &mt("Invalid date entry");
return 0;
}
# LOCALIZATION FIXME: Needs to be parameterized
- $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a "
- . "date because it doesn't exist. Please enter a valid date.";
+ $self->{ERROR_MSG} = "Can't use ".$months[$env{'form.'.$var.'month'}]. " $day, $year as a ".
+ "date because it doesn't exist. Please enter a valid date.";
return 0;
}
@@ -1974,6 +1990,20 @@
return 1;
}
+
+sub get_date_object {
+ my ($epoch) = @_;
+ my $dt = DateTime->from_epoch(epoch => $epoch)
+ ->set_time_zone(&Apache::lonlocal::gettimezone());
+ my $lang = Apache::lonlocal::current_language();
+ if ($lang ne '') {
+ eval {
+ $dt->set_locale($lang);
+ };
+ }
+ return $dt;
+}
+
1;
package Apache::lonhelper::resource;
@@ -3744,7 +3774,8 @@
# Print value
if ($vars->{ACTION_TYPE} ne 'tries' && $vars->{ACTION_TYPE} ne 'weight') {
- $result .= '<li>'.&mt('to [_1] ([_2])',"<b>".ctime($vars->{PARM_DATE})."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n";
+ my $showdate = &Apache::lonlocal::locallocaltime($vars->{PARM_DATE});
+ $result .= '<li>'.&mt('to [_1] ([_2])',"<b>".$showdate."</b>",Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE}))."</li>\n";
}
# print pres_marker