From 5675e101c93719601eb5b68e371eb0918121d84e Mon Sep 17 00:00:00 2001 From: Wouter van Oijen Date: Sat, 20 May 2006 20:28:38 +0000 Subject: [PATCH] fix: Event calendar SCOPE doesn't work!! --- docs/changelog/6.x.x.txt | 3 +- lib/WebGUI/Asset/Event.pm | 89 ++++++++++++++-------- lib/WebGUI/Asset/Wobject/EventsCalendar.pm | 2 +- 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/docs/changelog/6.x.x.txt b/docs/changelog/6.x.x.txt index 30bdeb24f..4034c11f7 100644 --- a/docs/changelog/6.x.x.txt +++ b/docs/changelog/6.x.x.txt @@ -15,7 +15,8 @@ - fix - WebGUI::Form::File doesn't use WebGUI::Form::Hidden - fixed various bugs in the time tracking app - fixed a few bugs in the graphic system - - fix - Link to a page in the Webgui Page Tree + - fix - Link to a page in the Webgui Page Tree not working in IE + - fix - Event calendar SCOPE doesn't work!! (Wouter van Oijen / ProcoliX) - better HTML compliancy - fixed a lot of POD diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index c9357da09..1f073868d 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -27,14 +27,14 @@ our @ISA = qw(WebGUI::Asset); sub definition { my $class = shift; my $session = shift; - my $definition = shift; + my $definition = shift; my $i18n = WebGUI::International->new($session,"Asset_Event"); - push(@{$definition}, { - assetName=>$i18n->get('assetName'), - icon=>'calendar.gif', - tableName=>'EventsCalendar_event', - className=>'WebGUI::Asset::Event', - properties=>{ + push(@{$definition}, { + assetName=>$i18n->get('assetName'), + icon=>'calendar.gif', + tableName=>'EventsCalendar_event', + className=>'WebGUI::Asset::Event', + properties=>{ description => { fieldType=>"HTMLArea", defaultValue=>undef @@ -195,7 +195,7 @@ sub processPropertiesFromFormPost { #------------------------------------------------------------------- -=head2 purgeCache () +=head2 purgeCache ( ) See WebGUI::Asset::purgeCache() for details. @@ -236,40 +236,65 @@ sub view { my $out = WebGUI::Cache->new($self->session,"view_".$self->getId)->get; return $out if $out; } - my ($output, $event, $id); + my ($output, $id); my %var = $self->get; + my $dt = $self->session->datetime; my $i18n = WebGUI::International->new($self->session,"Asset_Event"); - $event = $self; - $var{title} = $event->getValue("title"); - $var{"start.label"} = $i18n->get(14); - $var{"start.date"} =$self->session->datetime->epochToHuman($self->getValue("eventStartDate"),"%z"); - $var{"start.time"} =$self->session->datetime->epochToHuman($self->getValue("eventStartDate"),"%Z"); - $var{"end.label"} = $i18n->get(15); - $var{"end.date"} =$self->session->datetime->epochToHuman($self->getValue("eventEndDate"),"%z"); - $var{"end.time"} =$self->session->datetime->epochToHuman($self->getValue("eventEndDate"),"%Z"); - $var{canEdit} = $self->canEdit; - $var{"edit.url"} = $self->session->url->page('func=edit'); - $var{"edit.label"} = $i18n->get(575); - $var{"delete.url"} = $self->session->url->page('func=deleteEvent;rid='.$self->getValue("EventsCalendar_recurringId")); - $var{"delete.label"} = $i18n->get(576); + $var{'title'} = $self->getValue('title'); + $var{'start.label'} = $i18n->get(14); + $var{'start.date'} = $dt->epochToHuman($self->getValue('eventStartDate'),"%z"); + $var{'start.time'} = $dt->epochToHuman($self->getValue('eventStartDate'),"%Z"); + $var{'end.label'} = $i18n->get(15); + $var{'end.date'} = $dt->epochToHuman($self->getValue('eventEndDate'),'%z'); + $var{'end.time'} = $dt->epochToHuman($self->getValue('eventEndDate'),'%Z'); + $var{'canEdit'} = $self->canEdit; + $var{'edit.url'} = $self->session->url->page('func=edit'); + $var{'edit.label'} = $i18n->get(575); + $var{'delete.url'} = $self->session->url->page('func=deleteEvent;rid='.$self->getValue('EventsCalendar_recurringId')); + $var{'delete.label'} = $i18n->get(576); my @others; my ($start, $garbage, $end); - ($start, $garbage) = $self->session->datetime->dayStartEnd($self->get("eventStartDate")); - ($garbage, $end) = $self->session->datetime->dayStartEnd($self->get("eventEndDate")); - my $sth = $self->session->db->read("select assetId from EventsCalendar_event where ((eventStartDate >= $start and eventStartDate <= $end) or (eventEndDate >= $start and eventEndDate <= $end)) and assetId<>".$self->session->db->quote($self->getId)); - while (my ($assetId) = $sth->array) { - my $asset = WebGUI::Asset::Event->new($self->session, $assetId); - # deal with multiple versions of the same event with conflicting dates - next unless (($asset->get("eventStartDate") >= $start && $asset->get("eventStartDate") <= $end) || ($asset->get("eventEndDate") >= $start && $asset->get("eventEndDate") <= $end)); + ($start, $garbage) = $dt->dayStartEnd($self->get('eventStartDate')); + ($garbage, $end) = $dt->dayStartEnd($self->get('eventEndDate')); + + my $calendar = $self->getParent(); + my $scope = $calendar->get('scope'); + my $events; + if ($scope == 0) { # Calendar Scope is Regular + $events = $calendar->getLineage(['children'], + {returnObjects=>1, + includeOnlyClasses=>['WebGUI::Asset::Event']}); + } elsif ($scope == 2) { # Calendar Scope is Master + $events = $calendar->getLineage(['descendants'], + {returnObjects=>1, + includeOnlyClasses=>['WebGUI::Asset::Event']}); + } elsif ($scope == 1) { # Calendar Scope is Global + my $root = WebGUI::Asset->getRoot($self->session); + $events = $root->getLineage(['descendants'], + {returnObjects=>1, + includeOnlyClasses=>['WebGUI::Asset::Event']}); + } + + foreach my $event (@{$events}) { + # skip events that are already ended + next if ($event->get('eventEndDate') < $start); + # skip events that are in the future + next if ($event->get('eventStartDate') > $end); + # skip events we are not allowed to see + next unless ($event->canView); + # skip self + next if ($event->get('assetId') eq $self->get('assetId')); + push(@others,{ - url=>$asset->getUrl, - title=>$asset->getTitle, + url=>$event->getUrl, + title=>$event->getTitle, }); } $var{others_loop} = \@others; my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate}); if ($self->session->user->userId eq '1') { - WebGUI::Cache->new($self->session,"view_".$self->getId)->set($out,$self->getParent->get("visitorCacheTimeout")); + my $cache = WebGUI::Cache->new($self->session,'view_'.$self->getId); + $cache->set($out,$self->getParent->get('visitorCacheTimeout')); } return $out; } diff --git a/lib/WebGUI/Asset/Wobject/EventsCalendar.pm b/lib/WebGUI/Asset/Wobject/EventsCalendar.pm index 1d7d7483e..7a1065d2e 100644 --- a/lib/WebGUI/Asset/Wobject/EventsCalendar.pm +++ b/lib/WebGUI/Asset/Wobject/EventsCalendar.pm @@ -258,7 +258,7 @@ sub view { $events = $self->getLineage(['descendants'], {returnObjects=>1,includeOnlyClasses=>['WebGUI::Asset::Event']}); } elsif ($scope == 1) { # Calendar Scope is Global - $events = WebGUI::Asset::getRoot($session)->getLineage(['descendants'], + $events = WebGUI::Asset->getRoot($session)->getLineage(['descendants'], {returnObjects=>1,includeOnlyClasses=>['WebGUI::Asset::Event']}); } # Sort events by startDate, then endDate