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.
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->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;
|
|
|