From e7f5948ce105dc7c977f544da5b2a4c1b4444134 Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Mon, 4 Aug 2008 20:23:13 +0000 Subject: [PATCH] Fixed Form Date and DateTime to properly handle mysql and epoch times. Added tests to make sure they work. --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/Asset/Wobject/DataForm.pm | 1 + lib/WebGUI/Form/Date.pm | 24 +++++++++++++++++++----- lib/WebGUI/Form/DateTime.pm | 13 +++++++++++-- t/Asset/Wobject/EventManagementSystem.t | 2 ++ t/Form/Date.t | 11 +++++++++-- t/Form/DateTime.t | 14 +++++++++----- 7 files changed, 52 insertions(+), 14 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 423087252..df790fb19 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -21,6 +21,7 @@ - fixed: Server side spellchecker doesn't work - fixed: DateTime Form Control Bug - fixed: Tree Menu is always collapsed + - fixed: Form/Date and Form/DateTime to properly return MySQL formatted and epoch formatted times 7.5.18 - fixed: Collateral Image Manager broken in Firefox 3 diff --git a/lib/WebGUI/Asset/Wobject/DataForm.pm b/lib/WebGUI/Asset/Wobject/DataForm.pm index 3d2ebc219..d4f5b2fec 100644 --- a/lib/WebGUI/Asset/Wobject/DataForm.pm +++ b/lib/WebGUI/Asset/Wobject/DataForm.pm @@ -1377,6 +1377,7 @@ sub www_process { }; } $entryData->{ $field->{name} } = $value; +$self->session->errorHandler->warn($field->{name}. " ". $value); } # Process CAPTCHA diff --git a/lib/WebGUI/Form/Date.pm b/lib/WebGUI/Form/Date.pm index f5d17c34b..e7a3526ff 100644 --- a/lib/WebGUI/Form/Date.pm +++ b/lib/WebGUI/Form/Date.pm @@ -77,7 +77,8 @@ sub definition { my $class = shift; my $session = shift; my $definition = shift || []; - push(@{$definition}, { + + push(@{$definition}, { defaultValue=>{ defaultValue=>$session->datetime->time() }, @@ -137,16 +138,29 @@ sub getValue { # This should probably be rewritten as a cascading ternary my $value = $self->SUPER::getValue(@_); if (!$self->getDefaultValue || $self->getDefaultValue =~ m/^\d+$/) { - return $self->session->datetime->setToEpoch($value); + # Epoch format + if($value =~ /^\d+$/){ + return $value; + } + return $self->session->datetime->setToEpoch($value); } else { # MySQL format # YY(YY)?-MM-DD # NOTE: Cannot fix time zone since we don't have a complete date/time - - return $1 - if ($value =~ m/((?:\d{2}|\d{4})\D\d{2}\D\d{2})/); + + # MySQL format + # YY(YY)?-MM-DD HH:MM:SS + + if($value =~ /^\d+$/){ + return $self->session->datetime->epochToSet($value,$self->session->user->profileField( 'timeZone' )); + } + + # Verify format + return undef + unless ($value =~ m/((?:\d{2}|\d{4})\D\d{2}\D\d{2})/); + return $value; } } diff --git a/lib/WebGUI/Form/DateTime.pm b/lib/WebGUI/Form/DateTime.pm index d70a03a2d..1bad4194a 100644 --- a/lib/WebGUI/Form/DateTime.pm +++ b/lib/WebGUI/Form/DateTime.pm @@ -138,20 +138,29 @@ sub getValue { my $self = shift; # This should probably be rewritten as a cascading ternary my $value = $self->SUPER::getValue(@_); - if (!$self->get("defaultValue") || $self->get("defaultValue") =~ m/^\d+$/ || !$self->get("value") || $self->get("value") =~ m/^\d+$/) { + + if (!$self->getDefaultValue || $self->getDefaultValue =~ m/^\d+$/) { # Epoch format + if($value =~ /^\d+$/){ + return $value; + } return $self->session->datetime->setToEpoch($value); } else { # MySQL format # YY(YY)?-MM-DD HH:MM:SS + + if($value =~ /^\d+$/){ + return $self->session->datetime->epochToSet($value,$self->session->user->profileField( 'timeZone' )); + } # Verify format return undef unless ($value =~ m/(?:\d{2}|\d{4})\D\d{2}\D\d{2}\D\d{2}\D\d{2}\D\d{2}/); # Fix time zone - $value = WebGUI::DateTime->new(mysql => $value, time_zone => $self->get("timeZone")) + + $value = WebGUI::DateTime->new($self->session,mysql => $value, time_zone=>$self->session->user->profileField( 'timeZone' )) ->set_time_zone("UTC")->toMysql; return $value; diff --git a/t/Asset/Wobject/EventManagementSystem.t b/t/Asset/Wobject/EventManagementSystem.t index 2eadf52c6..591c6b4da 100644 --- a/t/Asset/Wobject/EventManagementSystem.t +++ b/t/Asset/Wobject/EventManagementSystem.t @@ -132,6 +132,8 @@ ok($ems->can('getRibbons'), 'Can get ribbons'); my $ribbons = $ems->getRibbons; ok(scalar(@$ribbons) == 2, 'Two ribbons exist'); +print "Cleaning\n"; + #---------------------------------------------------------------------------- # Cleanup END { diff --git a/t/Form/Date.t b/t/Form/Date.t index cf8caf17d..5cc12ad70 100644 --- a/t/Form/Date.t +++ b/t/Form/Date.t @@ -44,7 +44,7 @@ my $testBlock = [ my $formType = 'date'; -my $numTests = 12 + scalar @{ $testBlock } ; +my $numTests = 15 + scalar @{ $testBlock } ; plan tests => $numTests; @@ -94,7 +94,10 @@ $html = join "\n", @inputs = $forms[0]->inputs; $input = $inputs[0]; is($input->name, 'preDateValue', 'Checking input name'); -#is($input->value, 1217608466, 'Checking default value'); +TODO: { +local $TODO = "Figure out why this is returning a MySQL value instead of an epoch."; + is($input->value, 1217608466, 'Checking default value'); +} is($input->{size}, 10, 'Checking size param, set'); is($input->{maxlength}, 10, 'Checking maxlength param, set'); @@ -108,5 +111,9 @@ my $date2 = WebGUI::Form::Date->new($session, {'defaultValue' => '2008-08-01 16: is($date2->getValue(1217608466), '2008-08-01 11:34:26', "Epoch to MySQL"); is($date2->getValue('2008-08-01 11:34:26'), '2008-08-01 11:34:26', "MySQL to MySQL"); +my $date2 = WebGUI::Form::Date->new($session); +is($date2->getValue(1217608466), 1217608466, "Default Epoch to Epoch"); +is($date2->getValue('2008-08-01 11:34:26'), 1217608466, "Default MySQL to Epoch"); + __END__ diff --git a/t/Form/DateTime.t b/t/Form/DateTime.t index 591f55796..70bf0b19d 100644 --- a/t/Form/DateTime.t +++ b/t/Form/DateTime.t @@ -29,7 +29,7 @@ my $session = WebGUI::Test->session; my $formType = 'datetime'; -my $numTests = 14; +my $numTests = 15; plan tests => $numTests; @@ -87,14 +87,18 @@ is($input->{maxlength}, 19, 'Checking maxlength param, set'); #WebGUI::Form_Checking::auto_check($session, $formType, $testBlock); my $date1 = WebGUI::Form::DateTime->new($session, {'defaultValue' => time()}); -$session->user->profileField( 'timeZone' , 'American/Chicago'); +$session->user->profileField( 'timeZone' , 'America/Chicago'); is($date1->getValue(1217608466), 1217608466, "Epoch to Epch"); is($date1->getValue('2008-08-01 16:34:26'), $session->datetime->setToEpoch("2008-08-01 16:34:26"), "MySQL to Epoch"); +my $date2 = WebGUI::Form::DateTime->new($session); +is($date2->getValue(1217608466), 1217608466, "Default Epoch to Epch"); +is($date2->getValue('2008-08-01 16:34:26'), $session->datetime->setToEpoch("2008-08-01 16:34:26"), "Default MySQL to Epoch"); + #Dates to MySQL -my $date2 = WebGUI::Form::DateTime->new($session, {'defaultValue' => '2008-08-01 16:34:26'}); -is($date2->getValue(1217608466), '2008-08-01 11:34:26', "Epoch to MySQL"); -is($date2->getValue('2008-08-01 11:34:26'), '2008-08-01 11:34:26', "MySQL to MySQL"); +my $date3 = WebGUI::Form::DateTime->new($session, {'defaultValue' => '2008-08-01 16:34:26'}); +is($date3->getValue(1217608466), '2008-08-01 11:34:26', "Epoch to MySQL"); +is($date3->getValue('2008-08-01 11:34:26'), '2008-08-01 16:34:26', "MySQL to MySQL");#UTC is 5 hours ahead of Chicago __END__