From 3cf77839ed3407a29840b333bf41f6999cb2322b Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Mon, 4 Oct 2010 11:53:05 -0700 Subject: [PATCH] Date form plugin needs to observe the time zone of the viewer of the data when processing AND displaying date. Fixes bugs #11789 11894 --- docs/changelog/7.x.x.txt | 2 ++ lib/WebGUI/Form/Date.pm | 8 ++++++-- t/Form/Date.t | 16 ++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 775c2da82..45ce10315 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -3,6 +3,8 @@ - recommitted ukplayer. Removal broke Matrix. Licencing information was available but overlooked. - fixed #11883: Wiki "Add page" link does not encode special chars - fixed #11886: profile knows it's me, but doesn't display edit + - fixed #11789: Date form reports 1 day earlier on Edit for the time zone corresponding to Europe/Berlin. + - fixed #11894: Europe London timezone decrements birth date 7.10.1 - fixed #11851: Story Topic: top story variables should be available all the time diff --git a/lib/WebGUI/Form/Date.pm b/lib/WebGUI/Form/Date.pm index f98481233..30c448ead 100644 --- a/lib/WebGUI/Form/Date.pm +++ b/lib/WebGUI/Form/Date.pm @@ -18,6 +18,7 @@ use strict; use base 'WebGUI::Form::Text'; use WebGUI::Form::Hidden; use WebGUI::International; +use Scalar::Util qw/blessed/; my $isaEpoch = qr/^-?\d+$/; @@ -241,8 +242,11 @@ sub toHtml { $value = $self->set("value",''); } else { - $value = eval { WebGUI::DateTime->new($session, $self->getOriginalValue)->toMysqlDate; }; - $value = WebGUI::DateTime->new($session,0)->toMysqlDate if $value eq ''; + my $originalValue = $self->getOriginalValue; + my $dt = eval { WebGUI::DateTime->new($session, $originalValue); }; + $dt = WebGUI::DateTime->new($session,0) if ! (blessed $dt && $dt->isa('DateTime')); ##Parsing error + $dt->set_time_zone($session->datetime->getTimeZone); + $value = $dt->toMysqlDate; } diff --git a/t/Form/Date.t b/t/Form/Date.t index 93f6056aa..80ab95698 100644 --- a/t/Form/Date.t +++ b/t/Form/Date.t @@ -50,7 +50,7 @@ my $testBlock = [ my $formType = 'date'; -my $numTests = 26 + scalar @{ $testBlock } ; +my $numTests = 27 + scalar @{ $testBlock } ; plan tests => $numTests; @@ -145,7 +145,7 @@ is( $date2 = WebGUI::Form::Date->new($session, {defaultValue => '2008-008-001'}); is( getValueFromForm($session, $date2->toHtml), - '1970-01-01', + '1969-12-31', "toHtml: defaultValue in bad mysql format returns date from epoch 0" ); @@ -161,6 +161,18 @@ is($date2->getValueAsHtml(), '8/16/2001', "getValueAsHtml: defaultValue in mysql $date2 = WebGUI::Form::Date->new($session, {defaultValue => '2008-08-01', value => '2001-08-16', }); is($date2->getValueAsHtml(), '2001-08-16', "getValueAsHtml: defaultValue in mysql format, value as mysql returns value in mysql format"); +my $dutchie = WebGUI::User->create($session); +WebGUI::Test->addToCleanup($dutchie); +$dutchie->update({timeZone => 'Europe/Amsterdam', }); +$session->user({user => $dutchie}); +my $date_form = WebGUI::Form::Date->new($session, { name => 'test_date', }); +$session->request->setup_body({ test_date => '2001-08-16', }); +my $epochal_value = $date_form->getValue; + +$date_form->set(value => $epochal_value); +my $mysql_date = getValueFromForm($session, $date_form->toHtml); +is $mysql_date, '2001-08-16', 'Form data processed and rendered round trip'; + sub getValueFromForm { my ($session, $textForm) = @_; my ($header, $footer) = (WebGUI::Form::formHeader($session), WebGUI::Form::formFooter($session));