diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt
index 53ebd1ff4..ae76f5076 100644
--- a/docs/changelog/7.x.x.txt
+++ b/docs/changelog/7.x.x.txt
@@ -18,6 +18,10 @@
require that it be used.
- fix: Image in trash though visible in article
- fix: Direct 6.8.10-7.2+ Upgrade Problem
+ - fix: Calendar feeds lastUpdated field only shows the year
+ - fix: Calendar feeds do not work
+ - fix: Sharing information between Calendars on the same server is now less
+ kludgy
- fix: Adding tasks to project manager has long load time
- fix: Project manager tasks get cached (not clearing) when bouncing between edit and new
diff --git a/docs/upgrades/upgrade_7.3.8-7.3.9.pl b/docs/upgrades/upgrade_7.3.8-7.3.9.pl
index 46767b2f8..73f160ad2 100644
--- a/docs/upgrades/upgrade_7.3.8-7.3.9.pl
+++ b/docs/upgrades/upgrade_7.3.8-7.3.9.pl
@@ -21,6 +21,8 @@ my $quiet; # this line required
my $session = start(); # this line required
# upgrade functions go here
+fixCalendarFeedsLastUpdatedField();
+
finish($session); # this line required
@@ -33,6 +35,13 @@ finish($session); # this line required
#}
+##-------------------------------------------------
+sub fixCalendarFeedsLastUpdatedField {
+ my $session = shift;
+ print "\tFixing Calendar Feeds lastUpdated field.\n" unless ($quiet);
+ $session->db->write("alter table Calendar_feeds modify column lastUpdated datetime");
+}
+
# ---- DO NOT EDIT BELOW THIS LINE ----
diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm
index e33d0bba5..3975e8824 100644
--- a/lib/WebGUI/Asset/Wobject/Calendar.pm
+++ b/lib/WebGUI/Asset/Wobject/Calendar.pm
@@ -45,197 +45,195 @@ use JSON;
####################################################################
sub definition {
- my $class = shift;
- my $session = shift;
- my $definition = shift || [];
-
- my $i18n = WebGUI::International->new($session, 'Asset_Calendar');
-
- ### Set up list options ###
- tie (my %optionsDefaultView, 'Tie::IxHash',
- month => $i18n->get("defaultView value month"),
- week => $i18n->get("defaultView value week"),
- day => $i18n->get("defaultView value day"),
- );
- tie (my %optionsDefaultDate, 'Tie::IxHash',
- current => $i18n->get("defaultDate value current"),
- first => $i18n->get("defaultDate value first"),
- last => $i18n->get("defaultDate value last"),
- );
-
-
-
- ### Build properties hash ###
- tie my %properties, 'Tie::IxHash';
- %properties = (
-
- ##### DEFAULTS #####
- defaultView => {
- fieldType => "SelectBox",
- defaultValue => "month",
- options => \%optionsDefaultView,
- tab => "display",
- label => $i18n->get("defaultView label"),
- hoverHelp => $i18n->get("defaultView description"),
- },
-
- defaultDate => {
- fieldType => "SelectBox",
- defaultValue => 'current',
- options => \%optionsDefaultDate,
- tab => "display",
- label => $i18n->get("defaultDate label"),
- hoverHelp => $i18n->get("defaultDate description"),
- },
-
- ##### GROUPS / ACCESS #####
- # Edit events
- groupIdEventEdit => {
- fieldType => "group",
- defaultValue => "3",
- tab => "security",
- label => $i18n->get("groupIdEventEdit label"),
- hoverHelp => $i18n->get("groupIdEventEdit description"),
- },
- groupIdSubscribed => {
- fieldType => 'hidden',
- },
-
-
- ##### TEMPLATES - DISPLAY #####
- # Month
- templateIdMonth =>{
- fieldType =>"template",
- defaultValue =>'CalendarMonth000000001',
- tab =>"display",
- namespace =>"Calendar/Month",
- hoverHelp =>$i18n->get('templateIdMonth description'),
- label =>$i18n->get('templateIdMonth label'),
- },
-
- # Week
- templateIdWeek =>{
- fieldType =>"template",
- defaultValue =>'CalendarWeek0000000001',
- tab =>"display",
- namespace =>"Calendar/Week",
- hoverHelp =>$i18n->get('templateIdWeek description'),
- label =>$i18n->get('templateIdWeek label'),
- },
-
- # Day
- templateIdDay =>{
- fieldType =>"template",
- defaultValue =>'CalendarDay00000000001',
- tab =>"display",
- namespace =>"Calendar/Day",
- hoverHelp =>$i18n->get('templateIdDay description'),
- label =>$i18n->get('templateIdDay label'),
- },
-
- # Event Details
- templateIdEvent =>{
- fieldType =>"template",
- defaultValue =>'CalendarEvent000000001',
- tab =>"display",
- namespace =>"Calendar/Event",
- hoverHelp =>$i18n->get('templateIdEvent description'),
- label =>$i18n->get('templateIdEvent label'),
- },
-
- # Event Edit
- templateIdEventEdit =>{
- fieldType =>"template",
- defaultValue =>'CalendarEventEdit00001',
- tab =>"display",
- namespace =>"Calendar/EventEdit",
- hoverHelp =>$i18n->get('templateIdEventEdit description'),
- label =>$i18n->get('templateIdEventEdit label'),
- },
-
- # Search
- templateIdSearch =>{
- fieldType =>"template",
- defaultValue =>'CalendarSearch00000001',
- tab =>"display",
- namespace =>"Calendar/Search",
- hoverHelp =>$i18n->get('templateIdSearch description'),
- label =>$i18n->get('templateIdSearch label'),
- },
-
-
- ##### TEMPLATES - PRINT #####
- # Month
- templateIdPrintMonth =>{
- fieldType =>"template",
- defaultValue =>'CalendarPrintMonth0001',
- tab =>"display",
- namespace =>"Calendar/Print/Month",
- hoverHelp =>$i18n->get('templateIdPrintMonth description'),
- label =>$i18n->get('templateIdPrintMonth label'),
- },
-
- # Week
- templateIdPrintWeek =>{
- fieldType =>"template",
- defaultValue =>'CalendarPrintWeek00001',
- tab =>"display",
- namespace =>"Calendar/Print/Week",
- hoverHelp =>$i18n->get('templateIdPrintWeek description'),
- label =>$i18n->get('templateIdPrintWeek label'),
- },
-
- # Day
- templateIdPrintDay =>{
- fieldType =>"template",
- defaultValue =>'CalendarPrintDay000001',
- tab =>"display",
- namespace =>"Calendar/Print/Day",
- hoverHelp =>$i18n->get('templateIdPrintDay description'),
- label =>$i18n->get('templateIdPrintDay label'),
- },
-
- # Event Details
- templateIdPrintEvent =>{
- fieldType =>"template",
- defaultValue =>'CalendarPrintEvent0001',
- tab =>"display",
- namespace =>"Calendar/Print/Event",
- hoverHelp =>$i18n->get('templateIdPrintEvent description'),
- label =>$i18n->get('templateIdPrintEvent label'),
- },
-
-
- ##### Miscellany #####
- visitorCacheTimeout => {
- fieldType => "integer",
- defaultValue => "60",
- tab => "display",
- hoverHelp => $i18n->get('visitorCacheTimeout description'),
- label => $i18n->get('visitorCacheTimeout label'),
- },
-
- subscriberNotifyOffset => {
- fieldType => "integer",
- defaultValue => "2",
- tab => "properties",
- hoverHelp => $i18n->get('subscriberNotifyOffset description'),
- label => $i18n->get('subscriberNotifyOffset label'),
- },
-
-
- );
-
- push(@{$definition}, {
- assetName =>$i18n->get('assetName'),
- icon =>'calendar.gif',
- tableName =>'Calendar',
- className =>'WebGUI::Asset::Wobject::Calendar',
- properties =>\%properties,
- autoGenerateForms=>1,
- });
-
- return $class->SUPER::definition($session, $definition);
+ my $class = shift;
+ my $session = shift;
+ my $definition = shift || [];
+
+ my $i18n = WebGUI::International->new($session, 'Asset_Calendar');
+
+ ### Set up list options ###
+ tie (my %optionsDefaultView, 'Tie::IxHash',
+ month => $i18n->get("defaultView value month"),
+ week => $i18n->get("defaultView value week"),
+ day => $i18n->get("defaultView value day"),
+ );
+ tie (my %optionsDefaultDate, 'Tie::IxHash',
+ current => $i18n->get("defaultDate value current"),
+ first => $i18n->get("defaultDate value first"),
+ last => $i18n->get("defaultDate value last"),
+ );
+
+
+
+ ### Build properties hash ###
+ tie my %properties, 'Tie::IxHash';
+ %properties = (
+
+ ##### DEFAULTS #####
+ defaultView => {
+ fieldType => "SelectBox",
+ defaultValue => "month",
+ options => \%optionsDefaultView,
+ tab => "display",
+ label => $i18n->get("defaultView label"),
+ hoverHelp => $i18n->get("defaultView description"),
+ },
+
+ defaultDate => {
+ fieldType => "SelectBox",
+ defaultValue => 'current',
+ options => \%optionsDefaultDate,
+ tab => "display",
+ label => $i18n->get("defaultDate label"),
+ hoverHelp => $i18n->get("defaultDate description"),
+ },
+
+ ##### GROUPS / ACCESS #####
+ # Edit events
+ groupIdEventEdit => {
+ fieldType => "group",
+ defaultValue => "3",
+ tab => "security",
+ label => $i18n->get("groupIdEventEdit label"),
+ hoverHelp => $i18n->get("groupIdEventEdit description"),
+ },
+ groupIdSubscribed => {
+ fieldType => 'hidden',
+ },
+
+
+ ##### TEMPLATES - DISPLAY #####
+ # Month
+ templateIdMonth => {
+ fieldType => "template",
+ defaultValue => 'CalendarMonth000000001',
+ tab => "display",
+ namespace => "Calendar/Month",
+ hoverHelp => $i18n->get('templateIdMonth description'),
+ label => $i18n->get('templateIdMonth label'),
+ },
+
+ # Week
+ templateIdWeek => {
+ fieldType => "template",
+ defaultValue => 'CalendarWeek0000000001',
+ tab => "display",
+ namespace => "Calendar/Week",
+ hoverHelp => $i18n->get('templateIdWeek description'),
+ label => $i18n->get('templateIdWeek label'),
+ },
+
+ # Day
+ templateIdDay => {
+ fieldType => "template",
+ defaultValue => 'CalendarDay00000000001',
+ tab => "display",
+ namespace => "Calendar/Day",
+ hoverHelp => $i18n->get('templateIdDay description'),
+ label => $i18n->get('templateIdDay label'),
+ },
+
+ # Event Details
+ templateIdEvent => {
+ fieldType => "template",
+ defaultValue => 'CalendarEvent000000001',
+ tab => "display",
+ namespace => "Calendar/Event",
+ hoverHelp => $i18n->get('templateIdEvent description'),
+ label => $i18n->get('templateIdEvent label'),
+ },
+
+ # Event Edit
+ templateIdEventEdit => {
+ fieldType => "template",
+ defaultValue => 'CalendarEventEdit00001',
+ tab => "display",
+ namespace => "Calendar/EventEdit",
+ hoverHelp => $i18n->get('templateIdEventEdit description'),
+ label => $i18n->get('templateIdEventEdit label'),
+ },
+
+ # Search
+ templateIdSearch => {
+ fieldType => "template",
+ defaultValue => 'CalendarSearch00000001',
+ tab => "display",
+ namespace => "Calendar/Search",
+ hoverHelp => $i18n->get('templateIdSearch description'),
+ label => $i18n->get('templateIdSearch label'),
+ },
+
+
+ ##### TEMPLATES - PRINT #####
+ # Month
+ templateIdPrintMonth => {
+ fieldType => "template",
+ defaultValue => 'CalendarPrintMonth0001',
+ tab => "display",
+ namespace => "Calendar/Print/Month",
+ hoverHelp => $i18n->get('templateIdPrintMonth description'),
+ label => $i18n->get('templateIdPrintMonth label'),
+ },
+
+ # Week
+ templateIdPrintWeek => {
+ fieldType => "template",
+ defaultValue => 'CalendarPrintWeek00001',
+ tab => "display",
+ namespace => "Calendar/Print/Week",
+ hoverHelp => $i18n->get('templateIdPrintWeek description'),
+ label => $i18n->get('templateIdPrintWeek label'),
+ },
+
+ # Day
+ templateIdPrintDay => {
+ fieldType => "template",
+ defaultValue => 'CalendarPrintDay000001',
+ tab => "display",
+ namespace => "Calendar/Print/Day",
+ hoverHelp => $i18n->get('templateIdPrintDay description'),
+ label => $i18n->get('templateIdPrintDay label'),
+ },
+
+ # Event Details
+ templateIdPrintEvent => {
+ fieldType => "template",
+ defaultValue => 'CalendarPrintEvent0001',
+ tab => "display",
+ namespace => "Calendar/Print/Event",
+ hoverHelp => $i18n->get('templateIdPrintEvent description'),
+ label => $i18n->get('templateIdPrintEvent label'),
+ },
+
+
+ ##### Miscellany #####
+ visitorCacheTimeout => {
+ fieldType => "integer",
+ defaultValue => "60",
+ tab => "display",
+ hoverHelp => $i18n->get('visitorCacheTimeout description'),
+ label => $i18n->get('visitorCacheTimeout label'),
+ },
+
+ subscriberNotifyOffset => {
+ fieldType => "integer",
+ defaultValue => "2",
+ tab => "properties",
+ hoverHelp => $i18n->get('subscriberNotifyOffset description'),
+ label => $i18n->get('subscriberNotifyOffset label'),
+ },
+ );
+
+ push(@{$definition}, {
+ assetName => $i18n->get('assetName'),
+ icon => 'calendar.gif',
+ tableName => 'Calendar',
+ className => 'WebGUI::Asset::Wobject::Calendar',
+ properties => \%properties,
+ autoGenerateForms => 1,
+ });
+
+ return $class->SUPER::definition($session, $definition);
}
@@ -245,27 +243,23 @@ sub definition {
####################################################################
-=head2 addChild ( )
+=head2 addChild ( properties [, more ] )
Only allows Events to be added as a child of this asset.
=cut
-sub addChild
-{
- my $self = shift;
- my $properties = shift;
- my @other = @_;
-
- unless ($properties->{className} eq "WebGUI::Asset::Event")
- {
- $self->session->errorHandler->security("add a ".$properties->{className}." to a ".$self->get("className"));
- return undef;
- }
-
-
-
- return $self->SUPER::addChild($properties, @other);
+sub addChild {
+ my $self = shift;
+ my $properties = shift;
+ my @other = @_;
+
+ if ($properties->{className} ne "WebGUI::Asset::Event") {
+ $self->session->errorHandler->security("add a ".$properties->{className}." to a ".$self->get("className"));
+ return undef;
+ }
+
+ return $self->SUPER::addChild($properties, @other);
}
@@ -283,26 +277,21 @@ around the canEdit check when www_editSave is being used to add an asset).
=cut
-sub canEdit
-{
- my $self = shift;
- my $form = $self->session->form;
- my $user = $self->session->user;
-
- return (
- (
- (
- $form->process("func") eq "add" ||
- (
- $form->process("assetId") eq "new" &&
- $form->process("func") eq "editSave" &&
- $form->process("class") eq "WebGUI::Asset::Post::Thread"
- )
- ) &&
- $self->canAddEvent
- ) || # account for new events
- $self->SUPER::canEdit()
- );
+sub canEdit {
+ my $self = shift;
+ my $form = $self->session->form;
+ my $user = $self->session->user;
+
+ # Account for new events
+ return 1 if ($self->canAddEvent && $form->process("func") eq "add");
+ return 1 if (
+ $self->canAddEvent
+ && $form->process("assetId") eq "new"
+ && $form->process("func") eq "editSave"
+ && $form->process("class") eq "WebGUI::Asset::Event"
+ );
+
+ return $self->SUPER::canEdit()
}
@@ -314,23 +303,24 @@ sub canEdit
Returns true if able to add events. Checks to make sure that the
Calendar has been committed at least once. Checks to make sure that
-the user is in the appropriate group.
+the user is in the appropriate group (either the group that can edit
+the calendar, or the group that can edit events in the calendar).
=cut
-sub canAddEvent
-{
- my $self = shift;
-
- return (
- (
- $self->get("status") eq "approved" ||
- $self->getTagCount > 1 # checks to make sure that the calendar has been committed at least once
- ) && (
- $self->session->user->isInGroup($self->get("groupIdEventEdit"))
- || $self->SUPER::canEdit
- )
- );
+sub canAddEvent {
+ my $self = shift;
+
+ # Events can only be added after the Calendar has been committed once
+ return 0 if (
+ $self->get("status") ne "approved"
+ && $self->getTagCount <= 1
+ );
+
+ return 1 if (
+ $self->session->user->isInGroup($self->get("groupIdEventEdit"))
+ || $self->SUPER::canEdit
+ );
}
@@ -338,26 +328,28 @@ sub canAddEvent
####################################################################
-=head2 createSubscriptionGroup
+=head2 createSubscriptionGroup ( )
Creates the group for users that are subscribed to the Calendar.
-Stolen from WebGUI::Asset::Wobject::Collaboration.
-
=cut
-sub createSubscriptionGroup
-{
- my $self = shift;
- my $group = WebGUI::Group->new($self->session, "new");
- $group->name($self->getId);
- $group->description("The group to store subscriptions for the calendar ".$self->getId);
- $group->isEditable(0);
- $group->showInForms(0);
- $group->deleteGroups([3]); # admins don't want to be auto subscribed to this thing
- $self->update({
- groupIdSubscription=>$group->getId
- });
+# Copied from WebGUI::Asset::Wobject::Collaboration.
+sub createSubscriptionGroup {
+ my $self = shift;
+
+ my $group = WebGUI::Group->new($self->session, "new");
+ $group->name($self->getId);
+ $group->description("The group to store subscriptions for the calendar ".$self->getId);
+ $group->isEditable(0);
+ $group->showInForms(0);
+ $group->deleteGroups([3]); # admins don't want to be auto subscribed to this thing
+
+ $self->update({
+ groupIdSubscription => $group->getId
+ });
+
+ return;
}
@@ -372,24 +364,24 @@ Duplicates an Event Calendar. Duplicates all the events in this Event Calendar.
=cut
-sub duplicate
-{
- my $self = shift;
- my $newAsset = $self->SUPER::duplicate(@_);
-
- my @events = $self->getLineage(["descendents"],
- {
- returnObjects => 1,
- includeOnlyClasses => ['WebGUI::Asset::Event'],
- });
-
-
- for my $event (@events) {
- my %eventProperties = %{ $event->get() };
- $newAsset->addChild(\%eventProperties);
- }
-
- return $newAsset;
+sub duplicate {
+ my $self = shift;
+
+ # Superclass duplicates the calendar
+ my $newCalendar = $self->SUPER::duplicate(@_);
+
+ # Duplicate the events in this calendar
+ my @events = $self->getLineage(["descendents"], {
+ returnObjects => 1,
+ includeOnlyClasses => ['WebGUI::Asset::Event'],
+ });
+
+ for my $event (@events) {
+ my %eventProperties = %{ $event->get() };
+ $newCalendar->addChild(\%eventProperties);
+ }
+
+ return $newCalendar;
}
@@ -407,154 +399,152 @@ in other areas.
=cut
-sub getEditForm
-{
- my $self = shift;
- my $session = $self->session;
- my $form = $self->SUPER::getEditForm;
- my $i18n = WebGUI::International->new($session,"Asset_Calendar");
-
- my $tab = $form->addTab("feeds",$i18n->get("feeds"));
- $tab->raw("
| ");
-
-
- $tab->raw(<<'ENDJS');
-
+sub getEditForm {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $self->SUPER::getEditForm;
+ my $i18n = WebGUI::International->new($session,"Asset_Calendar");
+
+ my $tab = $form->addTab("feeds",$i18n->get("feeds"));
+ $tab->raw(" |
");
+
+
+ $tab->raw(<<'ENDJS');
+
ENDJS
-
-
- $tab->raw(<<'ENDHTML');
-
-
-
-
-
-
- | |
- Feed URL |
- Status |
- Last Updated |
- |
-
-
+
+
+ $tab->raw(<<'ENDHTML');
+
+
+
+
+
+
+ | |
+ Feed URL |
+ Status |
+ Last Updated |
+ |
+
+
ENDHTML
-
-
-
- # Add the existing feeds
- my $feeds = $self->getFeeds();
- $tab->raw('');
-
-
- $tab->raw(" |
");
- return $form;
+
+
+
+ # Add the existing feeds
+ my $feeds = $self->getFeeds();
+ $tab->raw('');
+
+
+ $tab->raw("");
+ return $form;
}
@@ -571,22 +561,21 @@ this Calendar.
=cut
-sub getEvent
-{
- my $self = shift;
- my $assetId = shift;
- # Warn and return if no assetId
- $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEvent :: No asset ID."), return
- unless $assetId;
-
- # ? Perhaps use Stow to cache events ?
-
- my $event = WebGUI::Asset->newByDynamicClass($self->session, $assetId);
-
- $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEvent :: Event '$assetId' not a child of calendar '".$self->getId."'"), return
- unless $event->get("parentId") eq $self->getId;
-
- return $event;
+sub getEvent {
+ my $self = shift;
+ my $assetId = shift;
+ # Warn and return if no assetId
+ $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEvent :: No asset ID."), return
+ unless $assetId;
+
+ # ? Perhaps use Stow to cache events ?
+
+ my $event = WebGUI::Asset->newByDynamicClass($self->session, $assetId);
+
+ $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEvent :: Event '$assetId' not a child of calendar '".$self->getId."'"), return
+ unless $event->get("parentId") eq $self->getId;
+
+ return $event;
}
@@ -602,7 +591,7 @@ start date/time.
If no Events can be found, returns an empty list.
-This method expects that startDate and endDate are already adjusted for the
+NOTE: This method expects that startDate and endDate are already adjusted for the
user's time zone.
TODO: Allow WebGUI::DateTime objects to be passed as the parameters.
@@ -610,51 +599,68 @@ TODO: Allow WebGUI::DateTime objects to be passed as the parameters.
TODO: Allow for a hashref of options as the third parameter to specify such
things as a limit clause, or additional where clause, or something.
-This is the main way to get events from a calendar, so it must be capable.
+This is the main API method to get events from a calendar, so it must be flexible.
=cut
-sub getEventsIn
-{
- my $self = shift;
- my $start = shift;
- my $end = shift;
- my $tz = $self->session->user->profileField("timeZone");
- my $events;
-
- # Warn and return if no startDate or endDate
- unless ($start && $end)
- {
- $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEventsIn() called with not enough arguments at ".join('::',(caller)[1,2]));
- return;
- }
-
- # Create objects and adjust for timezone
-
- my ($startDate,$startTime) = split / /, $start;
- my ($endDate,$endTime) = split / /, $end;
-
- my $startTz = WebGUI::DateTime->new($self->session, mysql => $start, time_zone => $tz)
- ->set_time_zone("UTC")->toMysql;
- my $endTz = WebGUI::DateTime->new($self->session, mysql => $end, time_zone => $tz)
- ->set_time_zone("UTC")->toMysql;
-
- my $where = qq{(Event.startTime IS NULL && Event.endTime IS NULL && Event.startDate >= '$startDate' && Event.startDate < '$endDate')}
- . qq{ || ( CONCAT(Event.startDate,' ',Event.startTime) >= '$startTz' && CONCAT(Event.startDate,' ',Event.startTime) < '$endTz')};
- my $orderby = "Event.startDate, Event.startTime, Event.endDate, Event.endTime, assetData.title, assetData.assetId";
-
- $events = $self->getLineage(["descendants"],
- {
- returnObjects => 1,
- includeOnlyClasses => ['WebGUI::Asset::Event'],
- joinClass => 'WebGUI::Asset::Event',
- orderByClause => $orderby,
- whereClause => $where,
- });
-
- #? Perhaps use Stow to cache Events ?#
-
- return @{$events};
+sub getEventsIn {
+ my $self = shift;
+ my $start = shift;
+ my $end = shift;
+ my $tz = $self->session->user->profileField("timeZone");
+
+ # Warn and return if no startDate or endDate
+ unless ($start && $end) {
+ $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEventsIn() called with not enough arguments at ".join('::',(caller)[1,2]));
+ return;
+ }
+
+ # Create objects and adjust for timezone
+
+ my ($startDate,$startTime) = split / /, $start;
+ my ($endDate,$endTime) = split / /, $end;
+
+ my $startTz = WebGUI::DateTime->new($self->session, mysql => $start, time_zone => $tz)
+ ->set_time_zone("UTC")->toMysql;
+ my $endTz = WebGUI::DateTime->new($self->session, mysql => $end, time_zone => $tz)
+ ->set_time_zone("UTC")->toMysql;
+
+ my $where
+ = qq{
+ (
+ Event.startTime IS NULL
+ && Event.endTime IS NULL
+ && Event.startDate >= '$startDate'
+ && Event.startDate < '$endDate'
+ )
+ || (
+ CONCAT(Event.startDate,' ',Event.startTime) >= '$startTz'
+ && CONCAT(Event.startDate,' ',Event.startTime) < '$endTz'
+ )
+ };
+
+ my $orderby
+ = join ',',
+ 'Event.startDate',
+ 'Event.startTime',
+ 'Event.endDate',
+ 'Event.endTime',
+ 'assetData.title',
+ 'assetData.assetId',
+ ;
+
+ my $events
+ = $self->getLineage(["descendants"], {
+ returnObjects => 1,
+ includeOnlyClasses => ['WebGUI::Asset::Event'],
+ joinClass => 'WebGUI::Asset::Event',
+ orderByClause => $orderby,
+ whereClause => $where,
+ });
+
+ #? Perhaps use Stow to cache Events ?#
+
+ return @{$events};
}
@@ -671,15 +677,14 @@ TODO: Format lastUpdated into the user's time zone
=cut
-sub getFeeds
-{
- my $self = shift;
-
- return $self->session->db->buildHashRefOfHashRefs(
- "select * from Calendar_feeds where assetId=?",
- [$self->get("assetId")],
- "feedId"
- );
+sub getFeeds {
+ my $self = shift;
+
+ return $self->session->db->buildHashRefOfHashRefs(
+ "select * from Calendar_feeds where assetId=?",
+ [$self->get("assetId")],
+ "feedId"
+ );
}
@@ -694,22 +699,21 @@ Gets the first event in this calendar. Returns the Event object.
=cut
-sub getFirstEvent
-{
- my $self = shift;
- my $lineage = $self->get("lineage");
-
- my ($assetId) = $self->session->db->quickArray(<get("lineage");
+
+ my ($assetId) = $self->session->db->quickArray(<getEvent($assetId);
+
+ return $self->getEvent($assetId);
}
@@ -724,26 +728,27 @@ Gets the last event in this calendar. Returns the Event object.
=cut
-sub getLastEvent
-{
- my $self = shift;
- my $lineage = $self->get("lineage");
-
- my ($assetId) = $self->session->db->quickArray(<get("lineage");
+
+ my ($assetId) = $self->session->db->quickArray(<getEvent($assetId);
+
+ return $self->getEvent($assetId);
}
+
+
####################################################################
=head2 prepareView ( )
@@ -755,27 +760,25 @@ parameters.
=cut
-sub prepareView
-{
- my $self = shift;
- $self->SUPER::prepareView();
-
- my $view = ucfirst lc $self->session->form->param("type")
- || ucfirst $self->get("defaultView")
- || "Month";
-
- if ($self->session->form->param("print"))
- {
- $view = "Print".$view;
- $self->session->style->makePrintable(1);
- }
-
- #$self->session->errorHandler->warn("Prepare view ".$view." with template ".$self->get("templateId".$view));
-
- my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId".$view));
- $template->prepare;
-
- $self->{_viewTemplate} = $template;
+sub prepareView {
+ my $self = shift;
+ $self->SUPER::prepareView();
+
+ my $view = ucfirst lc $self->session->form->param("type")
+ || ucfirst $self->get("defaultView")
+ || "Month";
+
+ if ($self->session->form->param("print")){
+ $view = "Print".$view;
+ $self->session->style->makePrintable(1);
+ }
+
+ #$self->session->errorHandler->warn("Prepare view ".$view." with template ".$self->get("templateId".$view));
+
+ my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId".$view));
+ $template->prepare;
+
+ $self->{_viewTemplate} = $template;
}
@@ -795,48 +798,50 @@ Adds / removes feeds from the feed trough.
=cut
-sub processPropertiesFromFormPost
-{
- my $self = shift;
- my $session = $self->session;
- my $form = $self->session->form;
- $self->SUPER::processPropertiesFromFormPost;
-
-
- unless ($self->get("groupIdSubscribed"))
- {
- $self->createSubscriptionGroup();
- }
-
-
- ### Get feeds from the form
- # Workaround WebGUI::Session::Form->param bug that returns duplicate
- # names.
- my %feeds;
- $feeds{$_}++
- for map { s/^feeds-//; $_; } grep /^feeds-/,($form->param());
- my @feeds = keys %feeds;
-
- # Delete old feeds that are not in @feeds
- for my $feedId ($session->db->buildArray("select feedId from Calendar_feeds where assetId=?",[$self->get("assetId")]))
- {
- unless (grep /^$feedId$/, @feeds)
- {
- $session->db->write("delete from Calendar_feeds where feedId=? and assetId=?",[$feedId,$self->get("assetId")]);
- }
- }
-
-
- # Create new feeds
- for my $feedId (grep /^new(\d+)/, @feeds)
- {
- $session->db->setRow("Calendar_feeds","feedId",{
- feedId => "new",
- assetId => $self->get("assetId"),
- url => $form->param("feeds-".$feedId),
- feedType => "ical",
- });
- }
+sub processPropertiesFromFormPost {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $self->session->form;
+ $self->SUPER::processPropertiesFromFormPost;
+
+ unless ($self->get("groupIdSubscribed")) {
+ $self->createSubscriptionGroup();
+ }
+
+
+ ### Get feeds from the form
+ # Workaround WebGUI::Session::Form->param bug that returns duplicate
+ # names.
+ my %feeds;
+ $feeds{$_}++
+ for map { s/^feeds-//; $_; } grep /^feeds-/,($form->param());
+ my @feedsFromForm = keys %feeds;
+
+ # Delete old feeds that are not in @feeds
+ my @oldFeeds
+ = $session->db->buildArray(
+ "select feedId from Calendar_feeds where assetId=?",
+ [$self->get("assetId")]
+ );
+
+ for my $feedId (@oldFeeds) {
+ if (!grep /^$feedId$/, @feedsFromForm) {
+ $session->db->write(
+ "delete from Calendar_feeds where feedId=? and assetId=?",
+ [$feedId,$self->get("assetId")]
+ );
+ }
+ }
+
+ # Create new feeds
+ for my $feedId (grep /^new(\d+)/, @feedsFromForm) {
+ $session->db->setRow("Calendar_feeds","feedId",{
+ feedId => "new",
+ assetId => $self->get("assetId"),
+ url => $form->param("feeds-".$feedId),
+ feedType => "ical",
+ });
+ }
}
@@ -848,102 +853,85 @@ sub processPropertiesFromFormPost
Method called by the www_view method.
+Parses user input for sanity.
+
Calls the appropriate viewMonth, viewWeek, or viewDay method to get a template,
-and then adds additional global template variables.
Returns a processed template to be displayed within the page style.
=cut
-sub view
-{
- my $self = shift;
- my $session = $self->session;
- my $form = $session->form;
- my $var;
-
-
- ## INTERRUPT: If user is only a Visitor and we have a cached version
- # and is not expired, use it.
-
- # Get the form parameters
- my $params = {};
- $params->{type} = $form->param("type");
- $params->{start} = $form->param("start");
-
-
- # Set defaults if necessary
- unless ($params->{start})
- {
- if ($self->get("defaultDate") eq "first" && $self->getFirstEvent)
- {
- $params->{start} = $self->getFirstEvent->getDateTimeStart;
- }
- elsif ($self->get("defaultDate") eq "last" && $self->getLastEvent)
- {
- $params->{start} = $self->getLastEvent->getDateTimeStart;
- }
- else
- {
- $params->{start} = WebGUI::DateTime->new($self->session, time)->toUserTimeZone;
- }
- }
- $params->{type} ||= $self->get("defaultView") || "Month";
-
-
-
- # Get the template from the appropriate view* method
- if (lc $params->{type} eq "month")
- {
- $var = $self->viewMonth($params);
- }
- elsif (lc $params->{type} eq "week")
- {
- $var = $self->viewWeek($params);
- }
- elsif (lc $params->{type} eq "day")
- {
- $var = $self->viewDay($params);
- }
- else
- {
- ### ERROR ###
- }
-
-
- ##### Add any global variables
- # Admin
- if ($self->session->var->isAdminOn)
- {
- $var->{'admin'} = 1;
- $var->{'adminControls'} = $self->getToolbar;
- }
-
- # Event editor
- if ($self->canAddEvent)
- {
- $var->{'editor'} = 1;
- $var->{"urlAdd"} = $self->getUrl("func=add;class=WebGUI::Asset::Event");
- }
-
- # URLs
- $var->{"urlDay"} = $self->getUrl("type=day;start=".$params->{start});
- $var->{"urlWeek"} = $self->getUrl("type=week;start=".$params->{start});
- $var->{"urlMonth"} = $self->getUrl("type=month;start=".$params->{start});
- $var->{"urlSearch"} = $self->getUrl("func=search");
- $var->{"urlPrint"} = $self->getUrl("type=".$params->{type}.";start=".$params->{start}.";print=1");
-
- # Parameters
- $var->{"paramStart"} = $params->{start};
- $var->{"paramType"} = $params->{type};
-
-
- $var->{"extrasUrl"} = $self->session->url->extras();
- ##### Process the template
- # If user is only a Visitor and we've gotten this far, update the cache
-
- # Return the processed template to be displayed for the user
- return $self->processTemplate($var, undef, $self->{_viewTemplate});
+sub view {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $session->form;
+ my $var;
+
+
+ ## INTERRUPT: If user is only a Visitor and we have a cached version
+ # and is not expired, use it.
+
+ # Get the form parameters
+ my $params = {};
+ $params->{type} = $form->param("type");
+ $params->{start} = $form->param("start");
+
+ ### TODO: Parse user input for sanity.
+ # {start} must be of the form: YYYY-MM-DD%20HH:MM:SS
+ # {type} must be "month", "week", or "day"
+
+ # Set defaults if necessary
+ if (!$params->{start}) {
+ $params->{start}
+ = $self->get("defaultDate") eq "first" && $self->getFirstEvent
+ ? $self->getFirstEvent->getDateTimeStart
+ : $self->get("defaultDate") eq "last" && $self->getLastEvent
+ ? $self->getLastEvent->getDateTimeStart
+ : WebGUI::DateTime->new($session, time)->toUserTimeZone
+ ;
+ }
+ if (!$params->{type}) {
+ $params->{type} = $self->get("defaultView") || "Month";
+ }
+
+ # Get the template from the appropriate view* method
+ $var = lc $params->{type} eq "month" ? $self->viewMonth($params)
+ : lc $params->{type} eq "week" ? $self->viewWeek($params)
+ : lc $params->{type} eq "day" ? $self->viewDay($params)
+ : return $self->errorHandler->error("Calendar invalid 'type=' url parameter")
+ ;
+
+ ##### Add any global variables
+ # Admin
+ if ($self->session->var->isAdminOn) {
+ $var->{'admin'} = 1;
+ $var->{'adminControls'} = $self->getToolbar;
+ }
+
+ # Event editor
+ if ($self->canAddEvent) {
+ $var->{'editor'} = 1;
+ $var->{"urlAdd"} = $self->getUrl("func=add;class=WebGUI::Asset::Event");
+ }
+
+ # URLs
+ $var->{"urlDay"} = $self->getUrl("type=day;start=".$params->{start});
+ $var->{"urlWeek"} = $self->getUrl("type=week;start=".$params->{start});
+ $var->{"urlMonth"} = $self->getUrl("type=month;start=".$params->{start});
+ $var->{"urlSearch"} = $self->getUrl("func=search");
+ $var->{"urlPrint"} = $self->getUrl("type=".$params->{type}.";start=".$params->{start}.";print=1");
+
+ # Parameters
+ $var->{"paramStart"} = $params->{start};
+ $var->{"paramType"} = $params->{type};
+
+ $var->{"extrasUrl"} = $self->session->url->extras();
+
+ ##### Process the template
+ # TODO: If user is only a Visitor and we've gotten this far, update the cache
+
+ # Return the processed template to be displayed for the user
+ return $self->processTemplate($var, undef, $self->{_viewTemplate});
}
@@ -968,77 +956,72 @@ The day to look at.
=cut
-sub viewDay
-{
- my $self = shift;
- my $session = $self->session;
- my $params = shift;
- my $i18n = WebGUI::International->new($session,"Asset_Calendar");
- my $var = {};
-
- ### Get all the events in this time period
- # Get the range of the epoch of this day
- my $dt = WebGUI::DateTime->new($self->session, $params->{start});
- $dt->set_locale($i18n->get("locale"));
- $dt->truncate( to => "day");
-
- my @events = $self->getEventsIn($dt->toMysql,$dt->clone->add(days => 1)->toMysql);
-
- #### Create the template parameters
- # The events
- my $pos = -1;
- my $last_hour = -1; # Keep track of hours for dividers
- for my $event (@events)
- {
- my $dt = $event->getDateTimeStart;
-
- my $hour = $dt->clone->truncate(to=>"hour")->hour;
-
-
- # Update position if necessary
- # Fill in hour labels
- unless ($hour == $last_hour)
- {
- $pos++;
- $last_hour = $hour;
- $var->{hours}->[$pos] = {
- "hour12" => sprintf("%02d",($hour % 12) || 12),
- "hour24" => sprintf("%02d",$hour),
- "hourM" => ( $hour < 12 ? "am" : "pm"),
- };
- }
-
- my $eventVar = $event->get;
- my %eventDates = $event->getTemplateVars;
- push @{$var->{hours}->[$pos]->{events}}, {
- # Fill in event stuff
- (map { "event".ucfirst($_) => $eventVar->{$_} } keys %$eventVar),
- (map { "event".ucfirst($_) => $eventDates{$_} } keys %eventDates),
- };
- }
-
-
- # Make the navigation bars
- $var->{"pageNextStart"} = $dt->clone->add(days=>1)->toMysql;
- $var->{"pageNextUrl"} = $self->getUrl("type=day;start=".$var->{"pageNextStart"});
- $var->{"pagePrevStart"} = $dt->clone->subtract(days=>1)->toMysql;
- $var->{"pagePrevUrl"} = $self->getUrl("type=day;start=".$var->{"pagePrevStart"});
- # Some friendly dates
- $var->{"dayName"} = $dt->day_name;
- $var->{"dayAbbr"} = $dt->day_abbr;
- $var->{"dayOfMonth"} = $dt->day_of_month;
- $var->{"dayOfWeek"} = $dt->day_of_week;
- $var->{"monthName"} = $dt->month_name;
- $var->{"monthAbbr"} = $dt->month_abbr;
- $var->{"year"} = $dt->year;
- $var->{"ymd"} = $dt->ymd;
- $var->{"mdy"} = $dt->mdy;
- $var->{"dmy"} = $dt->dmy;
- $var->{"epoch"} = $dt->epoch;
-
-
- # Return the template parameters
- return $var;
+sub viewDay {
+ my $self = shift;
+ my $session = $self->session;
+ my $params = shift;
+ my $i18n = WebGUI::International->new($session,"Asset_Calendar");
+ my $var = {};
+
+ ### Get all the events in this time period
+ # Get the range of the epoch of this day
+ my $dt = WebGUI::DateTime->new($session, $params->{start});
+ $dt->set_locale($i18n->get("locale"));
+ $dt->truncate( to => "day");
+
+ my @events = $self->getEventsIn($dt->toMysql,$dt->clone->add(days => 1)->toMysql);
+
+ #### Create the template parameters
+ # The events
+ my $pos = -1;
+ my $last_hour = -1; # Keep track of hours for dividers
+ for my $event (@events) {
+ my $dt = $event->getDateTimeStart;
+ my $hour = $dt->clone->truncate(to=>"hour")->hour;
+
+ # Update position if necessary
+ unless ($hour == $last_hour) {
+ $pos++;
+ $last_hour = $hour;
+ # Fill in hour labels
+ $var->{hours}->[$pos] = {
+ "hour12" => sprintf("%02d",($hour % 12) || 12),
+ "hour24" => sprintf("%02d",$hour),
+ "hourM" => ( $hour < 12 ? "am" : "pm"),
+ };
+ }
+
+ my $eventVar = $event->get;
+ my %eventDates = $event->getTemplateVars;
+ push @{$var->{hours}->[$pos]->{events}}, {
+ # Fill in event stuff, prepend with 'event' to not clobber global vars
+ (map { "event".ucfirst($_) => $eventVar->{$_} } keys %$eventVar),
+ (map { "event".ucfirst($_) => $eventDates{$_} } keys %eventDates),
+ };
+ }
+
+
+ # Make the navigation bars
+ $var->{"pageNextStart"} = $dt->clone->add(days=>1)->toMysql;
+ $var->{"pageNextUrl"} = $self->getUrl("type=day;start=".$var->{"pageNextStart"});
+ $var->{"pagePrevStart"} = $dt->clone->subtract(days=>1)->toMysql;
+ $var->{"pagePrevUrl"} = $self->getUrl("type=day;start=".$var->{"pagePrevStart"});
+ # Some friendly dates
+ $var->{"dayName"} = $dt->day_name;
+ $var->{"dayAbbr"} = $dt->day_abbr;
+ $var->{"dayOfMonth"} = $dt->day_of_month;
+ $var->{"dayOfWeek"} = $dt->day_of_week;
+ $var->{"monthName"} = $dt->month_name;
+ $var->{"monthAbbr"} = $dt->month_abbr;
+ $var->{"year"} = $dt->year;
+ $var->{"ymd"} = $dt->ymd;
+ $var->{"mdy"} = $dt->mdy;
+ $var->{"dmy"} = $dt->dmy;
+ $var->{"epoch"} = $dt->epoch;
+
+
+ # Return the template parameters
+ return $var;
}
@@ -1064,128 +1047,121 @@ A day inside the month to look at. Required.
=cut
-sub viewMonth
-{
- my $self = shift;
- my $session = $self->session;
- my $params = shift;
- my $i18n = WebGUI::International->new($session,"Asset_Calendar");
- my $var = {};
- my $tz = $session->user->profileField("timeZone");
- my $today = WebGUI::DateTime->new($self->session, time)->set_time_zone($tz)
- ->toMysqlDate;
-
- #### Get all the events in this time period
- # Get the range of the epoch of this month
- my $dt = WebGUI::DateTime->new($self->session, $params->{start});
- $dt->set_locale($i18n->get("locale"));
- $dt->truncate( to => "month");
-
- my @events = $self->getEventsIn($dt->toMysql,$dt->clone->add(months => 1)->toMysql);
-
-
- #### Create the template parameters
- # The grid
- my $first_dow = $session->user->profileField("firstDayOfWeek") || 0;
- # 0 - sunday
- # 1 - mon
- # 2 - tue
- # etc...
- my $days_in_month = $dt->clone->add(months=>1)->subtract(seconds=>1)->day_of_month;
- # Adjustment for first day of week
- my $adjust = ( $dt->day_of_week_0 - $first_dow + 1) % 7;
-
- # First create the days that are in this month
- for my $day (0..$days_in_month-1)
- {
- my $dt_day = $dt->clone->add(days=>$day);
-
- # Calculate what position this day should be in
- my $week = int(($adjust + $dt_day->day_of_month_0) / 7);
- my $position = ($adjust + $dt_day->day_of_month_0) % 7;
-
- # Add the day in the appropriate position
- $var->{weeks}->[$week]->{days}->[$position] = {
- "dayMonth" => $dt_day->day_of_month,
- "dayUrl" => $self->getUrl("type=day;start=".$dt_day->toMysql),
- "dayCurrent" => ($today eq $dt_day->toMysqlDate ? 1 : 0 ),
- };
- }
-
- # Add any remaning trailing empty spaces
- push @{$var->{weeks}->[-1]->{days}},undef
- until @{$var->{weeks}->[-1]->{days}} >= 7;
-
- # The events
- for my $event (@events)
- {
- # Get the WebGUI::DateTime objects
- my $dt_event_start = $event->getDateTimeStart;
- my $dt_event_end = $event->getDateTimeEnd;
-
- # Prepare the template variables
- my %eventVar = %{$event->get};
- %eventVar = (map { "event".ucfirst($_) => $eventVar{$_} } keys %eventVar);
- my %eventDates = $event->getTemplateVars;
- %eventDates = (map { "event".ucfirst($_) => $eventDates{$_} } keys %eventDates);
-
- # Make the event show on each day it spans
- for my $mday ($dt_event_start->day_of_month_0..$dt_event_end->day_of_month_0)
- {
- my $week = int(($adjust + $mday) / 7);
- my $position = ($adjust + $mday) % 7;
-
- my $eventRef = {
- ## Event data
- (%eventVar),
- (%eventDates)
- };
- push @{$var->{weeks}->[$week]->{days}->[$position]->{events}}, $eventRef;
- }
- }
-
- # Make the navigation bars
- my $dt_year = $dt->clone->truncate(to => "year");
- for my $m (0..11)
- {
- my $dt_month = $dt_year->clone->add(months=>$m);
-
- push @{$var->{months}}, {
- "monthName" => $dt_month->month_name,
- "monthAbbr" => $dt_month->month_abbr,
- "monthEpoch" => $dt_month->epoch,
- "monthUrl" => $self->getUrl("type=month;start=".$dt_month->toMysql),
- "monthCurrent" => ($dt_month->month eq $dt->month ? 1 : 0),
-
- };
- }
-
- # Day names
- my @dayNames = @{$dt->locale->day_names}[6,0..5]; # Put sunday first
- my @dayAbbrs = @{$dt->locale->day_abbreviations}[6,0..5];
- # Take from FirstDOW to the end and put it on the beginning
- unshift @dayNames,splice(@dayNames,$first_dow);
- unshift @dayAbbrs,splice(@dayAbbrs,$first_dow);
- push @{$var->{dayNames}},
- {
- "dayName" => $dayNames[$_],
- "dayAbbr" => $dayAbbrs[$_],
- }
- for (0..$#dayNames);
-
-
- $var->{"pageNextYear"} = $dt->year + 1;
- $var->{"pageNextUrl"} = $self->getUrl("type=month;start="
- . $dt->clone->add(years=>1)->toMysql);
- $var->{"pagePrevYear"} = $dt->year - 1;
- $var->{"pagePrevUrl"} = $self->getUrl("type=month;start="
- . $dt->clone->subtract(years=>1)->toMysql);
- $var->{"monthName"} = $dt->month_name;
- $var->{"monthAbbr"} = $dt->month_abbr;
- $var->{"year"} = $dt->year;
-
- # Return the template
- return $var;
+sub viewMonth {
+ my $self = shift;
+ my $session = $self->session;
+ my $params = shift;
+ my $i18n = WebGUI::International->new($session,"Asset_Calendar");
+ my $var = {};
+ my $tz = $session->user->profileField("timeZone");
+ my $today = WebGUI::DateTime->new($self->session, time)
+ ->set_time_zone($tz)->toMysqlDate;
+
+ #### Get all the events in this time period
+ # Get the range of the epoch of this month
+ my $dt = WebGUI::DateTime->new($self->session, $params->{start});
+ $dt->set_locale($i18n->get("locale"));
+ $dt->truncate( to => "month");
+
+ my @events
+ = $self->getEventsIn($dt->toMysql,$dt->clone->add(months => 1)->toMysql);
+
+
+ #### Create the template parameters
+ ## The grid
+ my $first_dow = $session->user->profileField("firstDayOfWeek") || 0;
+ # 0 - sunday
+ # 1 - mon
+ # 2 - tue
+ # etc...
+ my $days_in_month = $dt->clone->add(months=>1)->subtract(seconds=>1)->day_of_month;
+ # Adjustment for first day of week
+ my $adjust = ( $dt->day_of_week_0 - $first_dow + 1) % 7;
+
+ # First create the days that are in this month
+ for my $day (0..$days_in_month-1) {
+ my $dt_day = $dt->clone->add(days=>$day);
+
+ # Calculate what position this day should be in
+ my $week = int(($adjust + $dt_day->day_of_month_0) / 7);
+ my $position = ($adjust + $dt_day->day_of_month_0) % 7;
+
+ # Add the day in the appropriate position
+ $var->{weeks}->[$week]->{days}->[$position] = {
+ "dayMonth" => $dt_day->day_of_month,
+ "dayUrl" => $self->getUrl("type=day;start=".$dt_day->toMysql),
+ "dayCurrent" => ($today eq $dt_day->toMysqlDate ? 1 : 0 ),
+ };
+ }
+
+ # Add any remaning trailing empty spaces
+ push @{$var->{weeks}->[-1]->{days}},undef
+ until @{$var->{weeks}->[-1]->{days}} >= 7;
+
+ ## The events
+ for my $event (@events) {
+ # Get the WebGUI::DateTime objects
+ my $dt_event_start = $event->getDateTimeStart;
+ my $dt_event_end = $event->getDateTimeEnd;
+
+ # Prepare the template variables
+ my %eventVar = %{$event->get};
+ %eventVar = (map { "event".ucfirst($_) => delete $eventVar{$_} } keys %eventVar);
+ my %eventDates = $event->getTemplateVars;
+ %eventDates = (map { "event".ucfirst($_) => delete $eventDates{$_} } keys %eventDates);
+
+ # Make the event show on each day it spans
+ for my $mday ($dt_event_start->day_of_month_0..$dt_event_end->day_of_month_0) {
+ my $week = int(($adjust + $mday) / 7);
+ my $position = ($adjust + $mday) % 7;
+
+ my $eventRef = {
+ ## Event data
+ (%eventVar),
+ (%eventDates)
+ };
+ push @{$var->{weeks}->[$week]->{days}->[$position]->{events}}, $eventRef;
+ }
+ }
+
+ # Make the navigation bars
+ my $dt_year = $dt->clone->truncate(to => "year");
+ for my $m (0..11) {
+ my $dt_month = $dt_year->clone->add(months=>$m);
+
+ push @{$var->{months}}, {
+ "monthName" => $dt_month->month_name,
+ "monthAbbr" => $dt_month->month_abbr,
+ "monthEpoch" => $dt_month->epoch,
+ "monthUrl" => $self->getUrl("type=month;start=".$dt_month->toMysql),
+ "monthCurrent" => ($dt_month->month eq $dt->month ? 1 : 0),
+ };
+ }
+
+ # Day names
+ my @dayNames = @{$dt->locale->day_names}[6,0..5]; # Put sunday first
+ my @dayAbbrs = @{$dt->locale->day_abbreviations}[6,0..5];
+ # Take from FirstDOW to the end and put it on the beginning
+ unshift @dayNames,splice(@dayNames,$first_dow);
+ unshift @dayAbbrs,splice(@dayAbbrs,$first_dow);
+
+ for my $day (0..$#dayNames) {
+ push @{$var->{dayNames}}, {
+ "dayName" => $dayNames[$_],
+ "dayAbbr" => $dayAbbrs[$_],
+ };
+ }
+
+ $var->{"pageNextYear" } = $dt->year + 1;
+ $var->{"pageNextUrl" } = $self->getUrl("type=month;start=" . $dt->clone->add(years=>1)->toMysql);
+ $var->{"pagePrevYear" } = $dt->year - 1;
+ $var->{"pagePrevUrl" } = $self->getUrl("type=month;start=" . $dt->clone->subtract(years=>1)->toMysql);
+ $var->{"monthName" } = $dt->month_name;
+ $var->{"monthAbbr" } = $dt->month_abbr;
+ $var->{"year" } = $dt->year;
+
+ # Return the template
+ return $var;
}
@@ -1211,108 +1187,104 @@ The day to start this week.
=cut
-sub viewWeek
-{
- my $self = shift;
- my $session = $self->session;
- my $params = shift;
- my $i18n = WebGUI::International->new($session,"Asset_Calendar");
- my $var = {};
- my $tz = $session->user->profileField("timeZone");
- my $today = WebGUI::DateTime->new($self->session, time)->set_time_zone($tz)
- ->toMysqlDate;
-
-
- #### Get all the events in this time period
- # Get the range of the epoch of this week
- my $dt = WebGUI::DateTime->new($self->session, $params->{start});
- $dt->truncate( to => "day");
-
- # Apply First Day of Week settings
- # subtract because we want to include the day that was passed
- my $first_dow = $session->user->profileField("firstDayOfWeek") || 0;
- # 0 - sunday
- # 1 - monday
- # 2 - tuesday, etc...
- $dt->subtract(days => $dt->day_of_week % 7 - $first_dow);
-
- my $start = $dt->toMysql;
- my $dtEnd = $dt->clone->add(days => 7);
- my $end = $dtEnd->toMysql; # Clone to prevent saving change
-
- my @events = $self->getEventsIn($start,$end);
-
-
- #### Create the template parameters
- # Some friendly dates
- for my $i (0..6)
- {
- my $day = {};
- my $dt_day = $dt->clone->add(days=>$i);
-
- $day->{"dayName"} = $dt_day->day_name;
- $day->{"dayAbbr"} = $dt_day->day_abbr;
- $day->{"dayOfMonth"} = $dt_day->day_of_month;
- $day->{"dayOfWeek"} = $dt_day->day_of_week;
- $day->{"monthName"} = $dt_day->month_name;
- $day->{"monthAbbr"} = $dt_day->month_abbr;
- $day->{"year"} = $dt_day->year;
- $day->{"ymd"} = $dt_day->ymd;
- $day->{"mdy"} = $dt_day->mdy;
- $day->{"dmy"} = $dt_day->dmy;
- $day->{"epoch"} = $dt_day->epoch;
-
- if ($dt_day->toMysqlDate eq $today)
- {
- $day->{"dayCurrent"} = 1;
- }
-
- push @{$var->{days}}, $day;
- }
-
- # The events
- for my $event (@events)
- {
- # ??? TODO ??? Show event in each day it spans a la month view?
- # Get the week this event is in, and add it to that week in
- # the template variables
- my $dt_event = $event->getDateTimeStart;
- $dt_event->set_locale($i18n->get("locale"));
-
- my $day = $dt_event->day_of_week - $dt->day_of_week;
-
- my $eventVar = $event->get;
- my %eventDates = $event->getTemplateVars;
- push @{$var->{days}->[$day]->{events}}, {
- ## Event information
- (map { "event".ucfirst($_) => $eventVar->{$_} } keys %$eventVar),
- (map { "event".ucfirst($_) => $eventDates{$_} } keys %eventDates),
- };
- }
-
- # Make the navigation bars
- $var->{"pageNextUrl"} = $self->getUrl("type=week;start="
- . $dt->clone->add(weeks=>1)->toMysql);
- $var->{"pagePrevUrl"} = $self->getUrl("type=week;start="
- . $dt->clone->subtract(weeks=>1)->toMysql);
-
- $var->{"startMonthName"} = $dt->month_name;
- $var->{"startMonthAbbr"} = $dt->month_abbr;
- $var->{"startDayOfMonth"} = $dt->day_of_month;
- $var->{"startDayName"} = $dt->day_name;
- $var->{"startDayAbbr"} = $dt->day_abbr;
- $var->{"startYear"} = $dt->year;
-
- $var->{"endMonthName"} = $dtEnd->month_name;
- $var->{"endMonthAbbr"} = $dtEnd->month_abbr;
- $var->{"endDayOfMonth"} = $dtEnd->day_of_month;
- $var->{"endDayName"} = $dtEnd->day_name;
- $var->{"endDayAbbr"} = $dtEnd->day_abbr;
- $var->{"endYear"} = $dtEnd->year;
-
-
- # Return the template
- return $var;
+sub viewWeek {
+ my $self = shift;
+ my $session = $self->session;
+ my $params = shift;
+ my $i18n = WebGUI::International->new($session,"Asset_Calendar");
+ my $var = {};
+ my $tz = $session->user->profileField("timeZone");
+ my $today = WebGUI::DateTime->new($self->session, time)->set_time_zone($tz)
+ ->toMysqlDate;
+
+
+ #### Get all the events in this time period
+ # Get the range of the epoch of this week
+ my $dt = WebGUI::DateTime->new($self->session, $params->{start});
+ $dt->truncate( to => "day");
+
+ # Apply First Day of Week settings
+ my $first_dow = $session->user->profileField("firstDayOfWeek") || 0;
+ # 0 - sunday
+ # 1 - monday
+ # 2 - tuesday, etc...
+ # subtract because we want to include the day that was passed
+ $dt->subtract(days => $dt->day_of_week % 7 - $first_dow);
+
+ my $start = $dt->toMysql;
+ my $dtEnd = $dt->clone->add(days => 7);
+ my $end = $dtEnd->toMysql; # Clone to prevent saving change
+
+ my @events = $self->getEventsIn($start,$end);
+
+
+ #### Create the template parameters
+ # Some friendly dates
+ for my $i (0..6) {
+ my $day = {};
+ my $dt_day = $dt->clone->add(days=>$i);
+
+ $day->{"dayName" } = $dt_day->day_name;
+ $day->{"dayAbbr" } = $dt_day->day_abbr;
+ $day->{"dayOfMonth" } = $dt_day->day_of_month;
+ $day->{"dayOfWeek" } = $dt_day->day_of_week;
+ $day->{"monthName" } = $dt_day->month_name;
+ $day->{"monthAbbr" } = $dt_day->month_abbr;
+ $day->{"year" } = $dt_day->year;
+ $day->{"ymd" } = $dt_day->ymd;
+ $day->{"mdy" } = $dt_day->mdy;
+ $day->{"dmy" } = $dt_day->dmy;
+ $day->{"epoch" } = $dt_day->epoch;
+
+ if ($dt_day->toMysqlDate eq $today) {
+ $day->{"dayCurrent"} = 1;
+ }
+
+ push @{$var->{days}}, $day;
+ }
+
+ # The events
+ for my $event (@events) {
+ # ??? TODO ??? Show event in each day it spans a la month view?
+ # Get the week this event is in, and add it to that week in
+ # the template variables
+ my $dt_event = $event->getDateTimeStart;
+ $dt_event->set_locale($i18n->get("locale"));
+
+ my $day = $dt_event->day_of_week - $dt->day_of_week;
+
+ my $eventVar = $event->get;
+ my %eventDates = $event->getTemplateVars;
+ push @{$var->{days}->[$day]->{events}}, {
+ ## Event information
+ (map { "event".ucfirst($_) => $eventVar->{$_} } keys %$eventVar),
+ (map { "event".ucfirst($_) => $eventDates{$_} } keys %eventDates),
+ };
+ }
+
+ # Make the navigation bars
+ $var->{"pageNextUrl"}
+ = $self->getUrl("type=week;start=" . $dt->clone->add(weeks=>1)->toMysql);
+ $var->{"pagePrevUrl"}
+ = $self->getUrl("type=week;start=" . $dt->clone->subtract(weeks=>1)->toMysql);
+
+ $var->{"startMonthName" } = $dt->month_name;
+ $var->{"startMonthAbbr" } = $dt->month_abbr;
+ $var->{"startDayOfMonth" } = $dt->day_of_month;
+ $var->{"startDayName" } = $dt->day_name;
+ $var->{"startDayAbbr" } = $dt->day_abbr;
+ $var->{"startYear" } = $dt->year;
+
+ $var->{"endMonthName" } = $dtEnd->month_name;
+ $var->{"endMonthAbbr" } = $dtEnd->month_abbr;
+ $var->{"endDayOfMonth" } = $dtEnd->day_of_month;
+ $var->{"endDayName" } = $dtEnd->day_name;
+ $var->{"endDayAbbr" } = $dtEnd->day_abbr;
+ $var->{"endYear" } = $dtEnd->year;
+
+
+ # Return the template
+ return $var;
}
@@ -1331,11 +1303,11 @@ that ; , \ and newlines should be escaped by prepending them with a \.
sub unwrapIcal
{
- my $self = shift;
- my $text = shift;
-
-
-
+ my $self = shift;
+ my $text = shift;
+
+
+
}
@@ -1352,18 +1324,17 @@ that ; , \ and newlines should be escaped by prepending them with a \.
=cut
-sub wrapIcal
-{
- my $self = shift;
- my $text = shift;
-
- return $text unless length $text >= 75;
-
- $text =~ s/([,;\\])/\\$1/g;
- $text =~ s/\n/\\n/g;
-
- my @text = ($text =~ m/.{0,75}/g);
- return join "\r\n ",@text;
+sub wrapIcal {
+ my $self = shift;
+ my $text = shift;
+
+ return $text unless length $text >= 75;
+
+ $text =~ s/([,;\\])/\\$1/g;
+ $text =~ s/\n/\\n/g;
+
+ my @text = ($text =~ m/.{0,75}/g);
+ return join "\r\n ",@text;
}
@@ -1378,20 +1349,19 @@ Adds a submenu to the default edit page that includes links to Add an Event.
=cut
-sub www_edit
-{
- my $self = shift;
- my $session = $self->session;
- my $i18n = WebGUI::International->new($session, 'Asset_Calendar');
-
- return $session->privilege->insufficient() unless $self->canEdit;
-
- $self->getAdminConsole->setHelp("Calendar add/edit", "Calendar");
-
- return $self->getAdminConsole->render(
- $self->getEditForm->print,
- $i18n->get("assetName")
- );
+sub www_edit {
+ my $self = shift;
+ my $session = $self->session;
+ my $i18n = WebGUI::International->new($session, 'Asset_Calendar');
+
+ return $session->privilege->insufficient() unless $self->canEdit;
+
+ $self->getAdminConsole->setHelp("Calendar add/edit", "Calendar");
+
+ return $self->getAdminConsole->render(
+ $self->getEditForm->print,
+ $i18n->get("assetName")
+ );
}
@@ -1407,158 +1377,163 @@ Export an iCalendar feed of this Events Calendar's events.
=cut
-sub www_ical
-{
- my $self = shift;
- my $session = $self->session;
- my $form = $self->session->form;
-
- #!!! Events from what time period should we show? Default perpage?
- # By default show the events for a month
- my $type = $form->param("type") || lc($self->get("defaultView")) || "month";
- my $start = $form->param("start");
- my $end = $form->param("end");
-
-
-
-
- #!!! KLUDGE:
- # An "adminId" may be passed as a parameter in order to facilitate
- # calls between calendars on the same server getting administrator
- # privileges
- # I do not know how dangerous this could possibly be, so THIS MUST
- # CHANGE
- my $adminId = $form->param("adminId");
- if ($adminId
- && ($self->session->db->quickArray("SELECT value FROM userSessionScratch WHERE sessionId=? and name=?",[$adminId,$self->get("assetId")]))[0] eq "SPECTRE")
- {
- $self->session->user({userId => 3});
- }
- #/KLUDGE
-
-
- my $dt_start;
- unless ($start)
- {
- #if ($self->get("defaultDate") eq "first")
- #{
- #!! TODO: Get the first event's date
- # select startDate from Events
- # join assetLineage
- # order by startDate ASC, revisionDate DESC
- # limit 1
- #}
- #elsif ($self->get("defaultDate") eq "last")
- #{
- #!! TODO: Get the last event's date
- # select startDate from Events
- # join assetLineage
- # order by startDate DESC, revisionDate DESC
- # limit 1
- #}
- #else
- #{
- $dt_start = WebGUI::DateTime->new($self->session, time)->toUserTimeZone;
- #}
- }
- else
- {
- $dt_start = WebGUI::DateTime->new($self->session, $start)->set_time_zone($session->user->profileField("timeZone"));
- }
-
-
-
- my $dt_end;
- unless ($end)
- {
- #if ($type eq "month")
- #{
- $dt_end = $dt_start->clone->add(months => 1);
- #}
- #elsif ($type eq "week")
- #{
- # $dt_end = $dt_start->clone->add(weeks => 1);
- #}
- #elsif ($type eq "day")
- #{
- # $dt_end = $dt_start->clone->add(days => 1);
- #}
- }
- else
- {
- $dt_end = WebGUI::DateTime->new($self->session, $end)->set_time_zone($session->user->profileField("timeZone"));
- }
-
-
-
- # Get all the events we're going to display
- my @events = $self->getEventsIn($dt_start->toMysql,$dt_end->toMysql);
-
-
- my $ical = qq{BEGIN:VCALENDAR\r\n}
- . qq{PRODID:WebGUI }.$WebGUI::VERSION."-".$WebGUI::STATUS.qq{\r\n}
- . qq{VERSION:2.0\r\n};
-
- # VEVENT:
- for my $event (@events)
- {
- $ical .= qq{BEGIN:VEVENT\r\n};
-
- # Currently we only need
- # UID
- if ($event->get("feedUid")) # Use feed's UID to prevent over-propagation
- {
- $ical .= qq{UID:}.$event->get("feedUid")."\r\n";
- }
- else # Create a UID for feeds native to this calendar
- {
- my $domain = $session->config->get("sitename")->[0];
- $ical .= qq{UID:}.$event->get("assetId").'@'.$domain."\r\n";
- }
-
- # LAST-MODIFIED (revisionDate)
- $ical .= qq{LAST-MODIFIED:}
- . WebGUI::DateTime->new($self->session, $event->get("revisionDate"))->toIcal
- . "\r\n";
-
- # CREATED (creationDate)
- $ical .= qq{CREATED:}
- . WebGUI::DateTime->new($self->session, $event->get("creationDate"))->toIcal
- . "\r\n";
-
- # DTSTART
- $ical .= qq{DTSTART:}.$event->getIcalStart."\r\n";
-
- # DTEND
- $ical .= qq{DTEND:}.$event->getIcalEnd."\r\n";
-
- # Summary (the title)
- # Wrapped at 75 columns
- $ical .= $self->wrapIcal("SUMMARY:".$event->get("title"))."\r\n";
-
- # Description (the text)
- # Wrapped at 75 columns
- $ical .= $self->wrapIcal("DESCRIPTION:".$event->get("description"))."\r\n";
-
-
-
- # X-WEBGUI lines
- $ical .= "X-WEBGUI-GROUPIDVIEW:".$event->get("groupIdView")."\r\n";
- $ical .= "X-WEBGUI-GROUPIDEDIT:".$event->get("groupIdEdit")."\r\n";
- $ical .= "X-WEBGUI-URL:".$event->get("url")."\r\n";
-
-
- $ical .= qq{END:VEVENT\r\n};
- }
- # ENDVEVENT
-
- $ical .= qq{END:VCALENDAR\r\n};
-
-
- # Set mime of text/icalendar
- #$self->session->http->setMimeType("text/plain");
- $self->session->http->setFilename("feed.ics","text/calendar");
- return $ical;
+sub www_ical {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $self->session->form;
+
+ #!!! Events from what time period should we show? Default perpage?
+ # By default show the events for a month
+ my $type = $form->param("type") || lc($self->get("defaultView")) || "month";
+ my $start = $form->param("start");
+ my $end = $form->param("end");
+
+
+
+
+ #!!! KLUDGE:
+ # An "adminId" may be passed as a parameter in order to facilitate
+ # calls between calendars on the same server getting administrator
+ # privileges
+ # I do not know how dangerous this could possibly be, so THIS MUST
+ # CHANGE
+ # Preferably: Spectre should add the appropriate cookie so that WebGUI
+ # handles this automagically.
+ my $adminId = $form->param("adminId");
+ if ($adminId) {
+ my ($spectreTest)
+ = $self->session->db->quickArray(
+ "SELECT value FROM userSessionScratch WHERE sessionId=? and name=?",
+ [$adminId,$self->get("assetId")]
+ );
+
+ if ($spectreTest eq "SPECTRE") {
+ $self->session->user({userId => 3});
+ }
+ }
+ #/KLUDGE
+
+
+ my $dt_start;
+ unless ($start) {
+ #if ($self->get("defaultDate") eq "first")
+ #{
+ #!! TODO: Get the first event's date
+ # select startDate from Events
+ # join assetLineage
+ # order by startDate ASC, revisionDate DESC
+ # limit 1
+ #}
+ #elsif ($self->get("defaultDate") eq "last")
+ #{
+ #!! TODO: Get the last event's date
+ # select startDate from Events
+ # join assetLineage
+ # order by startDate DESC, revisionDate DESC
+ # limit 1
+ #}
+ #else
+ #{
+ $dt_start = WebGUI::DateTime->new($self->session, time-60*60*24*30)->set_time_zone($session->user->profileField("timeZone"));
+ #}
+ }
+ else {
+ $dt_start = WebGUI::DateTime->new($self->session, mysql => $start, time_zone => $session->user->profileField("timeZone"));
+ }
+
+
+
+ my $dt_end;
+ unless ($end) {
+ #if ($type eq "month")
+ #{
+ $dt_end = $dt_start->clone->add(months => 1);
+ #}
+ #elsif ($type eq "week")
+ #{
+ # $dt_end = $dt_start->clone->add(weeks => 1);
+ #}
+ #elsif ($type eq "day")
+ #{
+ # $dt_end = $dt_start->clone->add(days => 1);
+ #}
+ }
+ else {
+ $dt_end = WebGUI::DateTime->new($self->session, mysql => $end, time_zone => $session->user->profileField("timeZone"));
+ }
+
+
+
+ # Get all the events we're going to display
+ my @events = $self->getEventsIn($dt_start->toMysql,$dt_end->toMysql);
+
+
+ my $ical = qq{BEGIN:VCALENDAR\r\n}
+ . qq{PRODID:WebGUI }.$WebGUI::VERSION."-".$WebGUI::STATUS.qq{\r\n}
+ . qq{VERSION:2.0\r\n};
+
+ # VEVENT:
+ for my $event (@events) {
+ $ical .= qq{BEGIN:VEVENT\r\n};
+
+ ### UID
+ # Use feed's UID to prevent over-propagation
+ if ($event->get("feedUid")) {
+ $ical .= qq{UID:}.$event->get("feedUid")."\r\n";
+ }
+ # Create a UID for feeds native to this calendar
+ else {
+ my $domain = $session->config->get("sitename")->[0];
+ $ical .= qq{UID:}.$event->get("assetId").'@'.$domain."\r\n";
+ }
+
+ # LAST-MODIFIED (revisionDate)
+ $ical .= qq{LAST-MODIFIED:}
+ . WebGUI::DateTime->new($self->session, $event->get("revisionDate"))->toIcal
+ . "\r\n";
+
+ # CREATED (creationDate)
+ $ical .= qq{CREATED:}
+ . WebGUI::DateTime->new($self->session, $event->get("creationDate"))->toIcal
+ . "\r\n";
+
+ # DTSTART
+ $ical .= qq{DTSTART:}.$event->getIcalStart."\r\n";
+
+ # DTEND
+ $ical .= qq{DTEND:}.$event->getIcalEnd."\r\n";
+
+ # Summary (the title)
+ # Wrapped at 75 columns
+ $ical .= $self->wrapIcal("SUMMARY:".$event->get("title"))."\r\n";
+
+ # Description (the text)
+ # Wrapped at 75 columns
+ $ical .= $self->wrapIcal("DESCRIPTION:".$event->get("description"))."\r\n";
+
+
+
+ # X-WEBGUI lines
+ if ($event->get("groupIdView")) {
+ $ical .= "X-WEBGUI-GROUPIDVIEW:".$event->get("groupIdView")."\r\n";
+ }
+ if ($event->get("groupIdEdit")) {
+ $ical .= "X-WEBGUI-GROUPIDEDIT:".$event->get("groupIdEdit")."\r\n";
+ }
+ $ical .= "X-WEBGUI-URL:".$event->get("url")."\r\n";
+ $ical .= "X-WEBGUI-MENUTITLE:".$event->get("menuTitle")."\r\n";
+
+ $ical .= qq{END:VEVENT\r\n};
+ }
+ # ENDVEVENT
+
+ $ical .= qq{END:VCALENDAR\r\n};
+
+
+ # Set mime of text/icalendar
+ #$self->session->http->setMimeType("text/plain");
+ $self->session->http->setFilename("feed.ics","text/calendar");
+ return $ical;
}
@@ -1575,11 +1550,10 @@ Import an iCalendar file into the Events Calendar.
=cut
-sub www_importIcal
-{
- ### TODO: Everything
-
- return $_[0]->session->privilege->noAccess;
+sub www_importIcal {
+ ### TODO: Everything
+
+ return $_[0]->session->privilege->noAccess;
}
@@ -1594,124 +1568,138 @@ Shows the search view
=cut
-sub www_search
-{
- my $self = shift;
- my $session = $self->session;
- my $form = $session->form;
-
- # Get the search parameters from the form
- my $keywords = $form->param("keywords");
- my $startDate = $form->process("startdate");
- my $endDate = $form->process("enddate");
- my $perpage = $form->param("perpage");
-
- my $var = $self->get;
- $var->{url} = $self->getUrl;
-
- # If there is a search to perform
- if ($keywords || $startDate || $endDate)
- {
- my $search = new WebGUI::Search($session);
- my %rules = (
- keywords => $keywords,
- classes => ['WebGUI::Asset::Event'],
- lineage => [$self->get("lineage")],
- join => "join Event on assetIndex.assetId=Event.assetId",
- columns => ['Event.startDate','Event.startTime'],
- );
-
- # If the start and/or end dates are not filled in, do not limit
- # to a certain time period
- $rules{where} .= "Event.startDate >= '$startDate'"
- if ($startDate);
- $rules{where} .= " && " if ($startDate && $endDate);
- $rules{where} .= "Event.endDate <= '$endDate'"
- if ($endDate);
-
-
- # Prepare the paginator
- my @results = ();
- $search->search(\%rules);
- my $rs = $search->getResultSet;
- while (my $data = $rs->hashRef)
- {
- if ($self->session->user->userId eq $data->{ownerUserId} || $self->session->user->isInGroup($data->{groupIdView}) || $self->session->user->isInGroup($data->{groupIdEdit}))
- {
- # Format the date
- my $dt = WebGUI::DateTime->new($self->session, $data->{startDate}." ".($data->{startTime}?$data->{startTime}:"00:00:00"));
- $dt->set_time_zone($self->session->user->profileField("timeZone"))
- if ($data->{startTime});
-
- push(@results,
- {
- url => $data->{url},
- title => $data->{title},
- synopsis => $data->{synopsis},
- startDate => $dt->strftime('%B %e, %Y'),
- });
- }
- }
- my $p = WebGUI::Paginator->new($self->session,$self->getUrl('func=search;keywords='.$self->session->url->escape($keywords).';startdate='.$startDate.';enddate='.$endDate),$perpage);
- $p->setDataByArrayRef(\@results);
- $p->appendTemplateVars($var);
- $var->{results} = $p->getPageData;
- }
-
- # Prepare the form
- my $default_dt = WebGUI::DateTime->new($self->session, time);
- my $default_start = $default_dt->toMysqlDate;
- my $default_end = $default_dt->add(years => 1)->toMysqlDate;
-
- $var->{"form.header"} = WebGUI::Form::formHeader($session,
- {
- action => $self->getUrl,
- })
- . WebGUI::Form::hidden($self->session,
- {
- name => "func",
- value => "search",
- });
-
- $var->{"form.footer"} = WebGUI::Form::formFooter($session);
-
- $var->{"form.keywords"} = WebGUI::Form::text($session,
- {
- name => "keywords",
- value => $keywords,
- });
- $var->{"form.perpage"} = WebGUI::Form::text($session,
- {
- name => "perpage",
- value => $perpage,
- });
- $var->{"form.startDate"} = WebGUI::Form::date($session,
- {
- name => "startDate",
- value => $startDate,
- defaultValue => $default_start,
- });
- $var->{"form.endDate"} = WebGUI::Form::date($session,
- {
- name => "endDate",
- value => $endDate,
- defaultValue => $default_end,
- });
-
- $var->{"form.submit"} = WebGUI::Form::submit($session,
- {
- name => "submit",
- value => "Search",
- });
-
- $self->session->http->sendHeader;
- my $template = WebGUI::Asset::Template->new($self->session,$self->get("templateIdSearch"));
- my $style = $self->session->style->process("~~~",$self->get("styleTemplateId"));
- my ($head, $foot) = split("~~~",$style);
- $self->session->output->print($head, 1);
- $self->session->output->print($self->processTemplate($var, undef, $template));
- $self->session->output->print($foot, 1);
- return "chunked";
+sub www_search {
+ my $self = shift;
+ my $session = $self->session;
+ my $form = $session->form;
+ my $user = $session->user;
+
+ # Get the search parameters from the form
+ my $keywords = $form->param("keywords");
+ my $startDate = $form->process("startdate");
+ my $endDate = $form->process("enddate");
+ my $perpage = $form->param("perpage");
+
+ my $var = $self->get;
+ $var->{url} = $self->getUrl;
+
+ # If there is a search to perform
+ if ($keywords || $startDate || $endDate) {
+ my $search = new WebGUI::Search($session);
+ my %rules = (
+ keywords => $keywords,
+ classes => ['WebGUI::Asset::Event'],
+ lineage => [$self->get("lineage")],
+ join => "join Event on assetIndex.assetId=Event.assetId",
+ columns => ['Event.startDate','Event.startTime'],
+ );
+
+ # If the start and/or end dates are not filled in, do not limit
+ # to a certain time period
+ $rules{where} .= "Event.startDate >= '$startDate'"
+ if ($startDate);
+ $rules{where} .= " && " if ($startDate && $endDate);
+ $rules{where} .= "Event.endDate <= '$endDate'"
+ if ($endDate);
+
+
+ # Prepare the paginator
+ my @results = ();
+ $search->search(\%rules);
+ my $rs = $search->getResultSet;
+ while (my $data = $rs->hashRef) {
+ # Only show results the user is allowed to see
+ if ( $user->userId eq $data->{ownerUserId}
+ || $user->isInGroup($data->{groupIdView})
+ || $user->isInGroup($data->{groupIdEdit}) ) {
+ # Format the date
+ my $dt = WebGUI::DateTime->new($self->session, $data->{startDate}." ".($data->{startTime}?$data->{startTime}:"00:00:00"));
+ $dt->set_time_zone($self->session->user->profileField("timeZone"))
+ if ($data->{startTime});
+
+ push(@results, {
+ url => $data->{url},
+ title => $data->{title},
+ synopsis => $data->{synopsis},
+ startDate => $dt->strftime('%B %e, %Y'),
+ });
+ }
+ }
+
+ my $urlParams = 'func=search;'
+ . 'keywords=' . $self->session->url->escape($keywords) . ';'
+ . 'startdate=' . $startDate . ';'
+ . 'enddate=' . $endDate . ';'
+ ;
+
+ my $p = WebGUI::Paginator->new(
+ $self->session,
+ $self->getUrl($urlParams),
+ $perpage
+ );
+
+ $p->setDataByArrayRef(\@results);
+ $p->appendTemplateVars($var);
+ $var->{results} = $p->getPageData;
+ }
+
+ # Prepare the form
+ my $default_dt = WebGUI::DateTime->new($self->session, time);
+ my $default_start = $default_dt->toMysqlDate;
+ my $default_end = $default_dt->add(years => 1)->toMysqlDate;
+
+ $var->{"form.header"}
+ = WebGUI::Form::formHeader($session, {
+ action => $self->getUrl,
+ })
+ . WebGUI::Form::hidden($self->session, {
+ name => "func",
+ value => "search",
+ });
+
+ $var->{"form.footer"} = WebGUI::Form::formFooter($session);
+
+ $var->{"form.keywords"}
+ = WebGUI::Form::text($session, {
+ name => "keywords",
+ value => $keywords,
+ });
+
+ $var->{"form.perpage"}
+ = WebGUI::Form::text($session, {
+ name => "perpage",
+ value => $perpage,
+ });
+
+ $var->{"form.startDate"}
+ = WebGUI::Form::date($session, {
+ name => "startDate",
+ value => $startDate,
+ defaultValue => $default_start,
+ });
+
+ $var->{"form.endDate"}
+ = WebGUI::Form::date($session, {
+ name => "endDate",
+ value => $endDate,
+ defaultValue => $default_end,
+ });
+
+ $var->{"form.submit"}
+ = WebGUI::Form::submit($session, {
+ name => "submit",
+ value => "Search",
+ });
+
+ # This is very bad! It should be $self->processStyle or whatnot.
+ $self->session->http->sendHeader;
+ my $template = WebGUI::Asset::Template->new($self->session,$self->get("templateIdSearch"));
+ my $style = $self->session->style->process("~~~",$self->get("styleTemplateId"));
+ my ($head, $foot) = split("~~~",$style);
+ $self->session->output->print($head, 1);
+ $self->session->output->print($self->processTemplate($var, undef, $template));
+ $self->session->output->print($foot, 1);
+ return "chunked";
}
@@ -1772,6 +1760,10 @@ issues.
TODO: More abstraction so that certain methods can be tested.
+DODO: Handle Time Zones more logically. Any time we create a WebGUI::DateTime
+object, specify the time zone we're using. Use the new toDatabaseTimeZone and
+toUserTimeZone methods of WebGUI::DateTime for to make less confusion.
+
=cut
1;
diff --git a/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm b/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm
index 29b57f2ff..46f42a480 100755
--- a/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm
+++ b/lib/WebGUI/Workflow/Activity/CalendarUpdateFeeds.pm
@@ -88,8 +88,10 @@ sub execute {
my $sth = $self->session->db->prepare("select * from Calendar_feeds");
$sth->execute();
-
+ use Data::Dumper;
+
FEED:while (my $feed = $sth->hashRef) {
+
#!!! KLUDGE - If the feed is on the same server, set a scratch value
# I do not know how dangerous this is, so THIS MUST CHANGE!
# Preferably: Spectre would add a userSession to the database,
@@ -214,7 +216,7 @@ sub execute {
split / /, WebGUI::DateTime(
year => $year,
month => $month,
- day => $day,
+ day => $day,
hour => $hour,
minute => $minute,
second => $second,
@@ -274,6 +276,10 @@ sub execute {
{
$properties->{url} = $events{$id}->{$key}->[1];
}
+ elsif (lc $property_name eq "menutitle")
+ {
+ $properties->{menuTitle} = $events{$id}->{$key}->[1];
+ }
}