180 lines
4.7 KiB
Perl
180 lines
4.7 KiB
Perl
|
|
# This code was forked from the LiveJournal project owned and operated
|
||
|
|
# by Live Journal, Inc. The code has been modified and expanded by
|
||
|
|
# Dreamwidth Studios, LLC. These files were originally licensed under
|
||
|
|
# the terms of the license supplied by Live Journal, Inc, which can
|
||
|
|
# currently be found at:
|
||
|
|
#
|
||
|
|
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
|
||
|
|
#
|
||
|
|
# In accordance with the original license, this code and all its
|
||
|
|
# modifications are provided under the GNU General Public License.
|
||
|
|
# A copy of that license can be found in the LICENSE file included as
|
||
|
|
# part of this distribution.
|
||
|
|
#
|
||
|
|
package DW::Controller::RPC::Poll;
|
||
|
|
|
||
|
|
use strict;
|
||
|
|
use DW::Routing;
|
||
|
|
use LJ::JSON;
|
||
|
|
|
||
|
|
DW::Routing->register_rpc( "poll", \&poll_handler, format => 'json' );
|
||
|
|
DW::Routing->register_rpc( "pollvote", \&pollvote_handler, format => 'json' );
|
||
|
|
|
||
|
|
sub poll_handler {
|
||
|
|
my $r = DW::Request->get;
|
||
|
|
my $args = $r->post_args;
|
||
|
|
|
||
|
|
my $ret = {};
|
||
|
|
|
||
|
|
my $err = sub {
|
||
|
|
my $msg = shift;
|
||
|
|
$r->print(
|
||
|
|
to_json(
|
||
|
|
{
|
||
|
|
error => "Error: $msg",
|
||
|
|
}
|
||
|
|
)
|
||
|
|
);
|
||
|
|
return $r->OK;
|
||
|
|
};
|
||
|
|
|
||
|
|
my $pollid = ( ( $args->{pollid} || 0 ) + 0 ) or return $err->("No pollid");
|
||
|
|
my $pollqid = ( $args->{pollqid} || 0 ) + 0;
|
||
|
|
my $userid = ( $args->{userid} || 0 ) + 0;
|
||
|
|
my $action = $args->{action};
|
||
|
|
my $page = ( $args->{page} || 0 ) + 0;
|
||
|
|
my $pagesize = ( $args->{pagesize} || 2000 ) + 0;
|
||
|
|
|
||
|
|
my $poll = LJ::Poll->new($pollid) or return $err->("Error loading poll $pollid");
|
||
|
|
|
||
|
|
my $remote = LJ::get_remote();
|
||
|
|
unless ( $poll->can_view($remote) ) {
|
||
|
|
return $err->("You cannot view this poll");
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( $action eq 'get_answers' ) {
|
||
|
|
return $err->("No pollqid") unless $pollqid;
|
||
|
|
|
||
|
|
my $question = $poll->question($pollqid)
|
||
|
|
or return $err->("Error loading question $pollqid");
|
||
|
|
my $pages = $question->answers_pages( $poll->journalid, $pagesize );
|
||
|
|
$ret->{paging_html} =
|
||
|
|
$question->paging_bar_as_html( $page, $pages, $pagesize, $poll->journalid, $pollid,
|
||
|
|
$pollqid );
|
||
|
|
$ret->{answer_html} =
|
||
|
|
$question->answers_as_html( $poll->journalid, $poll->isanon, $page, $pagesize, $pages );
|
||
|
|
}
|
||
|
|
elsif ( $action eq 'get_respondents' ) {
|
||
|
|
$ret->{answer_html} = $poll->respondents_as_html;
|
||
|
|
}
|
||
|
|
elsif ( $action eq 'get_user_answers' ) {
|
||
|
|
return $err->("No userid") unless $userid;
|
||
|
|
|
||
|
|
$ret->{answer_html} = $poll->user_answers_as_html($userid);
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
return $err->("Invalid action $action");
|
||
|
|
}
|
||
|
|
|
||
|
|
$ret = {
|
||
|
|
%$ret,
|
||
|
|
pollid => $pollid,
|
||
|
|
pollqid => $pollqid,
|
||
|
|
userid => $userid,
|
||
|
|
page => $page,
|
||
|
|
};
|
||
|
|
|
||
|
|
$r->print( to_json($ret) );
|
||
|
|
|
||
|
|
return $r->OK;
|
||
|
|
}
|
||
|
|
|
||
|
|
sub pollvote_handler {
|
||
|
|
my $r = DW::Request->get;
|
||
|
|
my $args = $r->post_args;
|
||
|
|
|
||
|
|
my $ret = {};
|
||
|
|
|
||
|
|
my $err = sub {
|
||
|
|
my $msg = shift;
|
||
|
|
$r->print(
|
||
|
|
to_json(
|
||
|
|
{
|
||
|
|
error => "Error: $msg",
|
||
|
|
}
|
||
|
|
)
|
||
|
|
);
|
||
|
|
return $r->OK;
|
||
|
|
};
|
||
|
|
|
||
|
|
# Flatten multi-arg into comma seperated
|
||
|
|
my %values;
|
||
|
|
foreach my $key ( keys %$args ) {
|
||
|
|
$values{$key} = join( ",", $args->get_all($key) );
|
||
|
|
}
|
||
|
|
|
||
|
|
my $remote = LJ::get_remote();
|
||
|
|
|
||
|
|
my $pollid = $args->{pollid} or return $err->("No pollid");
|
||
|
|
|
||
|
|
my $poll = LJ::Poll->new($pollid);
|
||
|
|
|
||
|
|
unless ( $poll && $poll->valid ) {
|
||
|
|
return $err->("Poll not found");
|
||
|
|
}
|
||
|
|
|
||
|
|
my $u = $poll->journal;
|
||
|
|
|
||
|
|
# load the item being shown
|
||
|
|
my $entry = $poll->entry;
|
||
|
|
unless ($entry) {
|
||
|
|
return $err->("Post was deleted");
|
||
|
|
}
|
||
|
|
|
||
|
|
unless ( $entry->visible_to($remote) ) {
|
||
|
|
return $err->("You don't have the permissions to view this poll");
|
||
|
|
}
|
||
|
|
|
||
|
|
my $action = $args->{action};
|
||
|
|
|
||
|
|
if ( $action eq "vote" ) {
|
||
|
|
unless ( $r->did_post ) {
|
||
|
|
|
||
|
|
# I am not sure we can even get here
|
||
|
|
return $err->("Post is required");
|
||
|
|
}
|
||
|
|
|
||
|
|
unless ( LJ::check_form_auth( $args->{lj_form_auth} ) ) {
|
||
|
|
return $err->("Form is invalid; reload and try again");
|
||
|
|
}
|
||
|
|
|
||
|
|
my $error;
|
||
|
|
LJ::Poll->process_submission( \%values, \$error );
|
||
|
|
if ($error) {
|
||
|
|
return $err->($error);
|
||
|
|
}
|
||
|
|
|
||
|
|
$ret->{results_html} = $poll->render( mode => "results" );
|
||
|
|
|
||
|
|
$ret = { %$ret, pollid => $pollid };
|
||
|
|
|
||
|
|
}
|
||
|
|
elsif ( $action eq "change" ) {
|
||
|
|
$ret->{results_html} = $poll->render( mode => "enter" );
|
||
|
|
|
||
|
|
$ret = { %$ret, pollid => $pollid };
|
||
|
|
|
||
|
|
}
|
||
|
|
elsif ( $action eq "display" ) {
|
||
|
|
$ret->{results_html} = $poll->render( mode => "results" );
|
||
|
|
|
||
|
|
$ret = { %$ret, pollid => $pollid };
|
||
|
|
}
|
||
|
|
|
||
|
|
$r->print( to_json($ret) );
|
||
|
|
return $r->OK;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
1;
|