Merge branch 'AddPoints'
This commit is contained in:
commit
6cf8a11300
5 changed files with 442 additions and 0 deletions
182
dbadm/create-assurers.php
Executable file
182
dbadm/create-assurers.php
Executable file
|
@ -0,0 +1,182 @@
|
|||
#!/usr/bin/php
|
||||
<?php
|
||||
/**
|
||||
* Script to create more dummy assurer accounts (for use on the test system)
|
||||
* which can be used by the test manager to create automated assurances
|
||||
*
|
||||
* @author Michael Tänzer
|
||||
*/
|
||||
|
||||
class CreateAssurers {
|
||||
protected $db;
|
||||
|
||||
// define constants for the positions in $argv
|
||||
const ARGV_SCRIPT = 0;
|
||||
const ARGV_DB_HOST = 1;
|
||||
const ARGV_DB_USER = 2;
|
||||
const ARGV_DB_PASSWD = 3;
|
||||
const ARGV_DB_NAME = 4;
|
||||
const ARGV_QUANTITY = 5;
|
||||
|
||||
// required length of $argv
|
||||
const ARGV_LENGTH = 6;
|
||||
|
||||
|
||||
function __construct(mysqli $db){
|
||||
$this->db = $db;
|
||||
}
|
||||
|
||||
|
||||
public static function echoUsage($script_name){
|
||||
print 'Usage: ' . $script_name; ?> <db_host> <db_user> <db_passwd>
|
||||
<db_name> <quantity>
|
||||
|
||||
Script to create more dummy assurer accounts (for use on the test system)
|
||||
which can be used by the test manager to create automated assurances
|
||||
|
||||
<quantity> specifies how many new dummy accounts should be created
|
||||
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
public static function main(){
|
||||
$argc = $_SERVER['argc'];
|
||||
$argv = $_SERVER['argv'];
|
||||
|
||||
if ($argc != self::ARGV_LENGTH){
|
||||
self::echoUsage($argv[self::ARGV_SCRIPT]);
|
||||
fwrite(STDERR, "Error: Invalid number of parameters\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$quantity = (int)($argv[self::ARGV_QUANTITY]);
|
||||
if (!is_numeric($argv[self::ARGV_QUANTITY]) || $quantity < 0){
|
||||
self::echoUsage($argv[self::ARGV_SCRIPT]);
|
||||
fwrite(STDERR, "Error: Last parameter has to be a positive integer\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
// Try to connect to the database
|
||||
$db = new mysqli($argv[self::ARGV_DB_HOST], $argv[self::ARGV_DB_USER],
|
||||
$argv[self::ARGV_DB_PASSWD], $argv[self::ARGV_DB_NAME]);
|
||||
if (mysqli_connect_error()){
|
||||
fwrite(STDERR, "Error: Could not connect to the data base\n".
|
||||
"(".mysqli_connect_errno()."): ".mysqli_connect_error());
|
||||
exit(3);
|
||||
}
|
||||
|
||||
|
||||
$me = new self($db);
|
||||
$status = $me->createAssurers($quantity);
|
||||
|
||||
$db->close();
|
||||
exit($status);
|
||||
}
|
||||
|
||||
|
||||
public function createAssurers($quantity){
|
||||
// get last assurer
|
||||
$result = $this->db->query('select `mname` from `users` where `id`=
|
||||
(select max(`id`) from `users` where `email` like
|
||||
\'john.doe-___@example.com\')');
|
||||
$row = $result->fetch_assoc();
|
||||
if ($row === NULL){
|
||||
$last_assurer = 0;
|
||||
printf("1\n");
|
||||
} else {
|
||||
$last_assurer = (int)($row['mname']);
|
||||
printf("2: \$last_assurer: %d\n", $last_assurer);
|
||||
}
|
||||
|
||||
|
||||
// prepare the statements
|
||||
$insert_user = $this->db->prepare('insert into `users` set
|
||||
`email` = ? ,
|
||||
`password` = \'invalid\' ,
|
||||
`fname` = ? ,
|
||||
`mname` = ? ,
|
||||
`lname` = \'Doe\' ,
|
||||
`suffix` = \'\' ,
|
||||
`dob` = ? ,
|
||||
`Q1` = SHA1(rand()) ,
|
||||
`Q2` = SHA1(rand()) ,
|
||||
`Q3` = SHA1(rand()) ,
|
||||
`Q4` = SHA1(rand()) ,
|
||||
`Q5` = SHA1(rand()) ,
|
||||
`A1` = SHA1(rand()) ,
|
||||
`A2` = SHA1(rand()) ,
|
||||
`A3` = SHA1(rand()) ,
|
||||
`A4` = SHA1(rand()) ,
|
||||
`A5` = SHA1(rand()) ,
|
||||
`created` = now() ,
|
||||
`uniqueID` = SHA1(rand()) ,
|
||||
`verified` = 1 ,
|
||||
`assurer` = 1 ');
|
||||
$insert_user->bind_param('ssss', $email, $fname, $mname, $dob);
|
||||
|
||||
$insert_email = $this->db->prepare('insert into `email` set
|
||||
`email` = ? ,
|
||||
`hash` = \'\' ,
|
||||
`created` = now() ,
|
||||
`modified` = now() ,
|
||||
`memid` = ? ');
|
||||
$insert_email->bind_param('si', $email, $memid);
|
||||
|
||||
$insert_alerts = $this->db->prepare('insert into `alerts` set
|
||||
`memid` = ? ,
|
||||
`general` = 0 ,
|
||||
`country` = 0 ,
|
||||
`regional` = 0 ,
|
||||
`radius` = 0 ');
|
||||
$insert_alerts->bind_param('i', $memid);
|
||||
|
||||
$insert_points = $this->db->prepare('insert into `notary` set
|
||||
`from` = ? ,
|
||||
`to` = ? ,
|
||||
`points` = 150 ,
|
||||
`awarded` = 150 ,
|
||||
`location` = \'Init Points\' ,
|
||||
`date` = curdate() ,
|
||||
`method` = \'Administrative Increase\' ,
|
||||
`when` = now() ');
|
||||
$insert_points->bind_param('ii', $memid, $memid);
|
||||
|
||||
$insert_cats = $this->db->prepare('insert into `cats_passed` set
|
||||
`user_id` = ? ,
|
||||
`pass_date` = now() ,
|
||||
`variant_id` =
|
||||
(select `id` from `cats_variant` where `type_id` = 1) ');
|
||||
$insert_cats->bind_param('i', $memid);
|
||||
|
||||
|
||||
// do the actual work
|
||||
for ($i = $last_assurer + 1; $i <= $last_assurer + $quantity; $i++){
|
||||
$email = sprintf('john.doe-%03u@example.com', $i);
|
||||
$fname = sprintf('John %u', $i);
|
||||
$mname = sprintf('%u', $i);
|
||||
$dob = sprintf('19%02u-01-%02u', $i % 90, (int)(($i/90) + 1) );
|
||||
|
||||
$insert_user->execute();
|
||||
$memid = $insert_user->insert_id;
|
||||
if ($memid == 0){
|
||||
fwrite(STDERR, "Error: didn't get a valid ID for the user\n");
|
||||
return 10;
|
||||
}
|
||||
|
||||
$insert_email->execute();
|
||||
$insert_alerts->execute();
|
||||
$insert_points->execute();
|
||||
$insert_cats->execute();
|
||||
|
||||
printf('Assurer number %u %s Doe <%s>'."\n".
|
||||
'born on %s with the ID %d has been added'."\n", $i,
|
||||
$fname, $email, $dob, $memid);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CreateAssurers::main();
|
173
manager/application/controllers/AddPointsController.php
Normal file
173
manager/application/controllers/AddPointsController.php
Normal file
|
@ -0,0 +1,173 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Michael Tänzer
|
||||
*/
|
||||
|
||||
class AddPointsController extends Zend_Controller_Action
|
||||
{
|
||||
const MAX_POINTS_PER_ASSURANCE = 35;
|
||||
const MAX_ASSURANCE_POINTS = 100;
|
||||
|
||||
protected $db;
|
||||
|
||||
public function init()
|
||||
{
|
||||
$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini',
|
||||
APPLICATION_ENV);
|
||||
|
||||
$this->db = Zend_Db::factory($config->ca_mgr->db->auth->pdo,
|
||||
$config->ca_mgr->db->auth);
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
$this->view->assurance_form = $this->getAssuranceForm();
|
||||
$this->render('index');
|
||||
}
|
||||
|
||||
public function assuranceAction()
|
||||
{
|
||||
// Validate form
|
||||
if (!$this->getRequest()->isPost()) {
|
||||
return $this->_forward('index');
|
||||
}
|
||||
|
||||
$form = $this->getAssuranceForm();
|
||||
if (!$form->isValid($_POST)) {
|
||||
$this->view->assurance_form = $form;
|
||||
return $this->render('index');
|
||||
}
|
||||
|
||||
// Form is valid -> get values for processing
|
||||
$values = $form->getValues();
|
||||
|
||||
|
||||
// Check identity of the user
|
||||
$session = Zend_Registry::get('session');
|
||||
if ($session->authdata['authed'] !== true) {
|
||||
throw new Exception(__METHOD__ . ': you need to log in to use this feature');
|
||||
}
|
||||
$query = 'select `id` from `users` where `id` = :user';
|
||||
$query_params['user'] = $session->authdata['authed_id'];
|
||||
$result = $this->db->query($query, $query_params);
|
||||
if ($result->rowCount() !== 1) {
|
||||
throw new Exception(__METHOD__ . ': user ID not found in the data base');
|
||||
}
|
||||
$row = $result->fetch();
|
||||
$user['id'] = $row['id'];
|
||||
|
||||
|
||||
// Get current points of the user
|
||||
$query = 'select sum(`points`) as `total` from `notary` where `to` = :user';
|
||||
$query_params['user'] = $user['id'];
|
||||
$row = $this->db->query($query, $query_params)->fetch();
|
||||
if ($row['total'] === NULL) $row['total'] = 0;
|
||||
$user['points'] = $row['total'];
|
||||
|
||||
|
||||
// Do the actual assurances
|
||||
$assurance = array(); // Make sure the array is empty
|
||||
$assurance['to'] = $user['id'];
|
||||
$assurance['location'] = $values['location'];
|
||||
$assurance['date'] = $values['date'];
|
||||
$assurance['when'] = new Zend_Db_Expr('now()');
|
||||
$this->view->assurancesDone = array();
|
||||
|
||||
$quantity = $values['quantity'];
|
||||
do {
|
||||
// split up into multiple assurances
|
||||
if ($quantity > self::MAX_POINTS_PER_ASSURANCE) {
|
||||
$assurance['awarded'] = self::MAX_POINTS_PER_ASSURANCE;
|
||||
$quantity -= self::MAX_POINTS_PER_ASSURANCE;
|
||||
} else {
|
||||
$assurance['awarded'] = $quantity;
|
||||
$quantity = 0;
|
||||
}
|
||||
|
||||
// Get the assurer for this assurance
|
||||
$assurance['from'] = $this->getNewAssurer($user['id']);
|
||||
|
||||
// only assign points whithin the limit
|
||||
if ($user['points'] + $assurance['awarded'] > self::MAX_ASSURANCE_POINTS){
|
||||
$assurance['points'] = self::MAX_ASSURANCE_POINTS - $user['points'];
|
||||
} else {
|
||||
$assurance['points'] = $assurance['awarded'];
|
||||
}
|
||||
|
||||
$this->db->insert('notary', $assurance);
|
||||
|
||||
$user['points'] += $assurance['points'];
|
||||
$this->view->assurancesDone[] = $assurance['points'];
|
||||
} while ($quantity > 0);
|
||||
|
||||
|
||||
// Fix the assurer flag
|
||||
$query = 'UPDATE `users` SET `assurer` = 1 WHERE `users`.`id` = :user AND '.
|
||||
|
||||
'EXISTS(SELECT * FROM `cats_passed` AS `cp`, `cats_variant` AS `cv` '.
|
||||
'WHERE `cp`.`variant_id` = `cv`.`id` AND `cv`.`type_id` = 1 AND '.
|
||||
'`cp`.`user_id` = :user) AND '.
|
||||
|
||||
'(SELECT SUM(`points`) FROM `notary` WHERE `to` = :user AND '.
|
||||
'`expire` < now()) >= 100';
|
||||
$query_params['user'] = $user['id'];
|
||||
$this->db->query($query, $query_params);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first assurer who didn't already assure the user
|
||||
*
|
||||
* @param int $user_id The ID of the user who should get assured
|
||||
* @return int The ID of the selected assurer
|
||||
*/
|
||||
protected function getNewAssurer($user_id)
|
||||
{
|
||||
$query = 'select min(`id`) as `assurer` from `users` ' .
|
||||
'where `email` like \'john.doe-___@example.com\' and ' .
|
||||
'`id` not in (select `from` from `notary` where `to` = :user)';
|
||||
$query_params['user'] = $user_id;
|
||||
$row = $this->db->query($query, $query_params)->fetch();
|
||||
|
||||
if ($row['assurer'] === NULL) {
|
||||
throw new Exception(__METHOD__ . ': no more assurers that haven\'t '.
|
||||
'already assured this account');
|
||||
}
|
||||
|
||||
return $row['assurer'];
|
||||
}
|
||||
|
||||
protected function getAssuranceForm()
|
||||
{
|
||||
$form = new Zend_Form();
|
||||
$form->setAction('/add-points/assurance')->setMethod('post');
|
||||
|
||||
$quantity = new Zend_Form_Element_Text('quantity');
|
||||
$quantity->setRequired(true)
|
||||
->setLabel(I18n::_('Number of Points'))
|
||||
->addFilter(new Zend_Filter_Int())
|
||||
->addValidator(new Zend_Validate_Between(0, 100));
|
||||
$form->addElement($quantity);
|
||||
|
||||
$location = new Zend_Form_Element_Text('location');
|
||||
$location->setRequired(true)
|
||||
->setLabel(I18n::_('Location'))
|
||||
->setValue(I18n::_('CACert Test Manager'))
|
||||
->addValidator(new Zend_Validate_StringLength(1,255));
|
||||
$form->addElement($location);
|
||||
|
||||
$date = new Zend_Form_Element_Text('date');
|
||||
$date->setRequired(true)
|
||||
->setLabel(I18n::_('Date of Assurance'))
|
||||
->setValue(date('Y-m-d H:i:s'))
|
||||
->addValidator(new Zend_Validate_StringLength(1,255));
|
||||
$form->addElement($date);
|
||||
|
||||
$submit = new Zend_Form_Element_Submit('submit');
|
||||
$submit->setLabel(I18n::_('Assure Me'));
|
||||
$form->addElement($submit);
|
||||
|
||||
return $form;
|
||||
}
|
||||
}
|
20
manager/application/views/scripts/add-points/assurance.phtml
Normal file
20
manager/application/views/scripts/add-points/assurance.phtml
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Michael Tänzer
|
||||
*/
|
||||
?>
|
||||
|
||||
<h1><?php print I18n::_('Points added successfully')?></h1>
|
||||
|
||||
<p><?php print I18n::_('The following assurances were added to your account:')?></p>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>#</th><th><?php print I18n::_('Number of points')?></th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($this->assurancesDone as $i => $points) {
|
||||
printf('<tr><td> %1$d </td><td> %2$d </td></tr>', $i, $points);
|
||||
}?>
|
||||
</tbody>
|
||||
</table>
|
14
manager/application/views/scripts/add-points/index.phtml
Normal file
14
manager/application/views/scripts/add-points/index.phtml
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Michael Tänzer
|
||||
*/
|
||||
?>
|
||||
|
||||
<h1><?php print I18n::_('Add Assurance Points to your Account') ?></h1>
|
||||
|
||||
<h2><?php print I18n::_('Get Points by Automated Assurance') ?></h2>
|
||||
<p><?php print I18n::_('Assign the points by doing an automated assurance '.
|
||||
'which looks just like a normal assurance done by a real person.') ?></p>
|
||||
<p><?php print I18n::_('If you enter more than 35 points they will be split '.
|
||||
'into multiple assurances. You can do zero point assurances.') ?></p>
|
||||
<?php print $this->assurance_form ?>
|
53
manager/library/actions/ActionAddPoints.php
Normal file
53
manager/library/actions/ActionAddPoints.php
Normal file
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
require_once (FWACTIONS_PATH . '/FWAction.php');
|
||||
|
||||
class AddPoints extends FWAction {
|
||||
/**
|
||||
* get a list of required permissions that are needed to access this action
|
||||
* @return array
|
||||
*/
|
||||
public static function getRequiredPermissions() {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* get a role that is required for accessing that action
|
||||
* @return string
|
||||
*/
|
||||
public static function getRequiredRole() {
|
||||
return 'User';
|
||||
}
|
||||
|
||||
/**
|
||||
* sort order for top navigation
|
||||
* @return integer
|
||||
*/
|
||||
public static function getTopNavPrio() {
|
||||
return 50;
|
||||
}
|
||||
|
||||
/**
|
||||
* controller to invoke
|
||||
* @return string
|
||||
*/
|
||||
public static function getController() {
|
||||
return 'add-points';
|
||||
}
|
||||
|
||||
/**
|
||||
* action to invoke
|
||||
* @return string
|
||||
*/
|
||||
public static function getAction() {
|
||||
return 'index';
|
||||
}
|
||||
|
||||
/**
|
||||
* get text for menu, caller is responsible for translating
|
||||
* @return string
|
||||
*/
|
||||
public static function getMenuText() {
|
||||
return 'Add Points';
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue