From 7b64af59410f1a658c70b8be367156fc3f4da17c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 14 Apr 2024 15:20:19 +0200 Subject: Adding upstream version 2.1.0. Signed-off-by: Daniel Baumann --- .../forms/Config/TtsIntegrationConfigForm.php | 249 +++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 application/forms/Config/TtsIntegrationConfigForm.php (limited to 'application/forms') diff --git a/application/forms/Config/TtsIntegrationConfigForm.php b/application/forms/Config/TtsIntegrationConfigForm.php new file mode 100644 index 0000000..2bdb562 --- /dev/null +++ b/application/forms/Config/TtsIntegrationConfigForm.php @@ -0,0 +1,249 @@ +setName('form_config_generictts_tts_integrations'); + } + + /** + * {@inheritdoc} + */ + public function createElements(array $formData) + { + $this->addElement( + 'text', + 'name', + array( + 'description' => $this->translate('The name of the TTS integration'), + 'label' => $this->translate('Name'), + 'required' => true + ) + ); + + $patternValidator = new Zend_Validate_Callback(function ($value) { + return @preg_match($value, '') !== false; + }); + $patternValidator->setMessage( + $this->translate('"%value%" is not a valid regular expression.'), + Zend_Validate_Callback::INVALID_VALUE + ); + $this->addElement( + 'text', + 'pattern', + array( + 'value' => '/this-will-not-match(\d{3-6})/', + 'label' => $this->translate('Ticket Pattern'), + 'description' => $this->translate( + 'The pattern to extract ticket IDs from comments.' + . ' The ticket pattern must be a valid regular expression' + ), + 'required' => true, + 'validators' => array($patternValidator) + ) + ); + + $urlValidator = new Zend_Validate_Callback(function ($value) { + return strpos($value, '$1') !== false; + }); + $urlValidator->setMessage( + $this->translate('The URL must contain the placeholder $1 to be substituted with a ticket ID.'), + Zend_Validate_Callback::INVALID_VALUE + ); + $this->addElement( + 'text', + 'url', + array( + 'value' => 'http://no-such-domain.example.com/ticket?id=$1', + 'label' => $this->translate('TTS Ticket URL'), + 'description' => $this->translate( + 'The URL pointing to the TTS with $1 as the placeholder for the ticket ID' + ), + 'required' => true, + 'validators' => array($urlValidator, new UrlValidator()) + ) + ); + } + + /** + * {@inheritdoc} + */ + public function getSubmitLabel() + { + if (($submitLabel = parent::getSubmitLabel()) === null) { + if ($this->boundIntegration === null) { + $submitLabel = $this->translate('Integrate'); + } else { + $submitLabel = $this->translate('Update Integration'); + } + } + return $submitLabel; + } + + /** + * {@inheritdoc} + */ + public function onRequest() + { + // The base class implementation does not make sense here. We're not populating the whole configuration but + // only a section + return; + } + + /** + * {@inheritdoc} + */ + public function onSuccess() + { + $name = $this->getElement('name')->getValue(); + $values = array( + 'pattern' => $this->getElement('pattern')->getValue(), + 'url' => $this->getElement('url')->getValue() + ); + if ($this->boundIntegration === null) { + $successNotification = $this->translate('TTS integrated'); + try { + $this->add($name, $values); + } catch (AlreadyExistsException $e) { + $this->addError($e->getMessage()); + return false; + } + } else { + $successNotification = $this->translate('TTS integration updated'); + try { + $this->update($name, $values, $this->boundIntegration); + } catch (IcingaException $e) { + // Exception may be AlreadyExistsException or NotFoundError + $this->addError($e->getMessage()); + return false; + } + } + if ($this->save()) { + Notification::success($successNotification); + return true; + } + return false; + } + + /** + * Add a TTS integration + * + * @param string $name The name of the integration + * @param array $values + * + * @return $this + * + * @throws AlreadyExistsException If the integration to add already exists + */ + public function add($name, array $values) + { + if ($this->config->hasSection($name)) { + throw new AlreadyExistsException( + $this->translate('Can\'t add integration \'%s\'. Integration already exists'), + $name + ); + } + $this->config->setSection($name, $values); + return $this; + } + + /** + * Bind integration to this form + * + * @param string $name The name of the integration + * + * @return $this + * + * @throws NotFoundError If the given integration does not exist + */ + public function bind($name) + { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t load integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->boundIntegration = $name; + $integration = $this->config->getSection($name)->toArray(); + $integration['name'] = $name; + $this->populate($integration); + return $this; + } + + /** + * Remove a TTS integration + * + * @param string $name The name of the integration + * + * @return $this + * + * @throws NotFoundError If the role does not exist + */ + public function remove($name) + { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t remove integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->config->removeSection($name); + return $this; + } + + /** + * Update a TTS integration + * + * @param string $name The possibly new name of the integration + * @param array $values + * @param string $oldName The name of the integration to update + * + * @return $this + * + * @throws NotFoundError If the integration to update does not exist + */ + public function update($name, array $values, $oldName) + { + if ($name !== $oldName) { + // The integration got a new name + $this->remove($oldName); + $this->add($name, $values); + } else { + if (! $this->config->hasSection($name)) { + throw new NotFoundError( + $this->translate('Can\'t update integration \'%s\'. Integration does not exist'), + $name + ); + } + $this->config->setSection($name, $values); + } + return $this; + } +} -- cgit v1.2.3