package Foorum::Controller::Poll; use strict; use warnings; our $VERSION = '1.001000'; use parent 'Catalyst::Controller'; use Foorum::Utils qw/encodeHTML get_page_from_url/; sub auto : Private { my ( $self, $c ) = @_; unless ( $c->config->{function_on}->{poll} ) { $c->forward( '/print_error', ['ERROR_PERMISSION_DENIED'] ); return 0; } return 1; } sub create : Regex('^forum/(\w+)/poll/new$') { my ( $self, $c ) = @_; return $c->res->redirect('/login') unless ( $c->user_exists ); my $forum_code = $c->req->snippets->[0]; my $forum = $c->controller('Get')->forum( $c, $forum_code ); my $forum_id = $forum->{forum_id}; if ( $forum->{settings}->{can_post_polls} and $forum->{settings}->{can_post_polls} eq 'N' ) { $c->detach( '/print_error', ['ERROR_PERMISSION_DENIED'] ); } $c->stash->{template} = 'poll/new.html'; return unless ( $c->req->method eq 'POST' ); # validation my $duration = $c->req->param('duration_day'); $duration =~ s/\D+//isg; $duration ||= 7; # default is 7 days my $multi = $c->req->param('multi'); $multi = 0 if ( '1' ne $multi ); # 0 or 1 my $now = time(); $duration = $now + $duration * 86400; # 86400 = 24 * 60 * 60, means 1 day # we prefer [% | html %] now because of my bad memory in TT html my $title = $c->req->param('title'); $title = encodeHTML($title); # insert record into table my $poll = $c->model('DBIC::Poll')->create( { forum_id => $forum_id, author_id => $c->user->user_id, multi => $multi, anonymous => 0, # disable it for this moment vote_no => 0, time => $now, duration => $duration, title => $title, hit => 0, } ); my $poll_id = $poll->poll_id; # get all options my $option_no = $c->req->param('option_number'); $c->log->debug("option no: $option_no"); foreach ( 1 .. $option_no ) { my $option_text = $c->req->param("option$_"); next unless ($option_text); $c->model('DBIC::PollOption')->create( { poll_id => $poll_id, text => $option_text, vote_no => 0, } ); } $c->res->redirect( $forum->{forum_url} . "/poll/$poll_id" ); } sub poll : Regex('^forum/(\w+)/poll/(\d+)$') { my ( $self, $c ) = @_; my $forum_code = $c->req->snippets->[0]; my $forum = $c->controller('Get')->forum( $c, $forum_code ); my $forum_id = $forum->{forum_id}; my $poll_id = $c->req->snippets->[1]; my $poll = $c->model('DBIC::Poll')->find( { poll_id => $poll_id, }, { prefetch => [ 'author', 'options' ], } ); my $can_vote = 0; if ( time() < $poll->duration and $c->user_exists ) { my $is_voted = $c->model('DBIC::PollResult')->count( { poll_id => $poll_id, poster_id => $c->user->user_id, } ); $can_vote = 1 unless ($is_voted); } # get comments my ($view_mode) = ( $c->req->path =~ /\/view_mode=(thread|flat)(\/|$)/ ); my ($comment_id) = ( $c->req->path =~ /\/comment_id=(\d+)(\/|$)/ ); ( $c->stash->{comments}, $c->stash->{comments_pager} ) = $c->model('DBIC::Comment')->get_comments_by_object( { object_type => 'poll', object_id => $poll_id, page => get_page_from_url( $c->req->path ), view_mode => $view_mode, comment_id => $comment_id, } ); # register hit $poll->{_column_data}->{hit} = $c->model('DBIC::Hit') ->register( 'poll', $poll->poll_id, $poll->hit ); $c->stash( { can_vote => $can_vote, poll => $poll, template => 'poll/index.html', } ); } sub view_polls : Regex('^forum/(\w+)/polls$') { my ( $self, $c ) = @_; my $forum_code = $c->req->snippets->[0]; my $forum = $c->controller('Get')->forum( $c, $forum_code ); my $forum_id = $forum->{forum_id}; my $page = get_page_from_url( $c->req->path ); # get all moderators $c->stash->{forum_roles} = $c->model('DBIC::UserForum')->get_forum_moderators($forum_id); my $rs = $c->model('DBIC::Poll')->search( { forum_id => $forum_id, }, { order_by => 'time desc', rows => $c->config->{per_page}->{forum}, page => $page, prefetch => ['author'], } ); $c->stash( { polls => [ $rs->all ], pager => $rs->pager, template => 'poll/view_polls.html', } ); } 1; __END__ =pod =head1 AUTHOR Fayland Lam =cut