parent
47ee34d1c3
commit
58accea801
|
@ -12,6 +12,7 @@ use Icinga\Module\Director\Forms\IcingaObjectFieldForm;
|
|||
use Icinga\Module\Director\Objects\IcingaObject;
|
||||
use Icinga\Module\Director\Web\Controller\Extension\ObjectRestrictions;
|
||||
use Icinga\Module\Director\Web\Form\DirectorObjectForm;
|
||||
use Icinga\Module\Director\Web\Table\GroupMemberTable;
|
||||
use Icinga\Module\Director\Web\Tabs\ObjectTabs;
|
||||
use ipl\Html\Html;
|
||||
use ipl\Html\Link;
|
||||
|
@ -242,7 +243,7 @@ abstract class ObjectController extends ActionController
|
|||
|
||||
public function fieldsAction()
|
||||
{
|
||||
$this->hasPermission('director/admin');
|
||||
$this->assertPermission('director/admin');
|
||||
$object = $this->object;
|
||||
$type = $this->getType();
|
||||
|
||||
|
@ -278,7 +279,7 @@ abstract class ObjectController extends ActionController
|
|||
|
||||
public function historyAction()
|
||||
{
|
||||
$this->hasPermission('director/audit');
|
||||
$this->assertPermission('director/audit');
|
||||
$this->setAutorefreshInterval(10);
|
||||
$db = $this->db();
|
||||
$type = $this->getType();
|
||||
|
@ -298,6 +299,24 @@ abstract class ObjectController extends ActionController
|
|||
)->addAttributes(['data-base-target' => '_next']);
|
||||
}
|
||||
|
||||
public function membershipAction()
|
||||
{
|
||||
$this->requireObject();
|
||||
if (! $this->object->isGroup()) {
|
||||
throw new NotFoundError('Not Found');
|
||||
}
|
||||
$type = substr($this->getType(), 0, -5);
|
||||
|
||||
$this->setAutorefreshInterval(15);
|
||||
$this->tabs()->activate('membership');
|
||||
$this->addTitle(
|
||||
$this->translate('Group membership: %s'),
|
||||
$this->object->getObjectName()
|
||||
);
|
||||
|
||||
GroupMemberTable::create($type, $this->db())->setGroup($this->object)->renderTo($this);
|
||||
}
|
||||
|
||||
protected function getType()
|
||||
{
|
||||
// Strip final 's' and upcase an eventual 'group'
|
||||
|
|
|
@ -123,7 +123,8 @@ abstract class ObjectsController extends ActionController
|
|||
['type' => 'apply_rule'],
|
||||
[
|
||||
'title' => $this->translate('Create a new Service Apply Rule'),
|
||||
'class' => 'icon-plus'
|
||||
'class' => 'icon-plus',
|
||||
'data-base-target' => '_next'
|
||||
]
|
||||
)
|
||||
);
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
<?php
|
||||
|
||||
namespace Icinga\Module\Director\Web\Table;
|
||||
|
||||
use Icinga\Module\Director\Db;
|
||||
use Icinga\Module\Director\Objects\IcingaObjectGroup;
|
||||
use ipl\Html\Link;
|
||||
use ipl\Web\Component\ControlsAndContent;
|
||||
use ipl\Web\Table\ZfQueryBasedTable;
|
||||
use ipl\Web\Url;
|
||||
|
||||
class GroupMemberTable extends ZfQueryBasedTable
|
||||
{
|
||||
protected $searchColumns = [
|
||||
'o.object_name',
|
||||
// membership_type
|
||||
];
|
||||
|
||||
protected $type;
|
||||
|
||||
/** @var IcingaObjectGroup */
|
||||
protected $group;
|
||||
|
||||
/**
|
||||
* @param $type
|
||||
* @param Db $db
|
||||
* @return static
|
||||
*/
|
||||
public static function create($type, Db $db)
|
||||
{
|
||||
$class = __NAMESPACE__ . '\\GroupMemberTable' . ucfirst($type);
|
||||
if (! class_exists($class)) {
|
||||
$class = __CLASS__;
|
||||
}
|
||||
|
||||
/** @var static $table */
|
||||
$table = new $class($db);
|
||||
$table->type = $type;
|
||||
return $table;
|
||||
}
|
||||
|
||||
public function setGroup(IcingaObjectGroup $group)
|
||||
{
|
||||
$this->group = $group;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function renderTo(ControlsAndContent $controller)
|
||||
{
|
||||
$url = $controller->url();
|
||||
$this->initializeOptionalQuickSearch($controller);
|
||||
$controller->content()->add([
|
||||
$this->getPaginator($url),
|
||||
$this
|
||||
]);
|
||||
|
||||
if ($url->getParam('format') === 'sql') {
|
||||
$controller->content()->prepend($this->dumpSqlQuery($url));
|
||||
}
|
||||
}
|
||||
|
||||
public function getType()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
public function getColumnsToBeRendered()
|
||||
{
|
||||
if ($this->group === null) {
|
||||
return [
|
||||
$this->translate('Group'),
|
||||
$this->translate('Member'),
|
||||
$this->translate('Type')
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
$this->translate('Member'),
|
||||
$this->translate('Type')
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function renderRow($row)
|
||||
{
|
||||
$type = $this->getType();
|
||||
$url = Url::fromPath("director/${type}", [
|
||||
'name' => $row->object_name
|
||||
]);
|
||||
|
||||
$tr = $this::tr();
|
||||
|
||||
if ($this->group === null) {
|
||||
$tr->add($this::td($row->group_name));
|
||||
|
||||
}
|
||||
|
||||
$tr->add([
|
||||
$this::td(Link::create($row->object_name, $url)),
|
||||
$this::td($row->membership_type)
|
||||
]);
|
||||
return $tr;
|
||||
}
|
||||
|
||||
protected function prepareQuery()
|
||||
{
|
||||
// select h.object_name, hg.object_name,
|
||||
// CASE WHEN hgh.host_id IS NULL THEN 'apply' ELSE 'direct' END AS assi
|
||||
// from icinga_hostgroup_host_resolved hgr join icinga_host h on h.id = hgr.host_id
|
||||
// join icinga_hostgroup hg on hgr.hostgroup_id = hg.id
|
||||
// left join icinga_hostgroup_host hgh on hgh.host_id = h.id and hgh.hostgroup_id = hg.id;
|
||||
|
||||
$type = $this->getType();
|
||||
$columns = [
|
||||
'o.object_name',
|
||||
'membership_type' => "CASE WHEN go.${type}_id IS NULL THEN 'apply' ELSE 'direct' END"
|
||||
];
|
||||
|
||||
if ($this->group === null) {
|
||||
$columns = ['group_name' => 'g.object_name'] + $columns;
|
||||
}
|
||||
|
||||
$query = $this->db()->select()->from(
|
||||
['gro' => "icinga_${type}group_${type}_resolved"],
|
||||
$columns
|
||||
)->join(
|
||||
['o' => "icinga_${type}"],
|
||||
"o.id = gro.${type}_id",
|
||||
[]
|
||||
)->join(
|
||||
['g' => "icinga_${type}group"],
|
||||
"gro.${type}group_id = g.id",
|
||||
[]
|
||||
)->joinLeft(
|
||||
['go' => "icinga_${type}group_${type}"],
|
||||
"go.${type}_id = o.id AND go.${type}group_id = g.id",
|
||||
[]
|
||||
)->order('o.object_name');
|
||||
|
||||
if ($this->group !== null) {
|
||||
$query->where('g.id = ?', $this->group->get('id'));
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
|
@ -92,6 +92,14 @@ class ObjectTabs extends Tabs
|
|||
'label' => $this->translate('Fields')
|
||||
));
|
||||
}
|
||||
|
||||
if ($object->isGroup()) {
|
||||
$this->add('membership', [
|
||||
'url' => sprintf('director/%s/membership', $type),
|
||||
'urlParams' => $params,
|
||||
'label' => $this->translate('Members')
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
protected function hasFields()
|
||||
|
|
Loading…
Reference in New Issue