Implement batch assurance.

Fixes bug 944

Signed-off-by: Michael Tänzer <neo@nhng.de>
This commit is contained in:
Michael Tänzer 2011-07-05 18:54:19 +02:00
parent b3d761a0d6
commit 118cf4383e
4 changed files with 180 additions and 1 deletions

View file

@ -25,6 +25,7 @@ class ManageAccountController extends Zend_Controller_Action
// Build the left navigation
$actions = array();
$actions['assurance'] = I18n::_('Automated Assurance');
$actions['batch-assurance'] = I18n::_('Batch Assurance');
$actions['admin-increase'] = I18n::_('Administrative Increase');
$actions['assurer-challenge'] = I18n::_('Assurer Challenge');
$actions['flags'] = I18n::_('Set Flags');
@ -81,6 +82,45 @@ class ManageAccountController extends Zend_Controller_Action
return;
}
public function batchAssuranceAction() {
// Validate form
$form = $this->getBatchAssuranceForm();
if (!$this->getRequest()->isPost() || !$form->isValid($_POST)) {
$this->view->batch_assurance_form = $form;
return $this->render('batch-assurance-form');
}
// Form is valid -> get values for processing
$values = $form->getValues();
$user = Default_Model_User::findCurrentUser();
$location = $values['location'];
$date = $values['date'];
$this->view->assurances = array();
for ($i = 0; $i < intval($values['quantity']); $i++) {
$assuree = $user->findNewAssuree();
if ($values['percentage'] === 'percentage') {
$points = ($user->maxpoints() * intval($values['points']) /100);
}elseif ($values['percentage'] === 'absolute') {
$points = intval($values['points']);
}
$user->assure($assuree, $points, $location, $date);
$this->view->assurances[] = array(
'assuree'=>$assuree->getPrimEmail(),
'points'=>$points,
'location'=>$location,
'date'=>$date);
}
return;
}
public function adminIncreaseAction()
{
// Validate form
@ -190,6 +230,57 @@ class ManageAccountController extends Zend_Controller_Action
return $form;
}
protected function getBatchAssuranceForm() {
$form = new Zend_Form();
$form->setAction('/manage-account/batch-assurance')->setMethod('post');
$quantity = new Zend_Form_Element_Text('quantity');
$quantity->setRequired(true)
->setLabel(I18n::_('Number of Assurances'))
->setValue('25')
->addFilter(new Zend_Filter_Int())
->addValidator(new Zend_Validate_Between(0, 100));
$form->addElement($quantity);
$percentage = new Zend_Form_Element_Select('percentage');
$percentage->setRequired(true)
->setLabel(I18n::_('Are the points specified absolute?'))
->setValue('percentage')
->setMultiOptions(array(
'percentage' => I18n::_('Percentage'),
'absolute' => I18n::_('Absolute'),
));
$form->addElement($percentage);
$points = new Zend_Form_Element_Text('points');
$points->setRequired(true)
->setLabel(I18n::_('Points per Assurance'))
->setValue('100')
->addFilter(new Zend_Filter_Int())
->addValidator(new Zend_Validate_Between(0, 100));
$form->addElement($points);
$location = new Zend_Form_Element_Text('location');
$location->setRequired(true)
->setLabel(I18n::_('Location'))
->setValue(I18n::_('CAcert Test Manager Batch Assurance'))
->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::_('Make Batch Assurance'));
$form->addElement($submit);
return $form;
}
protected function getAdminIncreaseForm()
{
$form = new Zend_Form();

View file

@ -80,6 +80,27 @@ class Default_Model_User {
return new Default_Model_User($this->db, $row['assurer']);
}
/**
* Get the first assuree who hasn't already been assured by this user
*
* @return Default_Model_User
*/
public function findNewAssuree() {
$query = 'select min(`id`) as `assuree` from `users` ' .
'where `email` like \'john.doe-___@example.com\' and ' .
'`id` not in (select `to` from `notary` where `from` = :user)';
$query_params['user'] = $this->id;
$row = $this->db->query($query, $query_params)->fetch();
if ($row['assuree'] === NULL) {
throw new Exception(
__METHOD__ . ': no more assurees that haven\'t already '.
'been assured by this account');
}
return new Default_Model_User($this->db, $row['assuree']);
}
/**
* Refresh the current value of points from the test server
*
@ -180,6 +201,17 @@ class Default_Model_User {
return $age;
}
/**
* @return string
*/
public function getPrimEmail() {
$query = 'select `email` from `users` where `id` = :user';
$query_params['user'] = $this->id;
$row = $this->db->query($query, $query_params)->fetch();
return $row['email'];
}
/**
* Assure another user. Usual restrictions apply
*
@ -314,7 +346,7 @@ class Default_Model_User {
*
* @return int
*/
private function maxpoints() {
public function maxpoints() {
if (!$this->getAssurerStatus()) return 0;
if ($this->getAge() < 18) return 10;

View file

@ -0,0 +1,28 @@
<?php
/**
* @author Michael Tänzer
*/
?>
<h1><?php print I18n::_('Do Multiple Assurances at Once') ?></h1>
<p><?php print I18n::_('Assure multiple dummy accounts in one step. '.
'The assurances look just like normal assurances and can be used to gain '.
'experience points without suffering from RSI (also known as mouse arm).')
?></p>
<p><?php print I18n::_('The amount of points given per Assurance can be '.
'specified in two ways:') ?></p>
<dl>
<dt><?php print I18n::_('Percentage') ?></dt>
<dd><?php print I18n::_('n percent of the maximal possible points are '.
'given per Assurance. If it\'s not an integer it is rounded down to '.
'the next integer') ?></dd>
<dt><?php print I18n::_('Absolute') ?></dt>
<dd><?php print I18n::_('Exactly n points are given. If n exceeds the '.
'current maximum of points that may be given, it is set to the '.
'maximum until due to the gained experience points more points may be '.
'given') ?></dd>
</dl>
<?php print $this->batch_assurance_form ?>

View file

@ -0,0 +1,28 @@
<?php
/**
* @author Michael Tänzer <neo@nhng.de>
*/
?>
<h1><?php print I18n::_('Assurances executed successfully')?></h1>
<p><?php print I18n::_('The following assurances were executed:')?></p>
<table>
<thead>
<tr>
<th>#</th>
<th><?php print I18n::_('Assuree')?></th>
<th><?php print I18n::_('Number of points')?></th>
</tr>
</thead>
<tbody>
<?php foreach ($this->assurancesDone as $i => $assurance) {?>
<tr>
<td><?php print $i ?></td>
<td><?php print $assurance['assuree'] ?></td>
<td><?php print $assurance['points'] ?></td>
</tr>
<?php }?>
</tbody>
</table>