iUserId = $oRow->userId;
$this->iVoteId = $oRow->id;
$this->iSlotIndex = $oRow->slot;
$this->iVersionId = $oRow->versionId;
}
}
public function update()
{
/* Check for valid vote slot index */
if($this->iSlotIndex < 1 || $this->iSlotIndex > MAX_VOTES)
return;
/* Avoid pointless votes */
if(!$this->iVersionId)
return;
if(!$this->iVoteId)
{
$hResult = query_parameters("INSERT INTO appVotes (versionId,userId,slot) VALUES('?','?','?')",
$this->iVersionId, $_SESSION['current']->iUserId, $this->iSlotIndex);
} else
{
$hResult = query_parameters("UPDATE appVotes SET versionId = '?' WHERE id = '?'", $this->iVersionId, $this->iVoteId);
}
if(!$hResult)
return FALSE;
return TRUE;
}
public function delete()
{
/* A vote needs to have a versionId, so if it doesn't that means it is not in the
database or it was not selected in the vote editor */
if(!$this->iVersionId)
return TRUE;
$hResult = query_parameters("DELETE FROM appVotes WHERE id = '?'", $this->iVoteId);
if(!$hResult)
return FALSE;
return TRUE;
}
public function getVotesForVersion($iVersionId)
{
$aRet = array();
$hResult = query_parameters("SELECT * FROM appVotes WHERE versionId = '?'",
$iVersionId);
if(!$hResult)
return $aRet;
while($oRow = mysql_fetch_object($hResult))
$aRet[] = new vote(null, $oRow);
return $aRet;
}
public function objectGetId()
{
return $this->iVoteId;
}
public function objectGetSubmitterId()
{
return $this->iUserId;
}
public function objectGetParent($sClass = '')
{
return new version($this->iVersionId);
}
public function objectSetParent($iNewId, $sClass = '')
{
$this->iVersionId = $iNewId;
}
public function canEdit()
{
if($_SESSION['current']->iUserId == $this->iUserId)
return true;
$oVersion = new version($this->iVersionId);
return $oVersion->canEdit();
}
function objectGetMail($sAction, $bMailSubmitter, $bParentAction)
{
return array(null, null, null); /* No mail */
}
public static function objectGetMailOptions($sAction, $bMailSubmitter,
$bParentAction)
{
return new mailOptions();
}
}
class voteManager
{
private $iUserId;
private $aVotes;
public function voteManager($iUserId = null, $oRow = null)
{
$this->iUserId = $iUserId;
}
public function objectGetCustomVars($sAction)
{
switch($sAction)
{
case "edit":
return array("iVersionId");
break;
default:
return null;
}
}
public function outputEditor($aClean = null)
{
echo "The following shows your current votes. Check the boxes next to the apps you wish to replace with a vote for ".version::fullNameLink($aClean['iVersionId'])." or delete.";
$oTable = new table();
$this->aVotes = $this->getVotes();
for($i = 0; $i < MAX_VOTES; $i++)
{
$sVersionText = $this->aVotes[$i]->iVersionId ? version::fullNameLink($this->aVotes[$i]->iVersionId) : "No app selected";
$oTableRow = new tableRow();
$oTableRow->addTextCell('');
$oTableRow->addTextCell($sVersionText);
$oTable->addRow($oTableRow);
}
echo $oTable->getString();
}
public function canEdit()
{
if($_SESSION['current']->iUserId == $this->iUserId)
return TRUE;
return FALSE;
}
function objectGetMail($sAction, $bMailSubmitter, $bParentAction)
{
return array(null, null, null); /* No mail */
}
public function mustBeQueued()
{
return FALSE;
}
public function objectGetEntries($bQueued, $bRejected)
{
return query_parameters("SELECT * FROM appVotes");
}
public function objectGetId()
{
return $this->iUserId;
}
public function create()
{
return TRUE;
}
function purge()
{
return $this->delete();
}
public function delete()
{
$bSuccess = TRUE;
if(!is_array($this->aVotes))
$this->aVotes = $this->getVotes();
foreach($this->aVotes as $oVote)
{
if(!$oVote->delete())
$bSuccess = FALSE;
}
return $bSuccess;
}
public function update()
{
foreach($this->aVotes as $oVote)
$oVote->update();
}
public function getOutputEditorValues($aClean)
{
$this->aVotes = $this->getVotes();
for($i = 0; $i < MAX_VOTES; $i++)
$this->aVotes[$i]->iVersionId = $aClean["iSlot$i"];
}
public function objectGetEntriesCount()
{
$hResult = query_parameters("SELECT COUNT(id) as count FROM appVotes");
if(!$hResult)
return FALSE;
if(!($oRow = mysql_fetch_object($hResult)))
return FALSE;
return $oRow->count;
}
public function objectGetSubmitterId()
{
return $this->iUserId;
}
public function getVotes()
{
$aVotes = array();
$hResult = query_parameters("SELECT * FROM appVotes WHERE userId = '?' ORDER BY slot", $this->iUserId);
if(!$hResult)
return $aVotes;
for($i = 0; $i < MAX_VOTES; $i++)
$aVotes[$i] = null;
while($oRow = mysql_fetch_object($hResult))
$aVotes[$oRow->slot-1] = new vote(null, $oRow);
for($i = 0; $i < MAX_VOTES; $i++)
{
if(!$aVotes[$i])
{
$aVotes[$i] = new vote();
$aVotes[$i]->iSlotIndex = $i+1;
}
}
return $aVotes;
}
}
/**
* used by admins to check whether votes for a version are legit
*/
class voteInspector
{
private $iVersionId;
private $aDeleteVoters;
function voteInspector($iVersionId = null)
{
if(is_numeric($iVersionId))
$this->iVersionId = $iVersionId;
$this->aDeleteVoters = array();
}
public function objectGetId()
{
return $this->iVersionId;
}
public function objectGetState()
{
return 'accepted';
}
public function canEdit()
{
return $_SESSION['current']->hasPriv('admin');
}
public function objectGetSubmitterId()
{
return -1;
}
public function getVotes()
{
return query_parameters("SELECT userId, COUNT(userId) as count FROM appVotes WHERE
versionId = '?'
GROUP BY userId", $this->iVersionId);
}
public function getVoteCount()
{
return vote_count_version_total($this->iVersionId);
}
public function getVoterCount()
{
return mysql_num_rows($this->getVotes());
}
public function outputEditor()
{
$oVersion = new version($this->iVersionId);
echo 'Inspecting votes for ' . version::fullNameLink($this->iVersionId).' ';
echo 'Total votes: '.$this->getVoteCount().' ';
echo 'To delete bogus user accounts, select them and press the Delete button below.
';
$hResult = $this->getVotes();
if(!$hResult)
{
echo 'Failed to get list of votes';
return;
}
if(mysql_num_rows($hResult) == 0)
{
echo 'There are no votes for this version';
return;
}
$oTable = new Table();
$oTable->setCellPadding(3);
$oTableRow = new TableRow();
$oTableRow->setClass('color4');
$oTableRow->AddTextCell('Delete account');
$oTableRow->AddTextCell('User');
$oTableRow->AddTextCell('ID');
$oTableRow->AddTextCell('E-mail');
$oTableRow->AddTextCell('Created');
$oTableRow->AddTextCell('Votes');
$oTableRow->AddTextCell('Privileges');
$oTableRow->AddTextCell('Test data');
$oTableRow->AddTextcell('Comments');
$oTable->AddRow($oTableRow);
for($i = 0; $oRow = mysql_fetch_object($hResult); $i++)
{
$oVoter = new user($oRow->userId);
$oTableRow = new TableRow();
$oTableRow->setClass(($i % 2) ? 'color0' : 'color1');
if($oVoter->hasPriv('admin'))
$shDelete = '';
else
$shDelete = "iUserId}\" />";
$oTableRow->AddTextCell($shDelete);
$oTableRow->AddTextCell($oVoter->objectMakeLink());
$oTableRow->AddTextCell($oVoter->iUserId);
$oTableRow->AddTextCell($oVoter->sEmail);
$oTableRow->AddTextCell($oVoter->sDateCreated);
$oTableRow->AddTextCell($oRow->count);
$sPrivs = '';
if($oVoter->hasPriv('admin'))
$sPrivs .= 'Admin ';
if($oVoter->isMaintainer($this->iVersionId))
$sPrivs .= 'Maintainer of this version ';
if($oVoter->isMaintainer())
{
$oM = new objectManager('maintainerView', 'View maintainership info');
$sPrivs .= 'Maintainer (other entries) ';
}
$oTableRow->AddTextCell($sPrivs);
$hSubResult = query_parameters("SELECT COUNT(testingId) AS count FROM testResults WHERE submitterId = '?' AND state != 'deleted'", $oVoter->iUserId);
if($hSubResult && ($oSubRow = mysql_fetch_object($hSubResult)))
$sSubmitted = $oSubRow->count;
else
$sSubmitted = 'DB failure';
$oTableRow->AddTextCell($sSubmitted);
$hSubResult = query_parameters("SELECT COUNT(commentId) as count FROM appComments WHERE userId = '?'", $oVoter->iUserId);
if($hSubResult && ($oSubRow = mysql_fetch_object($hSubResult)))
$sSubmitted = $oSubRow->count;
else
$sSubmitted = 'DB failure';
$oTableRow->AddTextCell($sSubmitted);
$oTable->AddRow($oTableRow);
}
echo $oTable->getString();
}
public function getOutputEditorValues($aValues)
{
$iVoters = $this->getVoterCount();
$this->aDeleteVoters = array();
for($i = 0; $i < $iVoters; $i++)
{
if(($iVoterId = getInput("iDelSlot$i", $aValues)))
$this->aDeleteVoters[] = new user($iVoterId);
}
}
public function create()
{
return true;
}
public function update()
{
return true;
}
public function objectGetMail($sAction, $bMailSubmitter, $bParentAction)
{
$sSubject = '';
$sMsg = '';
$aMailTo = null;
return array($sSubject, $sMsg, $aMailTo);
}
public function delete()
{
$bSuccess = true;
foreach($this->aDeleteVoters as $oVoter)
{
if(!$oVoter->delete())
$bSuccess = false;
}
return $bSuccess;
}
}
/**
* count the number of votes for appId by userId
*/
function vote_count($iVersionId, $iUserId = null)
{
if(!$iUserId)
{
if($_SESSION['current']->isLoggedIn())
$iUserId = $_SESSION['current']->iUserId;
else
return 0;
}
$hResult = query_parameters("SELECT * FROM appVotes WHERE versionId = '?' AND userId = '?'",
$iVersionId, $iUserId);
return query_num_rows($hResult);
}
/*
* total votes for versionId
*/
function vote_count_version_total($iVersionId)
{
$hResult = query_parameters("SELECT * FROM appVotes WHERE versionId = '?'",
$iVersionId);
return query_num_rows($hResult);
}
?>