AUR Voting Application

Added support for TU voting through AUR

Signed-off-by: Callan Barrett <wizzomafizzo@gmail.com>
This commit is contained in:
Callan Barrett 2007-12-27 04:38:39 +09:00 committed by Dan McGee
parent 32b863203f
commit a8e574ef28
3 changed files with 531 additions and 0 deletions

View file

@ -210,3 +210,24 @@ CREATE TABLE CommentNotify (
FOREIGN KEY (UserID) REFERENCES Users(ID) ON DELETE CASCADE
);
-- Vote information
--
CREATE TABLE IF NOT EXISTS TU_VoteInfo (
ID int(10) unsigned NOT NULL auto_increment,
Agenda text collate latin1_general_ci NOT NULL,
User char(32) collate latin1_general_ci NOT NULL,
Submitted bigint(20) unsigned NOT NULL,
SubmitterID int(10) unsigned NOT NULL,
Yes tinyint(3) unsigned NOT NULL default '0',
No tinyint(3) unsigned NOT NULL default '0',
Abstain tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (ID)
)
-- Individual vote records
--
CREATE TABLE IF NOT EXISTS TU_Votes (
VoteID int(10) unsigned NOT NULL,
UserID int(10) unsigned NOT NULL
)

79
web/html/addvote.php Normal file
View file

@ -0,0 +1,79 @@
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '../lib' . PATH_SEPARATOR . '../lang');
include("pkgfuncs_po.inc");
include("aur.inc");
set_lang();
check_sid();
html_header();
if (isset($_COOKIE["AURSID"])) {
$atype = account_from_sid($_COOKIE["AURSID"]);
} else {
$atype = "";
}
if ($atype == "Trusted User" OR $atype == "Developer") {
$dbh = db_connect();
if (!empty($_POST['addVote'])) {
$aweek = 60*60*24*7;
$error = "";
if (!empty($_REQUEST['user'])) {
$qcheck = "SELECT * FROM Users WHERE Username = '" . mysql_real_escape_string($_REQUEST['user']) . "'";
$check = mysql_num_rows(db_query($qcheck, $dbh));
if ($check == 0) {
$error.= "<div style='color: red; font-weight: bold'>Username does not exist.</div>";
} else {
$qcheck = "SELECT * FROM TU_VoteInfo WHERE User = '" . mysql_real_escape_string($_REQUEST['user']) . "'";
$qcheck.= " AND Submitted + " . $aweek . " > UNIX_TIMESTAMP()";
$check = mysql_num_rows(db_query($qcheck, $dbh));
if ($check != 0) {
$error.= "<div style='color: red; font-weight: bold'>" . mysql_real_escape_string($_REQUEST['user']) . " already has proposal running for them.</div>";
}
}
}
if (empty($_REQUEST['agenda'])) {
$error.= "<div style='color: red; font-weight: bold'>Proposal cannot be empty.</div>";
}
}
if (!empty($_POST['addVote']) && empty($error)) {
$q = "INSERT INTO TU_VoteInfo (Agenda, User, Submitted, SubmitterID) VALUES ";
$q.= "('" . mysql_real_escape_string($_REQUEST['agenda']) . "', ";
$q.= "'" . mysql_real_escape_string($_REQUEST['user']) . "', ";
$q.= "UNIX_TIMESTAMP(), " . uid_from_sid($_COOKIE["AURSID"]) . ")";
db_query($q, $dbh);
print "<p>New proposal submitted.</p>\n";
} else {
?>
<p>Submit a proposal to vote on.</p>
<?php if (!empty($error)) { print $error . "<br />"; } ?>
<form action='addvote.php' method='post'>
<b>Applicant/TU:</b>
<input type='text' name='user' value='<?php if (!empty($_POST['user'])) { print htmlentities($_POST['user'], ENT_QUOTES); } ?>'>
(empty if not applicable)
<br />
<b>Proposal:</b><br />
<textarea name='agenda' rows='10' cols='50'><?php if (!empty($_POST['agenda'])) { print htmlentities($_POST['agenda']); } ?></textarea><br />
<input type='hidden' name='addVote' value='1'>
<input type='submit' class='button' value='Submit'>
</form>
<br />
<?php
}
print "<a href='tu.php'>Back</a>";
} else {
print "You are not allowed to access this area.\n";
}
html_footer(AUR_VERSION);
# vim: ts=2 sw=2 noet ft=php
?>

431
web/html/tu.php Normal file
View file

@ -0,0 +1,431 @@
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '../lib' . PATH_SEPARATOR . '../lang');
include("pkgfuncs_po.inc");
include("aur.inc");
set_lang();
check_sid();
html_header();
# get login privileges
#
if (isset($_COOKIE["AURSID"])) {
# Only logged in users can do stuff
#
$atype = account_from_sid($_COOKIE["AURSID"]);
} else {
$atype = "";
}
if ($atype == "Trusted User" OR $atype == "Developer") {
# Show the TU interface
#
# Temp value for results per page
$pp = 5;
# This needs to be changed for variable length votes I guess, TODO
$aweek = 60*60*24*7;
if (isset($_REQUEST['id'])) {
# Show application details
# depending on action and time frame will show either
# sponsor button, comments and vote buttons
#
if (intval($_REQUEST['id'])) {
$q = "SELECT * FROM TU_VoteInfo ";
$q.= "WHERE ID = " . $_REQUEST['id'];
$dbh = db_connect();
$results = db_query($q, $dbh);
$row = mysql_fetch_assoc($results);
if (empty($row)) {
print "Could not retrieve proposal details.\n";
} else {
# Print out application details, thanks again AUR
#
$isrunning = (($row['Submitted'] + $aweek) > time()) ? 1 : 0;
$qvoted = "SELECT * FROM TU_Votes WHERE ";
$qvoted.= "VoteID = " . $row['ID'] . " AND ";
$qvoted.= "UserID = " . uid_from_sid($_COOKIE["AURSID"]);
$hasvoted = mysql_num_rows(db_query($qvoted, $dbh));
# Can this person vote?
#
$canvote = 1; // we assume they can
$errorvote = ""; // error message to give
if ($isrunning == 0) {
$canvote = 0;
$errorvote = "Voting is closed for this proposal.";
} else if ($row['User'] == username_from_sid($_COOKIE["AURSID"])) {
$canvote = 0;
$errorvote = "You cannot vote in an proposal regarding you.";
} else if ($hasvoted != 0) {
$canvote = 0;
$errorvote = "You've already voted in this proposal.";
}
# have to put this here so results are correct immediately after voting
if ($canvote == 1) {
if (isset($_POST['doVote'])) {
if (isset($_POST['voteYes'])) {
$myvote = "Yes";
} else if (isset($_POST['voteNo'])) {
$myvote = "No";
} else if (isset($_POST['voteAbstain'])) {
$myvote = "Abstain";
}
$qvote = "UPDATE TU_VoteInfo SET " . $myvote . " = " . ($row[$myvote] + 1) . " WHERE ID = " . $row['ID'];
db_query($qvote, $dbh);
$qvote = "INSERT INTO TU_Votes (VoteID, UserID) VALUES (" . $row['ID'] . ", " . uid_from_sid($_COOKIE["AURSID"]) . ")";
db_query($qvote, $dbh);
# Can't vote anymore
#
$canvote = 0;
$errorvote = "You've already voted for this proposal.";
# Update if they voted
$hasvoted = mysql_num_rows(db_query($qvoted, $dbh));
$results = db_query($q, $dbh);
$row = mysql_fetch_assoc($results);
}
}
echo "<div class=\"pgbox\">\n";
echo " <div class=\"pgboxtitle\"><span class=\"f3\">Proposal Details</span></div>\n";
echo " <div class=\"pgboxbody\">\n";
if ($isrunning == 1) {
print "<div style='text-align: center; font-weight: bold; color: red'>This vote is still running.</div>";
print "<br />";
}
print "User: <b>";
if (!empty($row['User'])) {
print "<a href='packages.php?K=" . $row['User'] . "&SeB=m'>" . $row['User'] . "</a>";
} else {
print "N/A";
}
print "</b><br />\n";
print "Submitted: <b>" . gmdate("r", $row['Submitted']) . "</b> by ";
print "<b>" . username_from_id($row['SubmitterID']) . "</b><br />\n";
print "<br />\n";
$row['Agenda'] = htmlentities($row['Agenda']);
# str_replace seems better than <pre> because it still maintains word wrapping
print str_replace("\n", "<br />\n", $row['Agenda']);
print "<br />\n";
print "<br />\n";
print "<center>\n";
print "<table cellspacing='3' class='boxSoft' style='width: 50%'>\n";
print "</tr>\n";
print "<tr>\n";
print " <td class='boxSoft'>\n";
print "<table width='100%' cellspacing='0' cellpadding='2'>\n";
print "<tr>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Yes";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "No";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Abstain";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Total";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Voted?";
print "</span></th>\n";
print "</tr>\n";
$c = "data1";
print "<tr>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print $row['Yes'];
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print $row['No'];
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print $row['Abstain'];
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print ($row['Yes'] + $row['No'] + $row['Abstain']);
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
if ($hasvoted == 0) {
print "<span style='color: red; font-weight: bold'>No</span>";
} else {
print "<span style='color: green; font-weight: bold'>Yes</span>";
}
print "</span></span></td>\n";
print "</tr>\n";
print "</table>\n";
print "</table>\n";
echo "</div></div>\n";
# Actions, vote buttons
#
print "<br />\n";
print "<div class='pgbox'>\n";
print "<div class='pgboxtitle'><span class='f3'>Vote Actions</span></div>\n";
print "<div class='pgboxbody'>\n";
if ($canvote == 1) {
print "<center><form action='tu.php?id=" . $row['ID'] . "' method='post'>\n";
print "<input type='submit' class='button' name='voteYes' value='Yes'>\n";
print "<input type='submit' class='button' name='voteNo' value='No'>\n";
print "<input type='submit' class='button' name='voteAbstain' value='Abstain'>\n";
print "<input type='hidden' name='doVote' value='1'>\n";
print "</form></center>\n";
} else {
print "<center>$errorvote</center>";
}
print "</div></div>\n";
print "<br /><center><a href='tu.php'>Back</a></center>\n";
}
} else {
print "Vote ID not valid.\n";
}
} else {
# page listing applications being discussed, voted on and all those finished
#
# I guess there should be a function since I use this a few times
function gen_results($offset, $limit, $sort, $by, $type="normal") {
$dbh = db_connect();
$aweek = 60*60*24*7;
if (!empty($offset) AND is_numeric($offset)) {
if ($offset >= 1) {
$off = $offset;
} else {
$off = 0;
}
} else {
$off = 0;
}
$q = "SELECT * FROM TU_VoteInfo";
if ($type == "new") {
$q.= " WHERE Submitted + " . $aweek . " > " . time();
$application = "Current Votes";
} else {
$q.= " WHERE Submitted + " . $aweek . " < " . time();
$application = "Old Votes";
}
$order = ($by == 'down') ? 'DESC' : 'ASC';
# not much to sort, I'm unsure how to sort by username
# when we only store the userid, someone come up with a nifty
# way to do this
#
switch ($sort) {
case 'sub':
$q.= " ORDER BY Submitted $order";
break;
default:
$q.= " ORDER BY Submitted $order";
break;
}
if ($limit != 0) {
$q.= " LIMIT " . $off . ", ". $limit;
}
$result = db_query($q, $dbh);
if ($by == "down") {
$by_next = "up";
} else {
$by_next = "down";
}
print "<center>\n";
print "<table cellspacing='3' class='boxSoft'>\n";
print "<tr>\n";
print " <td class='boxSoftTitle' align='right'>\n";
print " <span class='f3'>$application</span>\n";
print " </td>\n";
print "</tr>\n";
print "<tr>\n";
print " <td class='boxSoft'>\n";
print "<table width='100%' cellspacing='0' cellpadding='2'>\n";
print "<tr>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Proposal";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "<a href='?off=$off&sort=sub&by=$by_next'>Submitted</a>";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "User";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Yes";
print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "No";
print "</span></th>\n";
# I'm not sure if abstains are necessary inthis view, it's just extra clutter
# print " <th style='border-bottom: #666 1px solid; vertical-align:";
# print " bottom'><span class='f2'>";
# print "Abstain";
# print "</span></th>\n";
print " <th style='border-bottom: #666 1px solid; vertical-align:";
print " bottom'><span class='f2'>";
print "Voted?";
print "</span></th>\n";
print "</tr>\n";
if (mysql_num_rows($result) == 0) {
print "<tr><td align='center' colspan='0'>No results found.</td></tr>\n";
} else {
for ($i = 0; $row = mysql_fetch_assoc($result); $i++) {
# Thankyou AUR
(($i % 2) == 0) ? $c = "data1" : $c = "data2";
print "<tr>\n";
print " <td class='".$c."'><span class='f4'><span class='blue'>";
$prev_Len = 100;
if (strlen($row["Agenda"]) >= $prev_Len) {
$row["Agenda"] = htmlentities(substr($row["Agenda"], 0, $prev_Len)) . "...";
} else {
$row["Agenda"] = htmlentities($row["Agenda"]);
}
print $row["Agenda"];
print " <a href='/tu.php?id=" . $row['ID'] . "'>[More]</a>";
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print gmdate("r", intval($row["Submitted"]));
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f6'><span class='blue'>";
if (!empty($row['User'])) {
print "<a href='packages.php?K=" . $row['User'] . "&SeB=m'>";
print $row['User'] . "</a>";
} else {
print "N/A";
}
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print $row['Yes'];
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
print $row['No'];
print "</span></span></td>\n";
print " <td class='".$c."'><span class='f5'><span class='blue'>";
# See above
# print $row['Abstain'];
# print "</span></span></td>\n";
# print " <td class='".$c."'><span class='f5'><span class='blue'>";
$qvoted = "SELECT * FROM TU_Votes WHERE ";
$qvoted.= "VoteID = " . $row['ID'] . " AND ";
$qvoted.= "UserID = " . uid_from_sid($_COOKIE["AURSID"]);
$hasvoted = mysql_num_rows(db_query($qvoted, $dbh));
if ($hasvoted == 0) {
print "<span style='color: red; font-weight: bold'>No</span>";
} else {
print "<span style='color: green; font-weight: bold'>Yes</span>";
}
print "</span></span></td>\n";
print "</tr>\n";
}
}
print "</table>\n";
print "</table>\n";
if ($type == "old" AND $limit != 0) {
$qnext = "SELECT ID FROM TU_VoteInfo";
$nextresult = db_query($qnext, $dbh);
print "<table style='width: 90%'>\n";
if (mysql_num_rows($result)) {
$sort = htmlentities($sort, ENT_QUOTES);
$by = htmlentities($by, ENT_QUOTES);
print "<tr>\n";
print "<td align='left'>\n";
if ($off != 0) {
$back = (($off - $limit) <= 0) ? 0 : $off - $limit;
print "<a href='tu.php?off=$back&sort=" . $sort . "&by=" . $by . "'>Back</a>";
}
print "</td>\n";
print "<td align='right'>\n";
if (($off + $limit) < mysql_num_rows($nextresult)) {
$forw = $off + $limit;
print "<a href='tu.php?off=$forw&sort=" . $sort . "&by=" . $by . "'>Next</a>";
}
print "</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
print "</center>\n";
}
# stop notices, ythanku Xilon
if (empty($_REQUEST['sort'])) { $_REQUEST['sort'] = ""; }
if (empty($_REQUEST['by'])) { $_REQUEST['by'] = ""; }
if (empty($_REQUEST['off'])) { $_REQUEST['off'] = ""; }
gen_results(0, 0, $_REQUEST['sort'], $_REQUEST['by'], "new");
print "<center><a href='addvote.php'>Add</a></center><br />";
gen_results($_REQUEST['off'], $pp, $_REQUEST['sort'], $_REQUEST['by'], "old");
}
} else {
print "You are not allowed to access this area.\n";
}
html_footer(AUR_VERSION);
# vim: ts=2 sw=2
?>