diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:43:12 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:43:12 +0000 |
commit | cd989f9c3aff968e19a3aeabc4eb9085787a6673 (patch) | |
tree | fbff2135e7013f196b891bbde54618eb050e4aaf /library/Director/Objects/IcingaTemplateChoice.php | |
parent | Initial commit. (diff) | |
download | icingaweb2-module-director-upstream.tar.xz icingaweb2-module-director-upstream.zip |
Adding upstream version 1.10.2.upstream/1.10.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/Director/Objects/IcingaTemplateChoice.php')
-rw-r--r-- | library/Director/Objects/IcingaTemplateChoice.php | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/library/Director/Objects/IcingaTemplateChoice.php b/library/Director/Objects/IcingaTemplateChoice.php new file mode 100644 index 0000000..1a1be90 --- /dev/null +++ b/library/Director/Objects/IcingaTemplateChoice.php @@ -0,0 +1,321 @@ +<?php + +namespace Icinga\Module\Director\Objects; + +use Icinga\Exception\ProgrammingError; +use Icinga\Module\Director\Db; +use Icinga\Module\Director\DirectorObject\Automation\ExportInterface; +use Icinga\Module\Director\Exception\DuplicateKeyException; +use Icinga\Module\Director\Web\Form\QuickForm; + +class IcingaTemplateChoice extends IcingaObject implements ExportInterface +{ + protected $objectTable; + + protected $defaultProperties = [ + 'id' => null, + 'object_name' => null, + 'description' => null, + 'min_required' => 0, + 'max_allowed' => 1, + 'required_template_id' => null, + 'allowed_roles' => null, + ]; + + private $choices; + + private $newChoices; + + public function getObjectShortTableName() + { + return substr(substr($this->table, 0, -16), 7); + } + + public function getUniqueIdentifier() + { + return $this->getObjectName(); + } + + /** + * @param $plain + * @param Db $db + * @param bool $replace + * @return IcingaTemplateChoice + * @throws DuplicateKeyException + * @throws \Icinga\Exception\NotFoundError + */ + public static function import($plain, Db $db, $replace = false) + { + $properties = (array) $plain; + if (isset($properties['originalId'])) { + unset($properties['originalId']); + } + $name = $properties['object_name']; + $key = $name; + + if ($replace && static::exists($key, $db)) { + $object = static::load($key, $db); + } elseif (static::exists($key, $db)) { + throw new DuplicateKeyException( + 'Template Choice "%s" already exists', + $name + ); + } else { + $object = static::create([], $db); + } + + $object->setProperties($properties); + + return $object; + } + + /** + * @deprecated please use \Icinga\Module\Director\Data\Exporter + * @return array|object|\stdClass + */ + public function export() + { + $plain = (object) $this->getProperties(); + $plain->originalId = $plain->id; + unset($plain->id); + $requiredId = $plain->required_template_id; + unset($plain->required_template_id); + if ($requiredId) { + $db = $this->getDb(); + $query = $db->select() + ->from(['o' => $this->getObjectTableName()], 'o.object_name')->where("o.object_type = 'template'") + ->where('o.id = ?', $this->get('id')); + $plain->required_template = $db->fetchOne($query); + } + + $plain->members = array_values($this->getMembers()); + + return $plain; + } + + public function isMainChoice() + { + return $this->hasBeenLoadedFromDb() + && $this->connection->settings()->get('main_host_choice'); + } + + public function getObjectTableName() + { + return substr($this->table, 0, -16); + } + + /** + * @param QuickForm $form + * @param array $imports + * @param string $namePrefix + * @return \Zend_Form_Element + * @throws \Zend_Form_Exception + */ + public function createFormElement(QuickForm $form, $imports = [], $namePrefix = 'choice') + { + $required = $this->isRequired() && !$this->isTemplate(); + $type = $this->allowsMultipleChoices() ? 'multiselect' : 'select'; + $choices = $this->enumChoices(); + + $chosen = []; + foreach ($imports as $import) { + if (array_key_exists($import, $choices)) { + $chosen[] = $import; + } + } + + $attributes = [ + 'label' => $this->getObjectName(), + 'description' => $this->get('description'), + 'required' => $required, + 'ignore' => true, + 'value' => $chosen, + 'multiOptions' => $form->optionalEnum($choices), + 'class' => 'autosubmit' + ]; + + // unused + if ($type === 'extensibleSet') { + $attributes['sorted'] = true; + } + + $key = $namePrefix . $this->get('id'); + return $form->createElement($type, $key, $attributes); + } + + public function isRequired() + { + return (int) $this->get('min_required') > 0; + } + + public function allowsMultipleChoices() + { + return (int) $this->get('max_allowed') > 1; + } + + public function hasBeenModified() + { + if ($this->newChoices !== null && $this->choices !== $this->newChoices) { + return true; + } + + return parent::hasBeenModified(); + } + + public function getMembers() + { + return $this->enumChoices(); + } + + public function setMembers($members) + { + if (empty($members)) { + $this->newChoices = array(); + return $this; + } + $db = $this->getDb(); + $query = $db->select()->from( + ['o' => $this->getObjectTableName()], + ['o.id', 'o.object_name'] + )->where("o.object_type = 'template'") + ->where('o.object_name IN (?)', $members) + ->order('o.object_name'); + + $this->newChoices = $db->fetchPairs($query); + return $this; + } + + public function getChoices() + { + if ($this->newChoices !== null) { + return $this->newChoices; + } + + if ($this->choices === null) { + $this->choices = $this->fetchChoices(); + } + + return $this->choices; + } + + public function fetchChoices() + { + if ($this->hasBeenLoadedFromDb()) { + $db = $this->getDb(); + $query = $db->select()->from( + ['o' => $this->getObjectTableName()], + ['o.id', 'o.object_name'] + )->where("o.object_type = 'template'") + ->where('o.template_choice_id = ?', $this->get('id')) + ->order('o.object_name'); + + return $db->fetchPairs($query); + } else { + return []; + } + } + + public function enumChoices() + { + $choices = $this->getChoices(); + return array_combine($choices, $choices); + } + + /** + * @throws \Zend_Db_Adapter_Exception + */ + public function onStore() + { + parent::onStore(); + if ($this->newChoices !== $this->choices) { + $this->storeChoices(); + } + } + + /** + * @throws \Zend_Db_Adapter_Exception + */ + protected function storeChoices() + { + $id = $this->getProperty('id'); + $db = $this->getDb(); + $ids = array_keys($this->newChoices); + $table = $this->getObjectTableName(); + + if (empty($ids)) { + $db->update( + $table, + ['template_choice_id' => null], + $db->quoteInto( + sprintf('template_choice_id = %d', $id), + $ids + ) + ); + } else { + $db->update( + $table, + ['template_choice_id' => null], + $db->quoteInto( + sprintf('template_choice_id = %d AND id NOT IN (?)', $id), + $ids + ) + ); + $db->update( + $table, + ['template_choice_id' => $id], + $db->quoteInto('id IN (?)', $ids) + ); + } + } + + /** + * @param $roles + * @throws ProgrammingError + * @codingStandardsIgnoreStart + */ + public function setAllowed_roles($roles) + { + // @codingStandardsIgnoreEnd + $key = 'allowed_roles'; + if (is_array($roles)) { + $this->reallySet($key, json_encode($roles)); + } elseif (null === $roles) { + $this->reallySet($key, null); + } else { + throw new ProgrammingError( + 'Expected array or null for allowed_roles, got %s', + var_export($roles, 1) + ); + } + } + + /** + * @return array|null + * @codingStandardsIgnoreStart + */ + public function getAllowed_roles() + { + // @codingStandardsIgnoreEnd + + // Might be removed once all choice types have allowed_roles + if (! array_key_exists('allowed_roles', $this->properties)) { + return null; + } + + $roles = $this->getProperty('allowed_roles'); + if (is_string($roles)) { + return json_decode($roles); + } else { + return $roles; + } + } + + /** + * @param $type + * @codingStandardsIgnoreStart + */ + public function setObject_type($type) + { + // @codingStandardsIgnoreEnd + } +} |