356 lines
12 KiB
Perl
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->getParent->duplicate($self);
|
|
$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;
|
|
|