From 3b53b9f05ee1543df57034d5c74a1c2b3dffc9d5 Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Sun, 17 Apr 2005 00:17:04 +0000 Subject: =?UTF-8?q?Bug=20290511:=20Move=20RemoveVotes()=20out=20of=20globa?= =?UTF-8?q?ls.pl=20-=20Patch=20by=20Fr=C3=A9d=C3=A9ric=20Buclin=20=20r=3Dmkanat=20a=3Djustdave?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bugzilla/Bug.pm | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- editproducts.cgi | 1 + globals.pl | 88 --------------------------------------------------- 3 files changed, 95 insertions(+), 90 deletions(-) diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 8accc452c..962b1de42 100755 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -38,6 +38,7 @@ use CGI::Carp qw(fatalsToBrowser); use Bugzilla; use Bugzilla::Attachment; +use Bugzilla::BugMail; use Bugzilla::Config; use Bugzilla::Constants; use Bugzilla::Flag; @@ -48,9 +49,9 @@ use Bugzilla::Error; use base qw(Exporter); @Bugzilla::Bug::EXPORT = qw( - AppendComment + AppendComment ValidateComment bug_alias_to_id - ValidateComment + RemoveVotes ); use constant MAX_COMMENT_LENGTH => 65535; @@ -835,6 +836,97 @@ sub ValidateComment ($) { } } +# If a bug is moved to a product which allows less votes per bug +# compared to the previous product, extra votes need to be removed. +sub RemoveVotes { + my ($id, $who, $reason) = (@_); + my $dbh = Bugzilla->dbh; + + my $whopart = ($who) ? " AND votes.who = $who" : ""; + + my $sth = $dbh->prepare("SELECT profiles.login_name, " . + "profiles.userid, votes.vote_count, " . + "products.votesperuser, products.maxvotesperbug " . + "FROM profiles " . + "LEFT JOIN votes ON profiles.userid = votes.who " . + "LEFT JOIN bugs USING(bug_id) " . + "LEFT JOIN products ON products.id = bugs.product_id " . + "WHERE votes.bug_id = ? " . $whopart); + $sth->execute($id); + my @list; + while (my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = $sth->fetchrow_array()) { + push(@list, [$name, $userid, $oldvotes, $votesperuser, $maxvotesperbug]); + } + if (scalar(@list)) { + foreach my $ref (@list) { + my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = (@$ref); + my $s; + + $maxvotesperbug = min($votesperuser, $maxvotesperbug); + + # If this product allows voting and the user's votes are in + # the acceptable range, then don't do anything. + next if $votesperuser && $oldvotes <= $maxvotesperbug; + + # If the user has more votes on this bug than this product + # allows, then reduce the number of votes so it fits + my $newvotes = $maxvotesperbug; + + my $removedvotes = $oldvotes - $newvotes; + + $s = ($oldvotes == 1) ? "" : "s"; + my $oldvotestext = "You had $oldvotes vote$s on this bug."; + + $s = ($removedvotes == 1) ? "" : "s"; + my $removedvotestext = "You had $removedvotes vote$s removed from this bug."; + + my $newvotestext; + if ($newvotes) { + $dbh->do("UPDATE votes SET vote_count = ? " . + "WHERE bug_id = ? AND who = ?", + undef, ($newvotes, $id, $userid)); + $s = $newvotes == 1 ? "" : "s"; + $newvotestext = "You still have $newvotes vote$s on this bug." + } else { + $dbh->do("DELETE FROM votes WHERE bug_id = ? AND who = ?", + undef, ($id, $userid)); + $newvotestext = "You have no more votes remaining on this bug."; + } + + # Notice that we did not make sure that the user fit within the $votesperuser + # range. This is considered to be an acceptable alternative to losing votes + # during product moves. Then next time the user attempts to change their votes, + # they will be forced to fit within the $votesperuser limit. + + # Now lets send the e-mail to alert the user to the fact that their votes have + # been reduced or removed. + my %substs; + + $substs{"to"} = $name . Param('emailsuffix'); + $substs{"bugid"} = $id; + $substs{"reason"} = $reason; + + $substs{"votesremoved"} = $removedvotes; + $substs{"votesold"} = $oldvotes; + $substs{"votesnew"} = $newvotes; + + $substs{"votesremovedtext"} = $removedvotestext; + $substs{"votesoldtext"} = $oldvotestext; + $substs{"votesnewtext"} = $newvotestext; + + $substs{"count"} = $removedvotes . "\n " . $newvotestext; + + my $msg = PerformSubsts(Param("voteremovedmail"), \%substs); + Bugzilla::BugMail::MessageToMTA($msg); + } + my $votes = $dbh->selectrow_array("SELECT SUM(vote_count) " . + "FROM votes WHERE bug_id = ?", + undef, $id) || 0; + $dbh->do("UPDATE bugs SET votes = ? WHERE bug_id = ?", + undef, ($votes, $id)); + } +} + sub AUTOLOAD { use vars qw($AUTOLOAD); my $attr = $AUTOLOAD; diff --git a/editproducts.cgi b/editproducts.cgi index fdc70aefb..ac54ab517 100755 --- a/editproducts.cgi +++ b/editproducts.cgi @@ -35,6 +35,7 @@ use vars qw ($template $vars); use Bugzilla::Constants; require "CGI.pl"; require "globals.pl"; +use Bugzilla::Bug; use Bugzilla::Series; use Bugzilla::User; use Bugzilla::Config qw(:DEFAULT $datadir); diff --git a/globals.pl b/globals.pl index a9c3a36ce..d33319e98 100644 --- a/globals.pl +++ b/globals.pl @@ -1040,94 +1040,6 @@ sub OpenStates { } -sub RemoveVotes { - my ($id, $who, $reason) = (@_); - my $whopart = ""; - if ($who) { - $whopart = " AND votes.who = $who"; - } - SendSQL("SELECT profiles.login_name, profiles.userid, votes.vote_count, " . - "products.votesperuser, products.maxvotesperbug " . - "FROM profiles " . - "LEFT JOIN votes ON profiles.userid = votes.who " . - "LEFT JOIN bugs USING(bug_id) " . - "LEFT JOIN products ON products.id = bugs.product_id " . - "WHERE votes.bug_id = $id " . - $whopart); - my @list; - while (MoreSQLData()) { - my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = (FetchSQLData()); - push(@list, [$name, $userid, $oldvotes, $votesperuser, $maxvotesperbug]); - } - if (0 < @list) { - foreach my $ref (@list) { - my ($name, $userid, $oldvotes, $votesperuser, $maxvotesperbug) = (@$ref); - my $s; - - $maxvotesperbug = $votesperuser if ($votesperuser < $maxvotesperbug); - - # If this product allows voting and the user's votes are in - # the acceptable range, then don't do anything. - next if $votesperuser && $oldvotes <= $maxvotesperbug; - - # If the user has more votes on this bug than this product - # allows, then reduce the number of votes so it fits - my $newvotes = $votesperuser ? $maxvotesperbug : 0; - - my $removedvotes = $oldvotes - $newvotes; - - $s = $oldvotes == 1 ? "" : "s"; - my $oldvotestext = "You had $oldvotes vote$s on this bug."; - - $s = $removedvotes == 1 ? "" : "s"; - my $removedvotestext = "You had $removedvotes vote$s removed from this bug."; - - my $newvotestext; - if ($newvotes) { - SendSQL("UPDATE votes SET vote_count = $newvotes " . - "WHERE bug_id = $id AND who = $userid"); - $s = $newvotes == 1 ? "" : "s"; - $newvotestext = "You still have $newvotes vote$s on this bug." - } else { - SendSQL("DELETE FROM votes WHERE bug_id = $id AND who = $userid"); - $newvotestext = "You have no more votes remaining on this bug."; - } - - # Notice that we did not make sure that the user fit within the $votesperuser - # range. This is considered to be an acceptable alternative to losing votes - # during product moves. Then next time the user attempts to change their votes, - # they will be forced to fit within the $votesperuser limit. - - # Now lets send the e-mail to alert the user to the fact that their votes have - # been reduced or removed. - my %substs; - - $substs{"to"} = $name . Param('emailsuffix'); - $substs{"bugid"} = $id; - $substs{"reason"} = $reason; - - $substs{"votesremoved"} = $removedvotes; - $substs{"votesold"} = $oldvotes; - $substs{"votesnew"} = $newvotes; - - $substs{"votesremovedtext"} = $removedvotestext; - $substs{"votesoldtext"} = $oldvotestext; - $substs{"votesnewtext"} = $newvotestext; - - $substs{"count"} = $removedvotes . "\n " . $newvotestext; - - my $msg = PerformSubsts(Param("voteremovedmail"), - \%substs); - - Bugzilla::BugMail::MessageToMTA($msg); - } - SendSQL("SELECT SUM(vote_count) FROM votes WHERE bug_id = $id"); - my $v = FetchOneColumn(); - $v ||= 0; - SendSQL("UPDATE bugs SET votes = $v WHERE bug_id = $id"); - } -} - ############################################################################### # Constructs a format object from URL parameters. You most commonly call it -- cgit v1.2.1