MojoMojo
view release on metacpan or search on metacpan
lib/MojoMojo/Schema/Result/Page.pm view on Meta::CPAN
"MojoMojo::Schema::Result::PageVersion",
{ page => "id", version => "version" }
);
__PACKAGE__->has_many(
"tags",
"MojoMojo::Schema::Result::Tag",
{ "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
"links_from",
"MojoMojo::Schema::Result::Link",
{ "foreign.from_page" => "self.id" }
);
__PACKAGE__->has_many(
"links_to",
"MojoMojo::Schema::Result::Link",
{ "foreign.to_page" => "self.id" }
);
__PACKAGE__->has_many(
"roleprivileges",
"MojoMojo::Schema::Result::RolePrivilege",
{ "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
"attachments",
"MojoMojo::Schema::Result::Attachment",
{ "foreign.page" => "self.id" },
{ order_by => 'name asc' }
);
__PACKAGE__->has_many(
"comments",
"MojoMojo::Schema::Result::Comment",
{ "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
"journals",
"MojoMojo::Schema::Result::Journal",
{ "foreign.pageid" => "self.id" }
);
=head1 NAME
MojoMojo::Schema::Result::Page - store pages
=head1 METHODS
=cut
=head2 update_content <%args>
Create a new content version for this page.
%args is each column of L<MojoMojo::Schema::Result::Content>.
=cut
# update_content: this whole method may need work to deal with workflow.
# maybe it can't even be called if the site uses workflow...
# may need fixing for better conflict handling, too. maybe use a transaction?
sub update_content {
my ( $self, %args ) = @_;
my $content_version = (
$self->content
? $self->content->max_version()
: undef
);
my %content_data =
map { $_ => $args{$_} }
$self->result_source->related_source('content')->columns;
my $now = DateTime->now;
@content_data{qw/page version status release_date/} = (
$self->id, ( $content_version ? $content_version + 1 : 1 ),
'released', $now,
);
my $content =
$self->result_source->related_source('content')
->resultset->create( \%content_data );
$self->content_version( $content->version );
$self->update;
$self->page_version->content_version_first($content_version)
unless defined $self->page_version->content_version_first;
$self->page_version->content_version_last($content_version);
$self->page_version->update;
if ( my $previous_content = $content->previous ) {
$previous_content->remove_date($now);
$previous_content->status('removed');
$previous_content->comments("Replaced by version $content_version.");
$previous_content->update;
}
else {
$self->result_source->resultset->set_paths($self);
}
foreach my $want_me ( $self->result_source->schema->resultset('WantedPage')
->search( { to_path => $self->path } ) )
{
my $wantme_page = $want_me->from_page;
# convert the wanted into links
$self->result_source->schema->resultset('Link')->create(
{
from_page => $wantme_page,
to_page => $self,
}
);
# clear the precompiled (will be recompiled on view)
if ( my $wantme_content = $wantme_page->content ) {
$wantme_content->precompiled(undef);
$wantme_content->update;
}
# ok, she don't want me anymore ;)
$want_me->delete();
}
} # end sub update_content
=head2 add_version
my $page_version_new = $page->add_version(
creator => $user_id,
name_orig => $page_new_name,
);
Arguments: %replacementdata
Returns: The new L<PageVersion|MojoMojo::Schema::Result::PageVersion>
object.
Creates a new page version by cloning the latest version (hence pointing
to the same content), and replacing its values with data in the replacement
hash.
Used for renaming pages.
=cut
sub add_version {
my ( $self, %args ) = @_;
my $now = DateTime->now;
my $page_version_last = $self->page_version->latest_version();
# clone the last version and update fields passed in %args
my %page_version_data = map {
exists $args{$_}
? ( $_ => $args{$_} )
: ( $_ => $page_version_last->$_ )
} $self->result_source->related_source('page_version')->columns;
delete $args{creator}; # creator is a field in page_version, not in page
# for the new version, set the version number, status, and release date
@page_version_data{
qw/
version status release_date/
}
= ( $page_version_last->version + 1, 'released', $now );
my $page_version_new;
# commit the new version to the database and update the previously last version to indicate its removal
$self->result_source->schema->txn_do(
sub {
$page_version_new =
$self->result_source->related_source('page_version')
->resultset->create( \%page_version_data );
$page_version_last->update(
{
remove_date => $now,
status => 'removed',
comments => 'Replaced by version '
. $page_version_data{version}
}
( run in 0.632 second using v1.01-cache-2.11-cpan-5837b0d9d2c )