add time zone to events for editing, fixes recurrance on wrong days

This commit is contained in:
Graham Knop 2007-09-27 05:28:39 +00:00
parent 6e56491ff7
commit 17fdc440b5
4 changed files with 48 additions and 14 deletions

View file

@ -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

View file

@ -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 ----

View file

@ -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 {
<div id="times">|
. q|Start: |.$var->{"formStartTime"}
. q|<br/>End: |.$var->{"formEndTime"}
. q|<br/>Time Zone: |.$var->{formTimeZone}
. q|</div>|;
# related links

View file

@ -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 {