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; WebGUI::Cache->new($self->session,"view_".$self->getId)->delete; $self->SUPER::purgeCache; $self->getParent->purgeCache; } #------------------------------------------------------------------- =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, $event, $id); my %var = $self->get; 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); 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)); push(@others,{ url=>$asset->getUrl, title=>$asset->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")); } 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 = '
'; $output .= ''.$i18n->get(76).''; 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;'; $output .= '' .$i18n->get(77).'
' if (($self->session->form->process("rid") ne "") and ($self->session->form->process("rid") ne "0")); $output .= ''.$i18n->get(78).''; $output .= '