From 17fdc440b57197f62a0f48e5ca8864f092d2e2b4 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Thu, 27 Sep 2007 05:28:39 +0000 Subject: [PATCH] add time zone to events for editing, fixes recurrance on wrong days --- docs/changelog/7.x.x.txt | 1 + docs/upgrades/upgrade_7.4.7-7.4.8.pl | 7 ++++ lib/WebGUI/Asset/Event.pm | 49 +++++++++++++++++++++------- lib/WebGUI/Form/TimeField.pm | 5 +-- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 1f688e3a5..02b25ec31 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -9,6 +9,7 @@ - fix: Anonymous user creation doesn't use default values for yes/no fields - changed hover help to use YUI tooltips, fixes positioning issues - remove duplicate header section in calendar event template + - events now have a time zone. fixes recurring events being generated on the wrong day. 7.4.7 - fix: misspelled i18n in webgui password recovery diff --git a/docs/upgrades/upgrade_7.4.7-7.4.8.pl b/docs/upgrades/upgrade_7.4.7-7.4.8.pl index 442bacb3b..0333bd516 100644 --- a/docs/upgrades/upgrade_7.4.7-7.4.8.pl +++ b/docs/upgrades/upgrade_7.4.7-7.4.8.pl @@ -21,6 +21,7 @@ my $quiet; # this line required my $session = start(); # this line required # upgrade functions go here +addEventTimeZone($session); finish($session); # this line required @@ -32,6 +33,12 @@ finish($session); # this line required # # and here's our code #} +#------------------------------------------------- +sub addEventTimeZone { + my $session = shift; + $session->db->write("alter table Event add column timeZone varchar(255) binary default 'UTC'"); +} + # ---- DO NOT EDIT BELOW THIS LINE ---- diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 894ff3de9..e48a4ebeb 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -112,6 +112,9 @@ sub definition { fieldType => "Text", defaultValue => undef, }, + 'timeZone' => { + fieldType => 'TimeZone', + }, ); @@ -210,20 +213,32 @@ sub generateRecurringEvents { $duration_days = $event_end->subtract_datetime($event_start)->days; + my $eventTime; + if ($properties->{startTime}) { + $eventTime = WebGUI::DateTime->new($session, $properties->{startDate} . " " . $properties->{startTime}); + $eventTime = $eventTime->set_time_zone($properties->{timeZone})->toMysqlTime; + } + my @dates = $self->getRecurrenceDates; for my $date (@dates) { + my $dt; + if ($eventTime) { + $dt = WebGUI::DateTime->new($session, mysql => $date . " " . $eventTime, time_zone => $properties->{timeZone}); + } + else { + $dt = WebGUI::DateTime->new($session, $date." ". "00:00:00"); + } + my $startDate = $dt->toDatabaseDate; # Only generate if the recurId does not exist on this day my ($exists) = $session->db->quickArray( "select count(*) from Event where recurId=? and startDate=?", - [$properties->{recurId}, $date], + [$properties->{recurId}, $startDate], ); if (!$exists) { - my $dt = WebGUI::DateTime->new($self->session, $date." 00:00:00"); - - $properties->{startDate} = $dt->toDatabaseDate; + $properties->{startDate} = $startDate; $properties->{endDate} = $dt->clone->add(days => $duration_days)->toDatabaseDate; @@ -1244,8 +1259,9 @@ sub getTemplateVars { $var{ "urlWeek" } = $self->getParent->getUrl("type=week;start=".$urlStartParam); $var{ "urlMonth" } = $self->getParent->getUrl("type=month;start=".$urlStartParam); $var{ "urlParent" } = $self->getParent->getUrl; - $var{"urlSearch"} = $self->getParent->getSearchUrl; + $var{ "urlSearch" } = $self->getParent->getSearchUrl; + $var{"timeZone"} = $self->get('timeZone'); # Related links $var{ "relatedLinks" } = []; @@ -1436,7 +1452,7 @@ sub processPropertiesFromFormPost { } # Non-allday events need timezone conversion else { - my $tz = $self->session->user->profileField("timeZone"); + my $tz = $self->get('timeZone'); my $dtStart = WebGUI::DateTime->new($session, @@ -1728,7 +1744,7 @@ sub www_edit { my $self = shift; my $session = $self->session; my $form = $self->session->form; - my $tz = $session->user->profileField("timeZone"); + my $tz = $form->param('timeZone') || $self->get('timeZone') || $session->user->profileField('timeZone'); my $func = lc $session->form->param("func"); my $var = {}; @@ -1849,7 +1865,7 @@ sub www_edit { $default_start = WebGUI::DateTime->new($session, mysql => $session->form->param("start"), - time_zone => $session->user->profileField("timeZone"), + time_zone => $tz, ); } else { @@ -1863,8 +1879,9 @@ sub www_edit { $startDate = $dtStart->toDatabaseDate; } else { - $startDate = $dtStart->toUserTimeZoneDate; - $startTime = $dtStart->toUserTimeZoneTime; + my $start = $dtStart->clone->set_time_zone($tz); + $startDate = $start->toMysqlDate; + $startTime = $start->toMysqlTime; } } @@ -1892,8 +1909,9 @@ sub www_edit { $endDate = $dtEnd->toDatabaseDate; } else { - $endDate = $dtEnd->toUserTimeZoneDate; - $endTime = $dtEnd->toUserTimeZoneTime; + my $end = $dtEnd->clone->set_time_zone($tz); + $endDate = $dtEnd->toMysqlDate; + $endTime = $dtEnd->toMysqlTime; } } @@ -1909,6 +1927,12 @@ sub www_edit { value => $form->param("endTime") || $endTime, defaultValue => $default_end->toUserTimeZoneTime, }); + $var->{"formTimeZone"} + = WebGUI::Form::TimeZone($session, { + name => "timeZone", + value => $tz, + }); + # time my $allday = defined $form->param("allday") @@ -1930,6 +1954,7 @@ sub www_edit {
| . q|Start: |.$var->{"formStartTime"} . q|
End: |.$var->{"formEndTime"} + . q|
Time Zone: |.$var->{formTimeZone} . q|
|; # related links diff --git a/lib/WebGUI/Form/TimeField.pm b/lib/WebGUI/Form/TimeField.pm index 08b8ed1f3..092cb2786 100644 --- a/lib/WebGUI/Form/TimeField.pm +++ b/lib/WebGUI/Form/TimeField.pm @@ -137,10 +137,11 @@ sub getValueFromPost { } # This should probably be rewritten as a cascading ternary - if (!$self->get("defaultValue") + if ($self->get('format') ne 'mysql' && ( + !$self->get("defaultValue") || $self->get("defaultValue") =~ m/^\d+$/ || !$self->get("value") - || $self->get("value") =~ m/^\d+$/) { + || $self->get("value") =~ m/^\d+$/)) { # epoch format return $self->session->datetime->timeToSeconds($self->session->form->param($self->get("name")))-($self->session->user->profileField("timeOffset")*3600); } else {