diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 68cec109c..a8b731c93 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -31,6 +31,7 @@ - fixed #11138: RichEdit, upload image does not commit a version tag - fixed ExpireIncompleteSurveyResponses Workflow: process responses for deleted users - fixed #11157: calendar tool for entering add event date + - fixed #11158: Calendar iCal feed doesn't show today's all-day events 7.8.1 - mark $session->datetime->time as deprecated and remove its use from core code diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm index 3c978c0d6..71ebe6b90 100644 --- a/lib/WebGUI/Asset/Wobject/Calendar.pm +++ b/lib/WebGUI/Asset/Wobject/Calendar.pm @@ -47,9 +47,9 @@ 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"), @@ -57,19 +57,19 @@ sub definition { day => $i18n->get("defaultView value day"), list => $i18n->get('defaultView value list'), ); - + tie my %optionsDefaultDate, 'Tie::IxHash', ( current => $i18n->get("defaultDate value current"), first => $i18n->get("defaultDate value first"), last => $i18n->get("defaultDate value last"), ); - + tie my %optionsEventSort, 'Tie::IxHash', ( time => $i18n->get("sortEventsBy value time"), sequencenumber => $i18n->get("sortEventsBy value sequencenumber"), ); - + ### Build properties hash ### tie my %properties, 'Tie::IxHash', ( ##### DEFAULTS ##### @@ -81,7 +81,7 @@ sub definition { label => $i18n->get("defaultView label"), hoverHelp => $i18n->get("defaultView description"), }, - + defaultDate => { fieldType => "SelectBox", defaultValue => 'current', @@ -90,7 +90,7 @@ sub definition { label => $i18n->get("defaultDate label"), hoverHelp => $i18n->get("defaultDate description"), }, - + ##### GROUPS / ACCESS ##### # Edit events groupIdEventEdit => { @@ -104,8 +104,8 @@ sub definition { groupIdSubscribed => { fieldType => 'hidden', }, - - + + ##### TEMPLATES - DISPLAY ##### # Month templateIdMonth => { @@ -116,7 +116,7 @@ sub definition { hoverHelp => $i18n->get('templateIdMonth description'), label => $i18n->get('templateIdMonth label'), }, - + # Week templateIdWeek => { fieldType => "template", @@ -126,7 +126,7 @@ sub definition { hoverHelp => $i18n->get('templateIdWeek description'), label => $i18n->get('templateIdWeek label'), }, - + # Day templateIdDay => { fieldType => "template", @@ -136,7 +136,7 @@ sub definition { hoverHelp => $i18n->get('templateIdDay description'), label => $i18n->get('templateIdDay label'), }, - + # List templateIdList => { fieldType => "template", @@ -156,7 +156,7 @@ sub definition { hoverHelp => $i18n->get('templateIdEvent description'), label => $i18n->get('templateIdEvent label'), }, - + # Event Edit templateIdEventEdit => { fieldType => "template", @@ -166,7 +166,7 @@ sub definition { hoverHelp => $i18n->get('templateIdEventEdit description'), label => $i18n->get('templateIdEventEdit label'), }, - + # Search templateIdSearch => { fieldType => "template", @@ -176,8 +176,8 @@ sub definition { hoverHelp => $i18n->get('templateIdSearch description'), label => $i18n->get('templateIdSearch label'), }, - - + + ##### TEMPLATES - PRINT ##### # Month templateIdPrintMonth => { @@ -188,7 +188,7 @@ sub definition { hoverHelp => $i18n->get('templateIdPrintMonth description'), label => $i18n->get('templateIdPrintMonth label'), }, - + # Week templateIdPrintWeek => { fieldType => "template", @@ -198,7 +198,7 @@ sub definition { hoverHelp => $i18n->get('templateIdPrintWeek description'), label => $i18n->get('templateIdPrintWeek label'), }, - + # Day templateIdPrintDay => { fieldType => "template", @@ -208,7 +208,7 @@ sub definition { hoverHelp => $i18n->get('templateIdPrintDay description'), label => $i18n->get('templateIdPrintDay label'), }, - + # List templateIdPrintList => { fieldType => "template", @@ -228,8 +228,8 @@ sub definition { hoverHelp => $i18n->get('templateIdPrintEvent description'), label => $i18n->get('templateIdPrintEvent label'), }, - - + + ##### Miscellany ##### visitorCacheTimeout => { fieldType => "integer", @@ -283,7 +283,7 @@ sub definition { type => 'WebGUI::VersionTag', }, ); - + push @{$definition}, { assetName => $i18n->get('assetName'), icon => 'calendar.gif', @@ -292,7 +292,7 @@ sub definition { properties => \%properties, autoGenerateForms => 1, }; - + return $class->SUPER::definition($session, $definition); } @@ -308,7 +308,7 @@ 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; @@ -401,7 +401,7 @@ sub appendTemplateVarsDateTime { $var->{ $name } = $dt->can( $fields{ $name } )->( $dt ); } } - + # Special fields if ( $prefix ) { $var->{ $prefix . "Second" } = sprintf "%02d", $dt->second; @@ -414,7 +414,7 @@ sub appendTemplateVarsDateTime { $var->{ "minute" } = sprintf "%02d", $dt->minute; $var->{ "meridiem" } = ( $dt->hour < 12 ? "AM" : "PM" ); } - + return $var; } @@ -433,7 +433,7 @@ sub canEdit { my $self = shift; my $userId = shift || $self->session->user->userId; my $form = $self->session->form; - + # Account for new events return 1 if ( $self->canAddEvent( $userId ) @@ -492,14 +492,14 @@ Creates the group for users that are subscribed to the Calendar. # 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 }); @@ -542,35 +542,35 @@ sub getEditForm { 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"), 6); $tab->raw(""); - + $tab->raw(<<'ENDJS'); ENDJS @@ -664,7 +664,7 @@ ENDJS - + @@ -708,11 +708,11 @@ sub getEvent { # Warn and return undef 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); - + unless ( $event ) { $self->session->errorHandler->warn("Event '$assetId' doesn't exist!"); return undef; @@ -773,9 +773,9 @@ sub getEventsIn { $self->session->errorHandler->warn("WebGUI::Asset::Wobject::Calendar->getEventsIn() called with not enough arguments at ".join('::',(caller)[1,2])); return undef; } - + # Create objects and adjust for timezone - + my ($startDate) = split / /, $start; my ($endDate) = split / /, $end; @@ -786,8 +786,8 @@ sub getEventsIn { && Event.endTime IS NULL && !( - Event.startDate >= '$endDate' - || Event.endDate <= '$startDate' + Event.startDate > '$endDate' + || Event.endDate < '$startDate' ) ) || !( @@ -810,6 +810,7 @@ sub getEventsIn { my $orderby = join ',', @order_priority; + $self->session->log->warn("sql clause: $where"); my $events = $self->getLineage(["descendants"], { returnObjects => 1, @@ -836,7 +837,7 @@ week, month and or day views. sub getEventVars { my $self = shift; my $event = shift; - + my %eventVar = %{$event->get}; %eventVar = (map { "event".ucfirst($_) => delete $eventVar{$_} } keys %eventVar); my %eventDates = $event->getTemplateVars; @@ -916,7 +917,7 @@ Gets the last event in this calendar. Returns the Event object. sub getLastEvent { my $self = shift; my $lineage = $self->get("lineage"); - + my ($assetId) = $self->session->db->quickArray(<getEvent($assetId); } @@ -943,7 +944,7 @@ sub getTemplateVars { my $self = shift; my $var = $self->get; - + return $var; } @@ -974,18 +975,18 @@ parameters. 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)); if (!$template) { WebGUI::Error::ObjectNotFound::Template->throw( @@ -995,7 +996,7 @@ sub prepareView { ); } $template->prepare($self->getMetaDataAsTemplateVariables); - + $self->{_viewTemplate} = $template; } @@ -1016,13 +1017,13 @@ sub processPropertiesFromFormPost { my $session = $self->session; my $form = $self->session->form; $self->SUPER::processPropertiesFromFormPost; - + unless ($self->get("groupIdSubscribed")) { $self->createSubscriptionGroup(); } - + $self->session->errorHandler->info( "DEFAULT VIEW:" . $self->get('defaultView') ); - + ### Get feeds from the form # Workaround WebGUI::Session::Form->param bug that returns duplicate # names. @@ -1098,15 +1099,15 @@ sub view { my $self = shift; my $session = $self->session; my $form = $session->form; - + ## 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") || $self->get( 'defaultView' ); $params->{start} = $form->param("start"); - + # Validate type passed, or recover from session scratchpad if ($params->{type} =~ /^(?:month|week|day|list)$/i) { $session->scratch->set('cal_view_type', $params->{'type'}); @@ -1136,7 +1137,7 @@ sub view { $session->scratch->set('cal_view_start', $params->{'start'}); } - + # Get the template from the appropriate view* method # TODO: This should be abstracted my $var = lc $params->{type} eq "month" ? $self->viewMonth( $params ) @@ -1145,7 +1146,7 @@ sub view { : lc $params->{type} eq "list" ? $self->viewList( $params ) : return $self->errorHandler->error("Calendar invalid 'type=' url parameter") ; - + ##### Process the template # Add any global variables # Admin @@ -1153,13 +1154,13 @@ sub view { $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;type=".$params->{type}.";start=$params->{start}"); } - + # URLs $var->{ url } = $self->getUrl; $var->{"urlDay"} = $self->getUrl("type=day;start=".$params->{start}); @@ -1168,13 +1169,13 @@ sub view { $var->{"urlSearch"} = $self->getSearchUrl; $var->{"urlPrint"} = $self->getUrl("type=".$params->{type}.";start=".$params->{start}.";print=1"); $var->{"urlIcal"} = $self->getUrl("func=ical"); - + $var->{"extrasUrl"} = $self->session->url->extras(); $var->{ paramStart } = $params->{ start }; $var->{ paramType } = $params->{ type }; # 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}); } @@ -1291,7 +1292,7 @@ sub viewList { my $session = $self->session; my $i18n = WebGUI::International->new($session,"Asset_Calendar"); my $var = $self->getTemplateVars; - + ### Get the events my $dtStart = WebGUI::DateTime->new( $session, $params->{start} )->truncate( to => "day" ); my $dtEnd = $dtStart->clone->add( seconds => $self->get('listViewPageInterval') ); @@ -1320,7 +1321,7 @@ sub viewList { if ( $dt->day > $dtLast->day ) { $eventVar{ new_day } = 1; } - + push @{ $var->{events} }, { %eventVar, %eventDate }; $dtLast = $dt; } @@ -1329,7 +1330,7 @@ sub viewList { # Date span $self->appendTemplateVarsDateTime( $var, $dtStart, "start" ); $self->appendTemplateVarsDateTime( $var, $dtEnd, "end" ); - + # Previous and next pages if ( $self->getFirstEvent && $self->getFirstEvent->getDateTimeStart < $dtStart ) { my $dtPrevious @@ -1373,7 +1374,7 @@ sub viewMonth { my $tz = $session->datetime->getTimeZone; 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}); @@ -1383,11 +1384,11 @@ sub viewMonth { my $dtEnd = $dt->clone->add(months => 1); my $end = $dtEnd->toMysql; $dtEnd->add(seconds => -1); - + my @events = $self->getEventsIn($start,$end); - - + + #### Create the template parameters ## The grid my $first_dow = $session->user->profileField("firstDayOfWeek") || 0; @@ -1398,15 +1399,15 @@ sub viewMonth { 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, @@ -1414,18 +1415,18 @@ sub viewMonth { "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 EVENT: for my $event (@events) { next EVENT unless $event->canView(); # Get the WebGUI::DateTime objects my $dt_event_start = $event->getDateTimeStart; my $dt_event_end = $event->getDateTimeEndNI; - + # Prepare the template variables my %eventTemplateVariables = $self->getEventVars($event); @@ -1442,16 +1443,16 @@ sub viewMonth { 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; - + push @{$var->{weeks}->[$week]->{days}->[$position]->{events}}, \%eventTemplateVariables; } } - + # 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, @@ -1460,21 +1461,21 @@ sub viewMonth { "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 $dayIndex (0..$#dayNames) { push @{$var->{dayNames}}, { "dayName" => $dayNames[$dayIndex], "dayAbbr" => $dayAbbrs[$dayIndex], }; } - + $var->{"pageNextYear" } = $dt->year + 1; $var->{"pageNextUrl" } = $self->getUrl("type=month;start=" . $dt->clone->add(years=>1)->toMysql); $var->{"pagePrevYear" } = $dt->year - 1; @@ -1482,7 +1483,7 @@ sub viewMonth { $var->{"monthName" } = $dt->month_name; $var->{"monthAbbr" } = $dt->month_abbr; $var->{"year" } = $dt->year; - + # Return the template return $var; } @@ -1514,14 +1515,14 @@ sub viewWeek { my $tz = $session->datetime->getTimeZone; 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->set_time_zone($tz); $dt->truncate( to => "day"); - + # Apply First Day of Week settings my $first_dow = $session->user->profileField("firstDayOfWeek") || 0; # 0 - sunday @@ -1529,11 +1530,11 @@ sub viewWeek { # 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)->add( seconds => -1); my $end = $dtEnd->toMysql; # Clone to prevent saving change - + my $sort_by_sequence++ if $self->get('sortEventsBy') eq 'sequencenumber'; my $can_edit_order++ if $self->canEdit && $sort_by_sequence; @@ -1545,11 +1546,11 @@ sub viewWeek { my @events = $self->getEventsIn( $start, $end ); my (%event_asset_of, %seq_key_of, %week_day_of, @event_days); - + # The events for my $event ( @events ) { next unless $event->canView(); - + my $event_asset_id = $event->get( 'assetId' ); # Add Event object use by assetId @@ -1559,16 +1560,16 @@ sub viewWeek { # the template variables my $dt_event_start = $event->getDateTimeStart; my $dt_event_end = $event->getDateTimeEndNI; - + #Handle events that start before this week or end after this week. if ($dt_event_start < $dt) { $dt_event_start = $dt; } - + if ($dt_event_end > $dtEnd) { $dt_event_end = $dtEnd; } - + my $start_dow = ($dt_event_start->day_of_week - $first_dow) % 7; my $end_dow = ($dt_event_end->day_of_week - $first_dow) % 7; @@ -1577,13 +1578,13 @@ sub viewWeek { {},$event_asset_id)->[0]; foreach my $weekDay ($start_dow .. $end_dow) { - + push @{ $event_days[ $weekDay ] }, $event; my $event_day_pos = $#{ $event_days[ $weekDay ]}; # Monitor duplicates in sequence list; push @{ $seq_key_of{ $sequence_number } }, $event_asset_id; - + # Add find assetId by day/order pos $week_day_of{ $weekDay }{ $event_day_pos } = $event_asset_id; @@ -1591,7 +1592,7 @@ sub viewWeek { $event_asset_of{ $event_asset_id }{ $weekDay } = $event_day_pos; } } - + # Process the event sequence change request # # Based upon binary values beginning at 16384 sequence @@ -1652,7 +1653,7 @@ sub viewWeek { } } - + $session->db->dbh->do ("UPDATE Event SET sequenceNumber = ? WHERE assetId = ? AND revisionDate = ?",{}, @@ -1666,7 +1667,7 @@ sub viewWeek { my $next_day_pos = $event_asset_of{ $next_asset_id }{ $event_day }; my $next_event_object = $event_asset_of{ $next_asset_id }{ object }; my $next_seq_num = $session->db->dbh->selectcol_arrayref("SELECT sequenceNumber FROM Event WHERE assetId = ? ORDER BY revisionDate desc LIMIT 1",{},$next_asset_id)->[0]; - + # warn "After Asset: $next_asset_id, seqNum: $next_seq_num, day: $event_day.$next_day_pos\n"; my $seq_idx; @@ -1690,14 +1691,14 @@ sub viewWeek { # warn "Moved Asset New Seq Num: ".($next_seq_num + $incr)." by $incr\n"; } } - - + + #### 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; @@ -1709,14 +1710,14 @@ sub viewWeek { $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 my @events = $self->getEventsIn( $start, $end ); for my $event ( @events ) { @@ -1761,13 +1762,13 @@ sub viewWeek { } } - + # 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->{"startMonth" } = $dt->month; $var->{"startMonthName" } = $dt->month_name; $var->{"startMonthAbbr" } = $dt->month_abbr; @@ -1775,7 +1776,7 @@ sub viewWeek { $var->{"startDayName" } = $dt->day_name; $var->{"startDayAbbr" } = $dt->day_abbr; $var->{"startYear" } = $dt->year; - + $var->{"endMonth" } = $dtEnd->month; $var->{"endMonthName" } = $dtEnd->month_name; $var->{"endMonthAbbr" } = $dtEnd->month_abbr; @@ -1783,8 +1784,8 @@ sub viewWeek { $var->{"endDayName" } = $dtEnd->day_name; $var->{"endDayAbbr" } = $dtEnd->day_abbr; $var->{"endYear" } = $dtEnd->year; - - + + # Return the template return $var; } @@ -1803,9 +1804,9 @@ sub unwrapIcal { my $self = shift; my $text = shift; - - - + + + } #---------------------------------------------------------------------------- @@ -1845,10 +1846,10 @@ 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; - - + + return $self->getAdminConsole->render( $self->getEditForm->print, $i18n->get("assetName") @@ -1868,7 +1869,7 @@ sub www_ical { my $session = $self->session; my $user = $self->session->user; my $form = $self->session->form; - + #!!! KLUDGE: # An "adminId" may be passed as a parameter in order to facilitate # calls between calendars on the same server getting administrator @@ -1884,13 +1885,13 @@ sub www_ical { "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; my $start = $form->param("start"); if ($start) { @@ -1901,15 +1902,17 @@ sub www_ical { ); } else { - $dt_start = WebGUI::DateTime->new($self->session, time); + $dt_start = WebGUI::DateTime->new($session, time); $dt_start->set_time_zone( $session->datetime->getTimeZone ); } - + + $session->log->warn("start1: ". $dt_start->toMysql); + my $dt_end; my $end = $form->param("end"); if ($end) { $dt_end - = WebGUI::DateTime->new($self->session, + = WebGUI::DateTime->new($session, mysql => $end, time_zone => $session->datetime->getTimeZone, ); @@ -1917,22 +1920,27 @@ sub www_ical { else { $dt_end = $dt_start->clone->add( seconds => $self->get('icalInterval') ); } - - - + + $session->log->warn("start2: ". $dt_start->toMysql); + $session->log->warn("end2: ". $dt_end->toMysql); + + # 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: + $session->log->warn("before event processing"); EVENT: for my $event (@events) { + $session->log->warn("have event: "); next EVENT unless $event->canView(); + $session->log->warn($event->getTitle); $ical .= qq{BEGIN:VEVENT\r\n}; - + ### UID # Use feed's UID to prevent over-propagation if ($event->get("feedUid")) { @@ -1943,17 +1951,17 @@ sub www_ical { 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"; - + # SEQUENCE my $sequenceNumber = $event->get("iCalSequenceNumber"); if (defined $sequenceNumber) { @@ -1961,7 +1969,7 @@ sub www_ical { . $event->get("iCalSequenceNumber") . "\r\n"; } - + # DTSTART my $eventStart = $event->getIcalStart; $ical .= 'DTSTART'; @@ -1969,7 +1977,7 @@ sub www_ical { $ical .= ';VALUE=DATE'; } $ical .= ":$eventStart\r\n"; - + # DTEND my $eventEnd = $event->getIcalEnd; $ical .= 'DTEND'; @@ -1977,7 +1985,7 @@ sub www_ical { $ical .= ';VALUE=DATE'; } $ical .= ":$eventEnd\r\n"; - + # Summary (the title) # Wrapped at 75 columns $ical .= $self->wrapIcal("SUMMARY:".$event->get("title"))."\r\n"; @@ -2005,8 +2013,8 @@ sub www_ical { # 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"); @@ -2025,7 +2033,7 @@ Import an iCalendar file into the Events Calendar. sub www_importIcal { ### TODO: Everything - + return $_[0]->session->privilege->noAccess; } @@ -2048,10 +2056,10 @@ sub www_search { my $startDate = $form->process("startdate"); my $endDate = $form->process("enddate"); my $perpage = $form->param("perpage"); - + my $var = $self->getTemplateVars; $var->{url} = $self->getUrl; - + # If there is a search to perform if ($keywords || $startDate || $endDate) { my $search = new WebGUI::Search($session); @@ -2062,7 +2070,7 @@ sub www_search { join => "join Event on assetIndex.assetId=Event.assetId and assetIndex.revisionDate=Event.revisionDate", 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'" @@ -2070,8 +2078,8 @@ sub www_search { $rules{where} .= " && " if ($startDate && $endDate); $rules{where} .= "Event.endDate <= '$endDate'" if ($endDate); - - + + # Prepare the paginator my @results = (); $search->search(\%rules); @@ -2085,7 +2093,7 @@ sub www_search { my $dt = WebGUI::DateTime->new($self->session, $data->{startDate}." ".($data->{startTime}?$data->{startTime}:"00:00:00")); $dt->set_time_zone( $self->session->datetime->getTimeZone ) if ($data->{startTime}); - + push(@results, { url => $self->session->url->gateway($data->{url}), title => $data->{title}, @@ -2094,7 +2102,7 @@ sub www_search { }); } } - + my $urlParams = 'func=search;' . 'keywords=' . $self->session->url->escape($keywords) . ';' . 'startdate=' . $startDate . ';' @@ -2111,12 +2119,12 @@ sub www_search { $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, @@ -2125,9 +2133,9 @@ sub www_search { name => "func", value => "search", }); - + $var->{"form.footer"} = WebGUI::Form::formFooter($session); - + $var->{"form.keywords"} = WebGUI::Form::text($session, { name => "keywords", @@ -2153,7 +2161,7 @@ sub www_search { value => $endDate, defaultValue => $default_end, }); - + my $i18n = WebGUI::International->new($session, 'Asset_Calendar'); $var->{"form.submit"} diff --git a/t/Asset/Wobject/Calendar.t b/t/Asset/Wobject/Calendar.t index b691061b2..994bff95d 100644 --- a/t/Asset/Wobject/Calendar.t +++ b/t/Asset/Wobject/Calendar.t @@ -57,7 +57,7 @@ use Data::Dumper; use WebGUI::Asset::Wobject::Calendar; use WebGUI::Asset::Event; -plan tests => 15 + scalar @icalWrapTests; +plan tests => 14 + scalar @icalWrapTests; my $session = WebGUI::Test->session; @@ -221,6 +221,30 @@ my $justAfterwt = $windowCal->addChild({ timeZone => $tz, }, undef, undef, {skipAutoCommitWorkflows => 1}); +my $coincident = $windowCal->addChild({ + className => 'WebGUI::Asset::Event', + title => 'Coincident with the window start and window end', + startDate => $startDt->toDatabaseDate, + endDate => $endDt->toDatabaseDate, + timeZone => $tz, +}, undef, undef, {skipAutoCommitWorkflows => 1}); + +my $coincidentLow = $windowCal->addChild({ + className => 'WebGUI::Asset::Event', + title => 'Coincident with the window start', + startDate => $startDt->toDatabaseDate, + endDate => $endDt->clone->add(days => 1)->toDatabaseDate, + timeZone => $tz, +}, undef, undef, {skipAutoCommitWorkflows => 1}); + +my $coincidentHigh = $windowCal->addChild({ + className => 'WebGUI::Asset::Event', + title => 'Coincident with the window end', + startDate => $startDt->clone->add( days => -1, )->toDatabaseDate, + endDate => $endDt->toDatabaseDate, + timeZone => $tz, +}, undef, undef, {skipAutoCommitWorkflows => 1}); + # wt suffix = with times # inside # insidewt @@ -228,6 +252,9 @@ my $justAfterwt = $windowCal->addChild({ # |-------------straddlewt---------------| # straddleLowwt # straddleHighwt +# |----------coincident-----------| +# |----------coincidentLow------------------| +# |--------------------coincidentHigh-------| # window: |-------------------------------| # justBeforewt justAfterwt # outside high @@ -239,7 +266,7 @@ my $tag2 = WebGUI::VersionTag->getWorking($session); $tag2->commit; WebGUI::Test->tagsToRollback($tag2); -is(scalar @{ $windowCal->getLineage(['children'])}, 10, 'added events to the window calendar'); +is(scalar @{ $windowCal->getLineage(['children'])}, 13, 'added events to the window calendar'); my @window = $windowCal->getEventsIn($startDt->toDatabase, $endDt->toDatabase); @@ -247,11 +274,14 @@ my @window = $windowCal->getEventsIn($startDt->toDatabase, $endDt->toDatabase); #note join "\n", map { join ' ', $_->get('title'), $_->get('startDate'), $_->get('startTime')} @window; #note $endDt->toDatabase; -is(scalar @window, 6, 'getEventsIn returned 6 events'); cmp_bag( [ map { $_->get('title') } @window ], - [ map { $_->get('title') } ($inside, $insidewt, $straddle, $straddleHighwt, $straddleLowwt, $straddlewt)], - '..returns correct 6 events' + [ map { $_->get('title') } + ($inside, $insidewt, + $straddle, $straddleHighwt, $straddleLowwt, $straddlewt, + $coincident, $coincidentLow, $coincidentHigh, ) + ], + '..returns correct set of events' ); ######################################################################