diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 5fd31e858..4128f539a 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -22,6 +22,7 @@ - fixed: international characters corrupted in titles - fixed: Users without karma can transfer karma by rating posts - fixed: gateway macro not usable in links in rich editor + - fixed: iCal feeds don't update properly when events are changed 7.5.9 - fixed: Collaboration System attachments follow site's max size instead of CS's diff --git a/docs/upgrades/upgrade_7.5.9-7.5.10.pl b/docs/upgrades/upgrade_7.5.9-7.5.10.pl index 0195491a7..faf1a4ade 100644 --- a/docs/upgrades/upgrade_7.5.9-7.5.10.pl +++ b/docs/upgrades/upgrade_7.5.9-7.5.10.pl @@ -24,6 +24,7 @@ my $session = start(); # this line required privatizeVisitor($session); ucfirstThingyFieldTypes($session); +addEventSequenceNumber($session); finish($session); # this line required @@ -36,6 +37,15 @@ finish($session); # this line required # print "DONE!\n" unless $quiet; #} +#---------------------------------------------------------------------------- +sub addEventSequenceNumber { + my $session = shift; + print "\tAdding iCal sequence number to events... " unless $quiet; + $session->db->write('ALTER TABLE Event ADD COLUMN iCalSequenceNumber int'); + $session->db->write('UPDATE Event SET iCalSequenceNumber=0'); + print "Done.\n" unless $quiet; +} + #---------------------------------------------------------------------------- sub privatizeVisitor { my $session = shift; diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 536aba63e..91e8704dc 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -43,6 +43,21 @@ use WebGUI::DateTime; =cut +sub addRevision { + my $self = shift; + my $newRev = $self->SUPER::addRevision(@_); + my $sequenceNumber = $newRev->get('iCalSequenceNumber'); + if (defined $sequenceNumber) { + $sequenceNumber++; + } + else { + $sequenceNumber = 0; + } + $newRev->update({iCalSequenceNumber => $sequenceNumber}); + return $newRev; +} + + #################################################################### sub definition { @@ -114,6 +129,9 @@ sub definition { sequenceNumber => { fieldType => 'hidden', }, + iCalSequenceNumber => { + fieldType => 'hidden', + }, ); diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm index ce522f132..74e4f7d37 100644 --- a/lib/WebGUI/Asset/Wobject/Calendar.pm +++ b/lib/WebGUI/Asset/Wobject/Calendar.pm @@ -1868,11 +1868,29 @@ sub www_ical { . WebGUI::DateTime->new($self->session, $event->get("creationDate"))->toIcal . "\r\n"; + # SEQUENCE + my $sequenceNumber = $event->get("iCalSequenceNumber"); + if (defined $sequenceNumber) { + $ical .= qq{SEQUENCE:} + . $event->get("iCalSequenceNumber") + . "\r\n"; + } + # DTSTART - $ical .= qq{DTSTART:}.$event->getIcalStart."\r\n"; + my $eventStart = $event->getIcalStart; + $ical .= 'DTSTART'; + if ($eventStart !~ /T/) { + $ical .= ';VALUE=DATE'; + } + $ical .= ":$eventStart\r\n"; # DTEND - $ical .= qq{DTEND:}.$event->getIcalEnd."\r\n"; + my $eventEnd = $event->getIcalEnd; + $ical .= 'DTEND'; + if ($eventEnd !~ /T/) { + $ical .= ';VALUE=DATE'; + } + $ical .= ":$eventEnd\r\n"; # Summary (the title) # Wrapped at 75 columns