summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Controller/User.php23
-rw-r--r--app/Model/User.php56
-rw-r--r--app/Template/user_index.php26
-rwxr-xr-xscripts/create-random-users.php17
-rw-r--r--tests/units/UserTest.php9
5 files changed, 114 insertions, 17 deletions
diff --git a/app/Controller/User.php b/app/Controller/User.php
index 834b2379..e757fa84 100644
--- a/app/Controller/User.php
+++ b/app/Controller/User.php
@@ -121,16 +121,31 @@ class User extends Base
*/
public function index()
{
- $users = $this->user->getAll();
- $nb_users = count($users);
+ $direction = $this->request->getStringParam('direction', 'ASC');
+ $order = $this->request->getStringParam('order', 'username');
+ $offset = $this->request->getIntegerParam('offset', 0);
+ $limit = 25;
+
+ $users = $this->user->paginate($offset, $limit, $order, $direction);
+ $nb_users = $this->user->count();
$this->response->html(
$this->template->layout('user_index', array(
'projects' => $this->project->getList(),
- 'users' => $users,
'nb_users' => $nb_users,
+ 'users' => $users,
'menu' => 'users',
- 'title' => t('Users').' ('.$nb_users.')'
+ 'title' => t('Users').' ('.$nb_users.')',
+ 'pagination' => array(
+ 'controller' => 'user',
+ 'action' => 'index',
+ 'direction' => $direction,
+ 'order' => $order,
+ 'total' => $nb_users,
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'params' => array(),
+ ),
)));
}
diff --git a/app/Model/User.php b/app/Model/User.php
index 9544f3c9..41bad0bb 100644
--- a/app/Model/User.php
+++ b/app/Model/User.php
@@ -138,11 +138,65 @@ class User extends Base
return $this->db
->table(self::TABLE)
->asc('username')
- ->columns('id', 'username', 'name', 'email', 'is_admin', 'default_project_id', 'is_ldap_user', 'notifications_enabled', 'google_id', 'github_id')
+ ->columns(
+ 'id',
+ 'username',
+ 'name',
+ 'email',
+ 'is_admin',
+ 'default_project_id',
+ 'is_ldap_user',
+ 'notifications_enabled',
+ 'google_id',
+ 'github_id'
+ )
->findAll();
}
/**
+ * Get all users with pagination
+ *
+ * @access public
+ * @param integer $offset Offset
+ * @param integer $limit Limit
+ * @param string $column Sorting column
+ * @param string $direction Sorting direction
+ * @return array
+ */
+ public function paginate($offset = 0, $limit = 25, $column = 'username', $direction = 'ASC')
+ {
+ return $this->db
+ ->table(self::TABLE)
+ ->columns(
+ 'id',
+ 'username',
+ 'name',
+ 'email',
+ 'is_admin',
+ 'default_project_id',
+ 'is_ldap_user',
+ 'notifications_enabled',
+ 'google_id',
+ 'github_id'
+ )
+ ->offset($offset)
+ ->limit($limit)
+ ->orderBy($column, $direction)
+ ->findAll();
+ }
+
+ /**
+ * Get the number of users
+ *
+ * @access public
+ * @return integer
+ */
+ public function count()
+ {
+ return $this->db->table(self::TABLE)->count();
+ }
+
+ /**
* List all users (key-value pairs with id/username)
*
* @access public
diff --git a/app/Template/user_index.php b/app/Template/user_index.php
index d4e1bbf9..fc2b6307 100644
--- a/app/Template/user_index.php
+++ b/app/Template/user_index.php
@@ -3,7 +3,7 @@
<h2><?= t('Users') ?><span id="page-counter"> (<?= $nb_users ?>)</span></h2>
<?php if (Helper\is_admin()): ?>
<ul>
- <li><a href="?controller=user&amp;action=create"><?= t('New user') ?></a></li>
+ <li><?= Helper\a(t('New user'), 'user', 'create') ?></li>
</ul>
<?php endif ?>
</div>
@@ -13,29 +13,29 @@
<?php else: ?>
<table>
<tr>
- <th><?= t('Id') ?></th>
- <th><?= t('Username') ?></th>
- <th><?= t('Name') ?></th>
- <th><?= t('Email') ?></th>
- <th><?= t('Administrator') ?></th>
- <th><?= t('Default project') ?></th>
- <th><?= t('Notifications') ?></th>
+ <th><?= Helper\order(t('Id'), 'id', $pagination) ?></th>
+ <th><?= Helper\order(t('Username'), 'username', $pagination) ?></th>
+ <th><?= Helper\order(t('Name'), 'name', $pagination) ?></th>
+ <th><?= Helper\order(t('Email'), 'email', $pagination) ?></th>
+ <th><?= Helper\order(t('Administrator'), 'is_admin', $pagination) ?></th>
+ <th><?= Helper\order(t('Default project'), 'default_project_id', $pagination) ?></th>
+ <th><?= Helper\order(t('Notifications'), 'notifications_enabled', $pagination) ?></th>
<th><?= t('External accounts') ?></th>
- <th><?= t('Account type') ?></th>
+ <th><?= Helper\order(t('Account type'), 'is_ldap_user', $pagination) ?></th>
</tr>
<?php foreach ($users as $user): ?>
<tr>
<td>
- <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>">#<?= $user['id'] ?></a>
+ <?= Helper\a('#'.$user['id'], 'user', 'show', array('user_id' => $user['id'])) ?>
</td>
<td>
- <a href="?controller=user&amp;action=show&amp;user_id=<?= $user['id'] ?>"><?= Helper\escape($user['username']) ?></a>
+ <?= Helper\a(Helper\escape($user['username']), 'user', 'show', array('user_id' => $user['id'])) ?>
</td>
<td>
<?= Helper\escape($user['name']) ?>
</td>
<td>
- <?= Helper\escape($user['email']) ?>
+ <a href="mailto:<?= Helper\escape($user['email']) ?>"><?= Helper\escape($user['email']) ?></a>
</td>
<td>
<?= $user['is_admin'] ? t('Yes') : t('No') ?>
@@ -66,6 +66,8 @@
</tr>
<?php endforeach ?>
</table>
+
+ <?= Helper\paginate($pagination) ?>
<?php endif ?>
</section>
</section>
diff --git a/scripts/create-random-users.php b/scripts/create-random-users.php
new file mode 100755
index 00000000..47336c64
--- /dev/null
+++ b/scripts/create-random-users.php
@@ -0,0 +1,17 @@
+#!/usr/bin/env php
+<?php
+
+require __DIR__.'/../app/common.php';
+
+use Model\User;
+
+$userModel = new User($registry);
+
+for ($i = 0; $i < 500; $i++) {
+ $userModel->create(array(
+ 'username' => 'user'.$i,
+ 'password' => 'password'.$i,
+ 'name' => 'User #'.$i,
+ 'email' => 'user'.$i.'@localhost',
+ ));
+}
diff --git a/tests/units/UserTest.php b/tests/units/UserTest.php
index b66a6c27..d4f9dd92 100644
--- a/tests/units/UserTest.php
+++ b/tests/units/UserTest.php
@@ -9,6 +9,15 @@ use Model\Project;
class UserTest extends Base
{
+ public function testPassword()
+ {
+ $password = 'test123';
+ $hash = password_hash($password, PASSWORD_BCRYPT);
+
+ $this->assertNotEmpty($hash);
+ $this->assertTrue(password_verify($password, $hash));
+ }
+
public function testPrepare()
{
$u = new User($this->registry);