Allow poll results to be anonymized, so that no one can see the 
username that cast each vote. Instead, an automatically generated identifier 
will be used (so that it's possible to identify the votes that were cast per 
set)

        Patch by jportela. 

diffs (311 lines):

diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c bin/upgrading/en.dat
--- a/bin/upgrading/en.dat      Tue Sep 07 11:19:36 2010 +0800
+++ b/bin/upgrading/en.dat      Tue Sep 07 15:28:41 2010 +0800
@@ -2381,6 +2381,8 @@ poll.error.whoview=whoview must be 'all'
 
 poll.error.whovote=whovote must be 'all' or 'friends'.
 
+poll.isanonymous=This poll is anonymous.
+
 poll.isclosed=This poll is closed.
 
 poll.participants=, participants: [[total]]
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c bin/upgrading/update-db-general.pl
--- a/bin/upgrading/update-db-general.pl        Tue Sep 07 11:19:36 2010 +0800
+++ b/bin/upgrading/update-db-general.pl        Tue Sep 07 15:28:41 2010 +0800
@@ -3889,6 +3889,11 @@ EOF
          do_alter( 'moods',
                     q{ALTER TABLE moods ADD COLUMN weight tinyint unsigned 
default NULL} );
      }
+
+     unless ( column_type( 'poll2', 'isanon' ) ) {
+         do_alter( 'poll2',
+                   "ALTER TABLE poll2 ADD COLUMN isanon enum('yes','no') NOT 
NULL default 'no'");
+     }
 });
 
 
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c cgi-bin/LJ/Event/PollVote.pm
--- a/cgi-bin/LJ/Event/PollVote.pm      Tue Sep 07 11:19:36 2010 +0800
+++ b/cgi-bin/LJ/Event/PollVote.pm      Tue Sep 07 15:28:41 2010 +0800
@@ -68,21 +68,23 @@ sub pollname {
 
 sub as_string {
     my $self = shift;
+    
+    my $voter = ($self->poll->isanon eq "yes") ? "Anonymous user" : 
$self->voter->display_username;
     return sprintf("%s has voted in %s at %s",
-                   $self->voter->display_username, $self->pollname, 
$self->entry->url);
+                   $voter, $self->pollname, $self->entry->url);
 }
 
 sub as_html {
     my $self = shift;
-    my $voter = $self->voter;
+    my $voter = ($self->poll->isanon eq "yes") ? "Anonymous user" : 
$self->voter->ljuser_display;
     my $poll = $self->poll;
 
-    return sprintf("%s has voted in a deleted poll", $voter->ljuser_display)
+    return sprintf("%s has voted in a deleted poll", $voter)
         unless $poll && $poll->valid;
 
     my $entry = $self->entry;
     return sprintf("%s has voted <a href='%s'>in %s</a>",
-                   $voter->ljuser_display, $entry->url, $self->pollname);
+                   $voter, $entry->url, $self->pollname);
 }
 
 sub as_html_actions {
@@ -122,10 +124,11 @@ sub as_email_subject {
 
 sub _as_email {
     my ($self, $u, $is_html) = @_;
+    my $voter = $is_html ? ($self->voter->ljuser_display) : 
($self->voter->display_username);
 
     my $vars = {
         user     => $is_html ? ($u->ljuser_display) : ($u->display_username),
-        voter    => $is_html ? ($self->voter->ljuser_display) : 
($self->voter->display_username),
+        voter    => ($self->poll->isanon eq "yes") ? "Anonymous user" : $voter,
         pollname => $self->pollname,
     };
 
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c cgi-bin/LJ/Poll.pm
--- a/cgi-bin/LJ/Poll.pm        Tue Sep 07 11:19:36 2010 +0800
+++ b/cgi-bin/LJ/Poll.pm        Tue Sep 07 15:28:41 2010 +0800
@@ -28,9 +28,9 @@ sub _memcache_stored_props          {
 sub _memcache_stored_props          {
     # first element of props is a VERSION
     # next - allowed object properties
-    return qw/ 1
+    return qw/ 2
                ditemid itemid
-               pollid journalid posterid whovote whoview name status questions 
props
+               pollid journalid posterid isanon whovote whoview name status 
questions props
                /;
 }
     *_memcache_hashref_to_object    = \*absorb_row;
@@ -78,7 +78,8 @@ sub create {
         $journalid = $opts{journalid} or croak "No journalid";
         $posterid  = $opts{posterid} or croak "No posterid";
     }
-
+    
+    my $isanon = $opts{isanon} or croak "No isanon";
     my $whovote = $opts{whovote} or croak "No whovote";
     my $whoview = $opts{whoview} or croak "No whoview";
     my $name    = $opts{name} || '';
@@ -98,9 +99,9 @@ sub create {
 
     my $dbh = LJ::get_db_writer();
 
-    $u->do( "INSERT INTO poll2 (journalid, pollid, posterid, whovote, whoview, 
name, ditemid) " .
-            "VALUES (?, ?, ?, ?, ?, ?, ?)", undef,
-            $journalid, $pollid, $posterid, $whovote, $whoview, $name, 
$ditemid );
+    $u->do( "INSERT INTO poll2 (journalid, pollid, posterid, isanon, whovote, 
whoview, name, ditemid) " .
+            "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", undef,
+            $journalid, $pollid, $posterid, $isanon, $whovote, $whoview, 
$name, $ditemid );
     die $u->errstr if $u->err;
 
     # made poll, insert global pollid->journalid mapping into global pollowner 
map
@@ -252,6 +253,7 @@ sub new_from_html {
                 $popts{'questions'} = [];
 
                 $popts{'name'} = $opts->{'name'};
+                $popts{'isanon'} = $opts->{'isanon'} || "no";
                 $popts{'whovote'} = lc($opts->{'whovote'}) || "all";
                 $popts{'whoview'} = lc($opts->{'whoview'}) || "all";
 
@@ -267,7 +269,9 @@ sub new_from_html {
                     $popts{props}->{createdate} = $opts->{createdate} || undef;
                 }
                 LJ::Hooks::run_hook('get_more_options_from_poll', finalopts => 
\%popts, givenopts => $opts, journalu => $journal);
-
+                
+                $popts{'isanon'} = "no" unless ($popts{'isanon'} eq "yes");
+                
                 if ($popts{'whovote'} ne "all" &&
                     $popts{'whovote'} ne "trusted")
                 {
@@ -529,7 +533,7 @@ sub save_to_db {
     $createopts{name} = $opts{name} || $self->{name};
     $createopts{props} = $opts{props} || $self->{props};
 
-    foreach my $f (qw(ditemid journalid posterid questions whovote whoview)) {
+    foreach my $f (qw(ditemid journalid posterid questions isanon whovote 
whoview)) {
         $createopts{$f} = $opts{$f} || $self->{$f} or croak "Field $f required 
for save_to_db";
     }
 
@@ -567,7 +571,7 @@ sub _load {
         or die "Invalid journalid $journalid";
 
     $row = $u->selectrow_hashref( "SELECT pollid, journalid, ditemid, " .
-                                  "posterid, whovote, whoview, name, status " .
+                                  "posterid, isanon, whovote, whoview, name, 
status " .
                                   "FROM poll2 WHERE pollid=? " .
                                   "AND journalid=?", undef, $self->pollid, 
$journalid );
     die $u->errstr if $u->err;
@@ -590,7 +594,7 @@ sub absorb_row {
 
     # questions is an optional field for creating a fake poll object for 
previewing
     $self->{ditemid} = $row->{ditemid} || $row->{itemid}; # renamed to ditemid 
in poll2
-    $self->{$_} = $row->{$_} foreach qw(pollid journalid posterid whovote 
whoview name status questions props);
+    $self->{$_} = $row->{$_} foreach qw(pollid journalid posterid isanon 
whovote whoview name status questions props);
     $self->{_loaded} = 1;
     return $self;
 }
@@ -652,6 +656,11 @@ sub name {
     my $self = shift;
     $self->_load;
     return $self->{name};
+}
+sub isanon {
+    my $self = shift;
+    $self->_load;
+    return $self->{isanon};
 }
 sub whovote {
     my $self = shift;
@@ -774,6 +783,9 @@ sub preview {
 
     $ret .= "<br />\n";
 
+    $ret .= "This poll is <b>anonymous</b><br/>\n"
+        if ($self->isanon eq "yes");
+
     my $whoview = $self->whoview eq "none" ? "none_remote" : $self->whoview;
     $ret .= LJ::Lang::ml('poll.security2', { 'whovote' => 
LJ::Lang::ml('poll.security.'.$self->whovote), 'whoview' => 
LJ::Lang::ml('poll.security.'.$whoview), });
 
@@ -857,7 +869,7 @@ sub render {
         my $text = $q->text;
         LJ::Poll->clean_poll(\$text);
         $ret .= $text;
-        $ret .= '<div>' . $q->answers_as_html($self->journalid, $page, 
$pagesize) . '</div>';
+        $ret .= '<div>' . $q->answers_as_html($self->journalid, $self->isanon, 
$page, $pagesize) . '</div>';
         return $ret;
     }
 
@@ -897,6 +909,9 @@ sub render {
     $ret .= "<span style='font-family: monospace; font-weight: bold; 
font-size: 1.2em;'>" .
             LJ::Lang::ml( 'poll.isclosed' ) . "</span><br />\n"
         if ($self->is_closed);
+    
+    $ret .= "This poll is <b>anonymous</b><br/>\n"
+        if ($self->isanon eq "yes");
 
     my $whoview = $self->whoview;
     if ($whoview eq "none") {
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c cgi-bin/LJ/Poll/Question.pm
--- a/cgi-bin/LJ/Poll/Question.pm       Tue Sep 07 11:19:36 2010 +0800
+++ b/cgi-bin/LJ/Poll/Question.pm       Tue Sep 07 15:28:41 2010 +0800
@@ -219,6 +219,7 @@ sub answers_as_html {
 sub answers_as_html {
     my $self = shift;
     my $jid = shift;
+    my $isanon = shift;
 
     my $page     =  shift || 1;
     my $pagesize =  shift || 2000;
@@ -236,6 +237,7 @@ sub answers_as_html {
             "WHERE pr.pollid=? AND pollqid=? " .
             "AND ps.pollid=pr.pollid AND ps.userid=pr.userid " .
             "AND ps.journalid=? ".
+            "ORDER BY ps.datesubmit " .
             "LIMIT $LIMIT" );
     $sth->execute( $self->pollid, $self->pollqid, $jid );
     die $sth->errstr if $sth->err;
@@ -245,7 +247,8 @@ sub answers_as_html {
     my @res;
     push @res, $_ while $_ = $sth->fetchrow_hashref;
     @res = sort { $a->{datesubmit} cmp $b->{datesubmit} } @res;
-
+    
+    my $user_i = 0;    #incrementer for user anonymous ids
     foreach my $res (@res) {
         my ($userid, $value) = ($res->{userid}, $res->{value}, 
$res->{pollqid});
         my @items = $self->items;
@@ -263,7 +266,9 @@ sub answers_as_html {
         }
 
         LJ::Poll->clean_poll(\$value);
-        $ret .= "<div>" . $u->ljuser_display . " -- $value</div>\n";
+        my $user_display = $isanon eq "yes" ? "User <b>#" . ++$user_i . "</b>" 
: $u->ljuser_display;
+
+        $ret .= "<div>" . $user_display . " -- $value</div>\n";
     }
 
     return $ret;
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c htdocs/poll/create.bml
--- a/htdocs/poll/create.bml    Tue Sep 07 11:19:36 2010 +0800
+++ b/htdocs/poll/create.bml    Tue Sep 07 15:28:41 2010 +0800
@@ -146,6 +146,7 @@ _c?>
         my $poll = {
             "name" => "",
             "count" => "0",
+            "isanon" => "no",
             "whoview" => "all",
             "whovote" => "all",
             "pq" => [],
@@ -157,7 +158,7 @@ _c?>
             if $POST{'count'} > $RULES{'elements'}->{'max'};
 
         # form properties
-        foreach my $it (qw(count name whoview whovote)) {
+        foreach my $it (qw(count name isanon whoview whovote)) {
             $poll->{$it} = $POST{$it} if $POST{$it};
         }
 
@@ -403,11 +404,20 @@ _c?>
         $ret .= "<div style='margin: 10px 0 20px 
40px'><b>$ML{'.haserrors'}</b></div>\n"
             if %$err;
 
-        ### Poll Properties -- name, whovote, whoview
+        ### Poll Properties -- name, isanon, whovote, whoview
 
         $ret .= "<?h1 $ML{'.properties'} h1?>\n";
 
         $ret .= "<div style='margin-left: 40px; margin-bottom: 20px'>\n";
+        
+        $ret .= "<p>" . LJ::html_check({
+            name => 'isanon',
+            id => 'isanon',
+            label => $ML{'.isanon'}, 
+            value => "yes",
+            selected => ( $poll->{isanon} eq "yes" )
+        }) . "</p>\n";
+        
         $ret .= "<p>$ML{'.whoview2'}<br /><select name='whoview'>\n";
         foreach my $sec ( qw(all trusted none) ) {
             $ret .= "<option value='$sec'";
@@ -576,7 +586,7 @@ _c?>
             my $ret;
 
             # start out the tag
-            $ret .= "<poll name='" . LJ::ehtml($poll->{'name'}) . "' 
whovote='" . LJ::ehtml($poll->{'whovote'}) . "' whoview='" . 
LJ::ehtml($poll->{'whoview'}) . "'>\n";
+            $ret .= "<poll name='" . LJ::ehtml($poll->{'name'}) . "' isanon='" 
. $poll->{'isanon'} . "' whovote='" . LJ::ehtml($poll->{'whovote'}) . "' 
whoview='" . LJ::ehtml($poll->{'whoview'}) . "'>\n";
 
             # go through and make <poll-question> tags
             foreach my $q (0..$poll->{'count'}-1) {
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c htdocs/poll/create.bml.text
--- a/htdocs/poll/create.bml.text       Tue Sep 07 11:19:36 2010 +0800
+++ b/htdocs/poll/create.bml.text       Tue Sep 07 15:28:41 2010 +0800
@@ -39,6 +39,8 @@
 
 .insertquestion=Insert question here:
 
+.isanon=Anonymize poll results. No one can see who voted, not even you.
+
 .options=Options:
 
 .options.limitreached=Option limit reached
diff -r 7f28d1bf7c09 -r 4fcdfd9c7c1c htdocs/tools/endpoints/poll.bml
--- a/htdocs/tools/endpoints/poll.bml   Tue Sep 07 11:19:36 2010 +0800
+++ b/htdocs/tools/endpoints/poll.bml   Tue Sep 07 15:28:41 2010 +0800
@@ -49,7 +49,7 @@ _c?>
         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, 
$page, $pagesize, $pages);
+        $ret->{answer_html} = $question->answers_as_html($poll->journalid, 
$poll->isanon, $page, $pagesize, $pages);
     } else {
         return $err->("Invalid action $action");
     }
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to