[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