Skip to content

CFM-474_Pipeline_Toolkit_problems #343

Open
wants to merge 14 commits into
base: develop
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,28 @@
namespace PipelineToolkit\Controller;

use App\Controller\StandardPluginController;
use PipelineToolkit\Model\Table\IdentifierMappersTable;

class LoginIdentifierTypesController extends StandardPluginController {
protected array $paginate = [
'order' => [
'LoginIdentifierTypes.id' => 'asc'
]
];
/**
* Callback before views are rendered.
*
* @param \Cake\Event\EventInterface $event
* @return void
* @since COmanage Registry v5.2.0
*/

public function beforeRender(\Cake\Event\EventInterface $event): void
{
// Used by the parent controller to construct the breadcrumbs
$this->set('vv_pluginClassName', IdentifierMappersTable::class);
$this->set('vv_pluginForeignKey', 'identifier_mapper_id');

parent::beforeRender($event);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

namespace PipelineToolkit\Model\Table;

use App\Model\Entity\Flange;
use Cake\ORM\Table;
use Cake\Validation\Validator;

Expand All @@ -38,6 +39,7 @@ class IdentifierMappersTable extends Table {
use \App\Lib\Traits\LabeledLogTrait;
use \App\Lib\Traits\PermissionsTrait;
use \App\Lib\Traits\PrimaryLinkTrait;
use \App\Lib\Traits\QueryModificationTrait;
use \App\Lib\Traits\TableMetaTrait;
use \App\Lib\Traits\ValidationTrait;

Expand Down Expand Up @@ -68,6 +70,19 @@ public function initialize(array $config): void {
$this->setPrimaryLink(['flange_id']);
$this->setRequiresCO(true);

$this->setViewContains([
'Flanges',
]);

$this->setEditContains([
'Flanges',
]);

// Required for deep Breadcrumb calculations
$this->setIndexContains([
'Flanges',
]);

$this->setPermissions([
// Actions that operate over an entity (ie: require an $id)
'entity' => [
Expand Down Expand Up @@ -135,6 +150,22 @@ public function buildRelatedAttributes(
return $retdata;
}

/**
* Table specific logic to generate a display field.
*
* @since COmanage Registry v5.2.0
* @param \PipelineToolkit\Model\Entity\IdentifierMapper $entity Entity to generate display field for
* @return string|null Display field
*/
public function generateDisplayField(\PipelineToolkit\Model\Entity\IdentifierMapper $entity): ?string {
// Fail gracefully if the Flange association is not set/loaded
if (empty($entity->flange) || empty($entity->flange->description)) {
return null;
}

return $entity->flange->description;
}

/**
* Set validation rules.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class LoginIdentifierTypesTable extends Table {
use \App\Lib\Traits\LabeledLogTrait;
use \App\Lib\Traits\PermissionsTrait;
use \App\Lib\Traits\PrimaryLinkTrait;
use \App\Lib\Traits\QueryModificationTrait;
use \App\Lib\Traits\TableMetaTrait;
use \App\Lib\Traits\ValidationTrait;

Expand Down Expand Up @@ -75,6 +76,14 @@ public function initialize(array $config): void {
]
]);

$this->setViewContains([
'IdentifierMappers' => ['Flanges'],
]);

$this->setEditContains([
'IdentifierMappers' => ['Flanges'],
]);

$this->setPermissions([
// Actions that operate over an entity (ie: require an $id)
'entity' => [
Expand Down Expand Up @@ -109,6 +118,17 @@ public function buildRules(RulesChecker $rules): RulesChecker {
return $rules;
}

/**
* Table specific logic to generate a display field.
*
* @since COmanage Registry v5.2.0
* @param \PipelineToolkit\Model\Entity\LoginIdentifierType $entity Entity to generate display field for
* @return string Display field
*/
public function generateDisplayField(\PipelineToolkit\Model\Entity\LoginIdentifierType $entity): string {
return __d('pipeline_toolkit', 'controller.LoginIdentifierTypes', [1]);
}

/**
* Application Rule to determine if a specific Type is already configured.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,14 @@ protected function getChanges(
* @param \SqlConnector\Model\Entity\SqlSource $entity Entity to generate display field for
* @return string Display field
*/
public function generateDisplayField(\SqlConnector\Model\Entity\SqlSource $entity): string {
return __d('sql_connector', 'display.SqlSource', [$entity->external_identity_source->description]);
public function generateDisplayField(\SqlConnector\Model\Entity\SqlSource $entity): ?string {
// Fail gracefully if the External Identity Source association is not set/loaded
if (empty($entity->external_identity_source) || empty($entity->external_identity_source->description)) {
return null;
}

$value = $entity->external_identity_source->description;
return __d('sql_connector', 'display.SqlSource', [$value]);
}


Expand Down
11 changes: 8 additions & 3 deletions app/plugins/EnvSource/src/Model/Table/EnvSourcesTable.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,15 @@ public function initialize(array $config): void {
*
* @since COmanage Registry v5.2.0
* @param \EnvSource\Model\Entity\EnvSource $entity Entity to generate display field for
* @return string Display field
* @return string|null Display field
*/
public function generateDisplayField(\EnvSource\Model\Entity\EnvSource $entity): string {
return __d('env_source', 'display.EnvSource', [$entity->external_identity_source->description]);
public function generateDisplayField(\EnvSource\Model\Entity\EnvSource $entity): ?string {
// Fail gracefully if the External Identity Source association is not set
if (empty($entity->external_identity_source) || empty($entity->external_identity_source->description)) {
return null;
}
$value = $entity->external_identity_source->description;
return __d('env_source', 'display.EnvSource', [$value]);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,14 @@ public function initialize(array $config): void {
*
* @since COmanage Registry v5.2.0
* @param \SshKeyAuthenticator\Model\Entity\SshKeyAuthenticator $entity Entity to generate display field for
* @return string Display field
* @return string|null Display field
*/
public function generateDisplayField(\SshKeyAuthenticator\Model\Entity\SshKeyAuthenticator $entity): string {
public function generateDisplayField(\SshKeyAuthenticator\Model\Entity\SshKeyAuthenticator $entity): ?string {
// Fail gracefully if the Authenticator is not set
if (empty($entity->authenticator) || empty($entity->authenticator->description)) {
return null;
}

return $entity->authenticator->description;
}

Expand Down
3 changes: 3 additions & 0 deletions app/resources/locales/en_US/error.po
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,9 @@ msgstr "Type {0} is in use as a default (via CO Settings)"
msgid "unknown"
msgstr "Unknown value \"{0}\""

msgid "unresolved.association"
msgstr "Unable to resolve association"

msgid "unknown.identifier"
msgstr "Unknown Identifier \"{0}\""

Expand Down
6 changes: 3 additions & 3 deletions app/resources/locales/en_US/information.po
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ msgid "cos.select"
msgstr "Please select the collaboration (CO) you wish to manage."

msgid "cmp.config.notice"
msgstr "<a href="{0}">Platform-wide configurations</a> are available in the <a href="{1}">COmanage CO</a>."
msgstr "<a href=\"{0}\">Platform-wide configurations</a> are available in the <a href=\"{1}\">COmanage CO</a>."

msgid "cmp.co.notice"
msgstr "This is the COmanage CO, which is used for platform wide <a href="{0}">configurations</a>."
msgstr "This is the COmanage CO, which is used for platform wide <a href=\"{0}\">configurations</a>."

msgid "entity.id"
msgstr "ID: {0}"
Expand Down Expand Up @@ -88,7 +88,7 @@ msgid "ExternalIdentitySourceRecords.metadata"
msgstr "Metadata"

msgid "ExternalIdentitySourceRecords.view"
msgstr "This is the latest record from the source as cached by Registry. <a href="{0}" target="_top">Retrieve the current record directly from the source</a>."
msgstr "This is the latest record from the source as cached by Registry. <a href=\"{0}\" target=\"_top\">Retrieve the current record directly from the source</a>."

msgid "ExternalIdentitySources.search.attrs.none"
msgstr "The External Identity Source cannot be searched."
Expand Down
27 changes: 18 additions & 9 deletions app/src/Controller/AppController.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,11 @@
use App\Lib\Util\StringUtilities;
use Cake\Controller\Controller;
use Cake\Datasource\Exception\RecordNotFoundException;
use Cake\Http\Exception\UnauthorizedException;
use Cake\Event\EventManager;
use Cake\Http\Exception\UnauthorizedException;
use Cake\ORM\TableRegistry;
use Cake\Utility\Hash;


/**
* @property \App\Controller\Component\RegistryAuthComponent $RegistryAuth
* @property \App\Controller\Component\BreadcrumbComponent $Breadcrumb
Expand Down Expand Up @@ -273,17 +272,27 @@ public function getCOID(): ?int {
*/
public function getCurrentTable(): \Cake\ORM\Table
{
/** @var string $modelsName */
$modelsName = $this->getName();
return $this->fetchTable($this->getQualifiedName());
}

$alias = $this->getPlugin() !== null
? $this->getPlugin() . '.' . $modelsName
: $modelsName;
/**
* Get the fully-qualified controller/model name with plugin prefix when present.
*
* Examples:
* - Core controller "Users" => "Users"
* - Plugin controller "MyPlugin.Users" => "MyPlugin.Users"
*
* @since COmanage Registry v5.2.0
* @return string
*/
public function getQualifiedName(): string
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this belong in AppController? It feels more like it belongs in StringUtilities or something?

Copy link
Contributor Author

@Ioannis Ioannis Oct 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think getQualifiedName belongs in AppController because it returns the fully qualified name of the controller handling the current request. It’s also used by getCurrentTable to resolve the correct table. I understand your point and how it relates to your next comment. To that end, I added the Qualified Name calculation to StringUtilities, but kept this method here to avoid repeatedly accessing the plugin and name values. I find this approach cleaner.

{
$name = $this->getName();
$plugin = $this->getPlugin();

return $this->fetchTable($alias);
return StringUtilities::getQualifiedName($plugin, $name);
}


/**
* @param string $potentialPrimaryLink
*
Expand Down
Loading