From 1682b0ee32f904d8df119dd137a258bce7070980 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Tue, 5 May 2015 09:24:28 +0200 Subject: [PATCH] Introduce controller GroupController Still only able to list groups, more to follow... refs #8826 --- application/controllers/GroupController.php | 137 ++++++++++++++++++++ application/controllers/UserController.php | 9 ++ application/views/scripts/group/list.phtml | 50 +++++++ public/css/icinga/main-content.less | 20 +++ 4 files changed, 216 insertions(+) create mode 100644 application/controllers/GroupController.php create mode 100644 application/views/scripts/group/list.phtml diff --git a/application/controllers/GroupController.php b/application/controllers/GroupController.php new file mode 100644 index 000000000..ffa32584a --- /dev/null +++ b/application/controllers/GroupController.php @@ -0,0 +1,137 @@ +createTabs(); + } + + /** + * Redirect to this controller's list action + */ + public function indexAction() + { + $this->redirectNow('group/list'); + } + + /** + * List all user groups of a single backend + */ + public function listAction() + { + $backend = $this->getUserGroupBackend($this->params->get('backend')); + if ($backend === null) { + $this->view->backend = null; + return; + } + + $query = $backend->select(array( + 'group_name', + 'parent_name', + 'created_at', + 'last_modified' + )); + + $filterEditor = Widget::create('filterEditor') + ->setQuery($query) + ->preserveParams('limit', 'sort', 'dir', 'view', 'backend') + ->ignoreParams('page') + ->handleRequest($this->getRequest()); + $query->applyFilter($filterEditor->getFilter()); + $this->setupFilterControl($filterEditor); + + $this->getTabs()->activate('group/list'); + $this->view->backend = $backend; + $this->view->groups = $query->paginate(); + + $this->setupLimitControl(); + $this->setupPaginationControl($this->view->groups); + $this->setupSortControl(array( + 'group_name' => $this->translate('Group'), + 'parent_name' => $this->translate('Parent'), + 'created_at' => $this->translate('Created at'), + 'last_modified' => $this->translate('Last modified') + )); + } + + /** + * Return the given user group backend or the first match in order + * + * @param string $name The name of the backend, or null in case the first match should be returned + * @param bool $selectable Whether the backend should implement the Selectable interface + * + * @return UserGroupBackendInterface + * + * @throws Zend_Controller_Action_Exception In case the given backend name is invalid + */ + protected function getUserGroupBackend($name = null, $selectable = true) + { + $config = Config::app('groups'); + if ($name !== null) { + if (! $config->hasSection($name)) { + throw new Zend_Controller_Action_Exception( + sprintf($this->translate('User group backend "%s" not found'), $name), + 404 + ); + } else { + $backend = UserGroupBackend::create($name, $config->getSection($name)); + if ($selectable && !$backend instanceof Selectable) { + throw new Zend_Controller_Action_Exception( + sprintf($this->translate('User group backend "%s" is not able to list groups'), $name), + 400 + ); + } + } + } else { + $backend = null; + foreach ($config as $backendName => $backendConfig) { + $candidate = UserGroupBackend::create($backendName, $backendConfig); + if (! $selectable || $candidate instanceof Selectable) { + $backend = $candidate; + break; + } + } + } + + return $backend; + } + + /** + * Create the tabs + */ + protected function createTabs() + { + $tabs = $this->getTabs(); + $tabs->add( + 'user/list', + array( + 'title' => $this->translate('List users of authentication backends'), + 'label' => $this->translate('Users'), + 'icon' => 'users', + 'url' => 'user/list' + ) + ); + $tabs->add( + 'group/list', + array( + 'title' => $this->translate('List groups of user group backends'), + 'label' => $this->translate('Groups'), + 'icon' => 'cubes', + 'url' => 'group/list' + ) + ); + } +} diff --git a/application/controllers/UserController.php b/application/controllers/UserController.php index b5fcc50f1..ccb5aac03 100644 --- a/application/controllers/UserController.php +++ b/application/controllers/UserController.php @@ -124,5 +124,14 @@ class UserController extends Controller 'url' => 'user/list' ) ); + $tabs->add( + 'group/list', + array( + 'title' => $this->translate('List groups of user group backends'), + 'label' => $this->translate('Groups'), + 'icon' => 'cubes', + 'url' => 'group/list' + ) + ); } } diff --git a/application/views/scripts/group/list.phtml b/application/views/scripts/group/list.phtml new file mode 100644 index 000000000..3871b675e --- /dev/null +++ b/application/views/scripts/group/list.phtml @@ -0,0 +1,50 @@ +compact): ?> +
+ tabs; ?> + sortBox; ?> + limiter; ?> + paginator; ?> + filterEditor; ?> +
+ +
+translate('No backend found which is able to list groups') . '
'; + return; +} + +if (count($groups) === 0) { + echo $this->translate('No groups found matching the filter') . ''; + return; +} +?> + + + + + + + + + + + + + + + + + + + + +
translate('Group'); ?>translate('Parent'); ?>translate('Created at'); ?>translate('Last modified'); ?>
escape($group->group_name); ?> + parent_name === null ? $this->translate('None', 'user.group.parent') : $this->escape($group->parent_name); ?> + + created_at === null ? $this->translate('N/A') : date('d/m/Y g:i A', $group->created_at); ?> + + last_modified === null ? $this->translate('Never') : date('d/m/Y g:i A', $group->last_modified); ?> +
+ \ No newline at end of file diff --git a/public/css/icinga/main-content.less b/public/css/icinga/main-content.less index 06a0b1b90..830ecdd44 100644 --- a/public/css/icinga/main-content.less +++ b/public/css/icinga/main-content.less @@ -221,4 +221,24 @@ table.user-list { td.user-state, td.user-created, td.user-modified { text-align: right; } +} + +table.group-list { + th { + &.group-parent { + width: 6%; + padding-right: 0.5em; + text-align: right; + } + + &.group-created, &.group-modified { + width: 12%; + padding-right: 0.5em; + text-align: right; + } + } + + td.group-parent, td.group-created, td.group-modified { + text-align: right; + } } \ No newline at end of file