Bivio::Biz::Model::MotionList
# Copyright (c) 2007-2011 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Biz::Model::MotionList;
use strict;
use Bivio::Base 'Biz.ListModel';
my($_DT) = b_use('Type.DateTime');
my($_FP) = b_use('Type.FilePath');
sub can_comment {
my($self) = @_;
return $self->is_open;
}
sub can_vote {
my($self) = @_;
return $self->is_open;
}
sub execute_load_this_for_parent {
my($proto, $req) = @_;
my($self) = $proto->new($req);
my($query) = $self->parse_query_from_request;
$query->put(this => [$query->get('parent_id')]);
$self->load_this($query);
return;
}
sub internal_initialize {
my($self) = @_;
return $self->merge_initialize_info($self->SUPER::internal_initialize, {
version => 1,
can_iterate => 1,
auth_id => ['Motion.realm_id'],
primary_key => ['Motion.motion_id'],
order_by => [qw(
Motion.name_lc
Motion.question
Motion.start_date_time
Motion.end_date_time
Motion.status
RealmFile.path_lc
)],
other => [qw(
Motion.name
Motion.question
Motion.type
Motion.motion_file_id
Motion.tuple_def_id
TupleUse.moniker
RealmFile.path
),
{
name => 'file_name',
type => 'FileName',
constraint => 'NONE',
},
map($self->vote_count_field($_),
b_use('Type.MotionVote')->get_list),
],
});
}
sub internal_post_load_row {
my($self, $row) = @_;
$row->{file_name} = defined($row->{'RealmFile.path'})
? $_FP->get_versionless_tail($row->{'RealmFile.path'})
: undef;
return shift->SUPER::internal_post_load_row(@_);
}
sub internal_prepare_statement {
my($self, $stmt) = @_;
$stmt->from($stmt->LEFT_JOIN_ON('Motion', 'RealmFile', [
[qw(Motion.motion_file_id RealmFile.realm_file_id)],
]));
$stmt->from($stmt->LEFT_JOIN_ON('Motion', 'TupleUse', [
[qw(Motion.tuple_def_id TupleUse.tuple_def_id)],
[qw(Motion.realm_id TupleUse.realm_id)],
]));
return;
}
sub is_open {
my($self) = @_;
my($end) = $self->get('Motion.end_date_time');
return 1 unless $end;
return $_DT->compare_defined($end, $_DT->now) > 0 ? 1 : 0;
}
sub vote_count_field {
my($self, $vote) = @_;
return {
name => lc($vote->get_name) . '_count',
type => 'Integer',
constraint => 'NONE',
in_select => 1,
select_value => '(
SELECT COUNT(*)
FROM motion_vote_t mv
WHERE mv.motion_id = motion_t.motion_id
AND mv.vote = ' . $vote->as_sql_param
. ') AS ' . lc($vote->get_name) . '_count'
};
}
1;