Move Calendar feeds into the Calendar Asset table as JSON collateral.

Update tests and workflows to follow.
This commit is contained in:
Colin Kuskie 2009-08-26 22:14:04 +00:00
parent bfd25d6de2
commit 22d462166f
5 changed files with 425 additions and 309 deletions

View file

@ -20,8 +20,9 @@ use WebGUI::Search;
use WebGUI::Form;
use WebGUI::HTML;
use WebGUI::DateTime;
use Class::C3;
use base 'WebGUI::Asset::Wobject';
use base qw/WebGUI::Asset::Wobject WebGUI::JSONCollateral/;
use DateTime;
use JSON;
@ -255,6 +256,14 @@ sub definition {
unitsAvailable => [ qw( days weeks months years ) ],
},
icalFeeds => {
fieldType => "textarea",
defaultValue => [],
serialize => 1,
noFormPost => 1,
tab => "display",
},
icalInterval => {
fieldType => "interval",
defaultValue => $session->datetime->intervalToSeconds( 3, 'months' ),
@ -263,7 +272,7 @@ sub definition {
hoverHelp => $i18n->get('editForm icalInterval description'),
unitsAvailable => [ qw( days weeks months years ) ],
},
workflowIdCommit => {
fieldType => "workflow",
defaultValue => $session->setting->get('defaultVersionTagWorkflow'),
@ -309,6 +318,45 @@ sub addChild {
#----------------------------------------------------------------------------
=head2 addFeed ( $feedParams )
Adds a new Feed to this calendar. This is a wrapper around WebGUI::JSONCollateral's setJSONCollateral
method.
=head3 $feedParams
A hashref of parameters that describe the feed.
=head4 feedId
GUID for this feed.
=head4 url
URL for this feed.
=head4 lastUpdated
The date this feed was added, or edited last.
=head4 lastResult
The results of what happened the last time this feed was accessed to pull iCal.
=head4 feedType
What kind of feed this is.
=cut
sub addFeed {
my $self = shift;
my $feedParams = shift;
return $self->setJSONCollateral('icalFeeds', 'feedId', 'new', $feedParams);
}
#----------------------------------------------------------------------------
=head2 appendTemplateVarsDateTime( var, datetime [, prefix ] )
Append template vars from the given datetime. C<var> is a hash reference.
@ -460,6 +508,25 @@ sub createSubscriptionGroup {
#----------------------------------------------------------------------------
=head2 deleteFeed ( $feedId )
Deletes a Feed from this calendar. This is a wrapper around WebGUI::JSONCollateral's deleteJSONCollateral
method.
=head3 $feedId
GUID of the feed to delete.
=cut
sub deleteFeed {
my $self = shift;
my $feedId = shift;
return $self->deleteJSONCollateral('icalFeeds', 'feedId', $feedId);
}
#----------------------------------------------------------------------------
=head2 getEditForm
Adds an additional tab for feeds.
@ -613,9 +680,9 @@ ENDHTML
# Add the existing feeds
my $feeds = $self->getFeeds();
$tab->raw('<script type="text/javascript">'."\n");
for my $feedId (keys %$feeds) {
my %row = %{ $feeds->{ $feedId } };
$tab->raw("FeedsManager.addFeed('feeds','".$feedId."',".JSON->new->encode( \%row ).");\n");
for my $feed (@{ $feeds }) {
my $feedId = $feed->{feedId};
$tab->raw("FeedsManager.addFeed('feeds','".$feedId."',".JSON->new->encode( $feed ).");\n");
}
$tab->raw('</script>');
@ -779,9 +846,28 @@ sub getEventVars {
#----------------------------------------------------------------------------
=head2 getFeed ( $feedId )
Gets the data structure for one particular feed from this Calendar. This is a wrapper
for getJSONCollateral.
=head3 $feedId
The GUID of the feed to fetch.
=cut
sub getFeed {
my $self = shift;
my $feedId = shift;
return $self->getJSONCollateral('icalFeeds', 'feedId', $feedId);
}
#----------------------------------------------------------------------------
=head2 getFeeds ( )
Gets a hashref of hashrefs of all the feeds attached to this calendar.
Gets an arrayref of hashrefs of all the feeds attached to this calendar.
TODO: Format lastUpdated into the user's time zone
@ -789,12 +875,7 @@ TODO: Format lastUpdated into the user's time zone
sub getFeeds {
my $self = shift;
return $self->session->db->buildHashRefOfHashRefs(
"select * from Calendar_feeds where assetId=?",
[$self->get("assetId")],
"feedId"
);
return $self->get('icalFeeds');
}
#----------------------------------------------------------------------------
@ -950,30 +1031,23 @@ sub processPropertiesFromFormPost {
$feeds{$feedId}++;
}
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")]
);
my @oldFeeds = map { $_->{feedId} } @{ $self->getFeeds };
for my $feedId (@oldFeeds) {
if (!grep /^$feedId$/, @feedsFromForm) {
$session->db->write(
"delete from Calendar_feeds where feedId=? and assetId=?",
[$feedId,$self->get("assetId")]
);
if (!isIn($feedId, @feedsFromForm)) {
$self->deleteFeed($feedId);
}
}
# Create new feeds
for my $feedId (grep /^new(\d+)/, @feedsFromForm) {
$session->db->setRow("Calendar_feeds","feedId",{
feedId => "new",
assetId => $self->get("assetId"),
$self->addFeed({
url => $form->param("feeds-".$feedId),
feedType => "ical",
lastUpdated => 'never',
lastResult => '',
});
}
@ -983,18 +1057,26 @@ sub processPropertiesFromFormPost {
#----------------------------------------------------------------------------
=head2 purge ( )
=head2 setFeed ( $feedId, $feedParams )
Handle Asset specific purge tasks.
Adds a new Feed to this calendar. This is a wrapper around WebGUI::JSONCollateral's setJSONCollateral
method.
Delete iCal feeds for this Calendar.
=head3 $feedId
The GUID of the feed to update.
=head3 $feedParams
See L<addFeed> for a list of parameters.
=cut
sub purge {
my $self = shift;
$self->session->db->write('delete from Calendar_feeds where assetId=?',[$self->get('assetId')]);
$self->SUPER::purge;
sub setFeed {
my $self = shift;
my $feedId = shift;
my $feedParams = shift;
return $self->setJSONCollateral('icalFeeds', 'feedId', $feedId, $feedParams);
}
#----------------------------------------------------------------------------