webgui/lib/WebGUI/Asset/Event.pm
Drake c438d55310 Normalized signature of Asset::duplicate. This involved going through
existing overrides and callers for that method and making sure they followed
the correct signature.  Various related cleanups.

This should fix those bugs with collaboration systems refusing to be copied
or deployed as packages.
2006-09-23 01:33:46 +00:00

356 lines
12 KiB
Perl

package WebGUI::Asset::Event;
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2006 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
use strict;
use Tie::CPHash;
use WebGUI::Form;
use WebGUI::Cache;
use WebGUI::HTML;
use WebGUI::HTMLForm;
use WebGUI::International;
use WebGUI::SQL;
use WebGUI::Asset;
our @ISA = qw(WebGUI::Asset);
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = 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=>{
description => {
fieldType=>"HTMLArea",
defaultValue=>undef
},
eventStartDate => {
fieldType=>"dateTime",
defaultValue=>$session->datetime->time()
},
eventEndDate => {
fieldType=>"dateTime",
defaultValue=>$session->datetime->time()
},
EventsCalendar_recurringId => {
fieldType=>"hidden",
defaultValue=>undef
},
eventLocation => {
fieldType=>"text",
defaultValue=>undef
},
templateId => {
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000023'
}
}
});
return $class->SUPER::definition($session,$definition);
}
#-------------------------------------------------------------------
sub getEditForm {
my $self = shift;
my $tabform = $self->SUPER::getEditForm();
my $i18n = WebGUI::International->new($self->session,"Asset_Event");
$tabform->getTab("properties")->HTMLArea(
-name=>"description",
-label=>$i18n->get(512),
-hoverHelp=>$i18n->get('Description description'),
-value=>$self->getValue("description")
);
$tabform->getTab("properties")->dateTime(
-name=>"eventStartDate",
-label=>$i18n->get(513),
-hoverHelp=>$i18n->get('Start Date description'),
-extras=>'onblur="this.form.eventEndDate.value=this.form.eventStartDate.value;this.form.until.value=this.form.eventStartDate.value;"',
-value=>$self->getValue("eventStartDate")
);
$tabform->getTab("properties")->dateTime(
-name=>"eventEndDate",
-label=>$i18n->get(514),
-hoverHelp=>$i18n->get('End Date description'),
-extras=>'onblur="this.form.until.value=this.form.eventEndDate.value;"',
-value=>$self->getValue("eventEndDate")
);
$tabform->getTab("properties")->text(
-name=>"eventLocation",
-label=>$i18n->get(515),
-hoverHelp=>$i18n->get('515 description'),
-value=>$self->getValue("eventLocation")
);
if ($self->session->form->process("func") eq "add") {
my %recursEvery;
tie %recursEvery, 'Tie::IxHash';
%recursEvery = (
'never'=>$i18n->get(4),
'day'=>$i18n->get(700),
'week'=>$i18n->get(701),
'month'=>$i18n->get(702),
'year'=>$i18n->get(703),
);
$tabform->getTab("properties")->readOnly(
-label=>$i18n->get(8),
-hoverHelp=>$i18n->get('Recurs every description'),
-value=>WebGUI::Form::integer($self->session, {
name=>"interval",
defaultValue=>1
})
.WebGUI::Form::selectBox($self->session, {
name=>"recursEvery",
options=>\%recursEvery
})
.' '.$i18n->get(9).' '
.WebGUI::Form::date($self->session, {
name=>"until"
})
);
}
$tabform->getTab("display")->template(
-name=>"templateId",
-value=>$self->getValue("templateId"),
-namespace=>"EventsCalendar/Event",
-label=>$i18n->get(530),
-hoverHelp=>$i18n->get('530 description'),
);
return $tabform;
}
#-------------------------------------------------------------------
=head2 prepareView ( )
See WebGUI::Asset::prepareView() for details.
=cut
sub prepareView {
my $self = shift;
$self->SUPER::prepareView();
my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId"));
$template->prepare;
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
sub processPropertiesFromFormPost {
my $self = shift;
$self->SUPER::processPropertiesFromFormPost;
if ($self->session->form->process("assetId") eq "new") {
$self->update({eventEndDate=>$self->get("eventStartDate")}) unless ($self->get("eventEndDate") >= $self->get("eventStartDate"));
if ($self->session->form->process("recursEvery") && $self->session->form->process("recursEvery") ne "never") {
my $until = $self->session->datetime->setToEpoch($self->session->form->process("until"));
$until = $self->get("eventEndDate") unless ($until >= $self->get("eventEndDate"));
my $interval = ($self->session->form->process("interval") < 1) ? 1 : $self->session->form->process("interval");
my $recurringEventId = $self->session->id->generate();
$self->update({EventsCalendar_recurringId=>$recurringEventId});
my $start = $self->get("eventStartDate");
my $end = $self->get("eventEndDate");
my $i = 0;
while ($start < $until) {
$i++;
if ($self->session->form->process("recursEvery") eq "day") {
$start = $self->session->datetime->addToDate($self->get("eventStartDate"),0,0,($i*$interval));
$end = $self->session->datetime->addToDate($self->get("eventEndDate"),0,0,($i*$interval));
} elsif ($self->session->form->process("recursEvery") eq "week") {
$start = $self->session->datetime->addToDate($self->get("eventStartDate"),0,0,(7*$i*$interval));
$end = $self->session->datetime->addToDate($self->get("eventEndDate"),0,0,(7*$i*$interval));
} elsif ($self->session->form->process("recursEvery") eq "month") {
$start = $self->session->datetime->addToDate($self->get("eventStartDate"),0,($i*$interval),0);
$end = $self->session->datetime->addToDate($self->get("eventEndDate"),0,($i*$interval),0);
} elsif ($self->session->form->process("recursEvery") eq "year") {
$start = $self->session->datetime->addToDate($self->get("eventStartDate"),($i*$interval),0,0);
$end = $self->session->datetime->addToDate($self->get("eventEndDate"),($i*$interval),0,0);
}
my $newEvent = $self->duplicate;
$newEvent->update({
eventStartDate=>$start,
eventEndDate=>$end
});
}
}
}
}
#-------------------------------------------------------------------
=head2 purgeCache ( )
See WebGUI::Asset::purgeCache() for details.
=cut
sub purgeCache {
my $self = shift;
my $cache = WebGUI::Cache->new($self->session,"view_".$self->getId);
$cache->delete if $cache;
$self->SUPER::purgeCache;
my $parent = $self->getParent;
$parent->purgeCache if defined $parent;
}
#-------------------------------------------------------------------
=head2 setParent ( newParent )
We're overloading the setParent in Asset because we don't want events to be able to be posted to anything other than the events calendar.
=head3 newParent
An asset object to make the parent of this asset.
=cut
sub setParent {
my $self = shift;
my $newParent = shift;
return 0 unless ($newParent->get("className") eq "WebGUI::Asset::Wobject::EventsCalendar");
return $self->SUPER::setParent($newParent);
}
#-------------------------------------------------------------------
sub view {
my $self = shift;
if ($self->session->user->userId eq '1') {
my $out = WebGUI::Cache->new($self->session,"view_".$self->getId)->get;
return $out if $out;
}
my ($output, $id);
my %var = $self->get;
my $dt = $self->session->datetime;
my $i18n = WebGUI::International->new($self->session,"Asset_Event");
$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) = $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=>$event->getUrl,
title=>$event->getTitle,
});
}
$var{others_loop} = \@others;
my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate});
if ($self->session->user->userId eq '1') {
my $cache = WebGUI::Cache->new($self->session,'view_'.$self->getId);
$cache->set($out,$self->getParent->get('visitorCacheTimeout'));
}
return $out;
}
#-------------------------------------------------------------------
sub www_deleteEvent {
my $self = shift;
return $self->session->privilege->insufficient() unless ($self->canEdit);
my $i18n = WebGUI::International->new($self->session,"Asset_Event");
my ($output);
$output = '<h1>'.$i18n->get(42).'</h1>';
$output .= $i18n->get(75).'<p><blockquote>';
$output .= '<a href="'.$self->session->url->page('func=deleteEventConfirm').'">'.$i18n->get(76).'</a><p>';
$output .= '<a href="'.$self->session->url->page('func=deleteEventConfirm;rid='.$self->session->form->process("rid")).'">'
.$i18n->get(77).'</a><p>' if (($self->session->form->process("rid") ne "") and ($self->session->form->process("rid") ne "0"));
$output .= '<a href="'.$self->getUrl.'">'.$i18n->get(78).'</a>';
$output .= '</blockquote>';
return $self->session->style->process($output,$self->getParent->getValue("styleTemplateId"));
}
#-------------------------------------------------------------------
sub www_deleteEventConfirm {
my $self = shift;
return $self->session->privilege->insufficient() unless ($self->canEdit);
if (($self->session->form->process("rid") ne "") and ($self->session->form->process("rid") ne "0")) {
my $series = $self->getParent->getLineage(["descendants"],{returnObjects=>1});
foreach my $event (@{$series}) {
$event->trash if $event->get("EventsCalendar_recurringId") eq $self->session->form->process("rid");
}
} else {
$self->trash;
}
return $self->getParent->getContainer->www_view;;
}
#-------------------------------------------------------------------
sub www_edit {
my $self = shift;
return $self->session->privilege->insufficient() unless $self->canEdit;
$self->getAdminConsole->setHelp("event add/edit","Asset_Event");
my $i18n = WebGUI::International->new($self->session,"Asset_Event");
return $self->getAdminConsole->render($self->getEditForm->print,$i18n->get('13'));
}
#-------------------------------------------------------------------
sub www_view {
my $self = shift;
return $self->session->privilege->insufficient() unless ($self->canView);
$self->session->http->setCacheControl($self->get("visitorCacheTimeout")) if ($self->session->user->userId eq "1");
$self->prepareView;
return $self->session->style->process($self->view,$self->getParent->getValue("styleTemplateId"));
}
1;