From af7a1c3529472d4bff16cbcef018657d3ddd8887 Mon Sep 17 00:00:00 2001 From: colemanw Date: Fri, 25 Aug 2023 16:04:38 -0400 Subject: [PATCH] Add pseudoconstant suffixes to xml/dao This makes suffixes more available outside APIv4, and reduces the necessity of one-off SpecProvider classes --- CRM/Core/CodeGen/Specification.php | 4 ++ CRM/Core/DAO/ActionSchedule.php | 7 +++- CRM/Core/DAO/Address.php | 14 ++++++- CRM/Core/DAO/CustomGroup.php | 12 +++++- CRM/Core/DAO/UserJob.php | 7 +++- .../Provider/ActionScheduleSpecProvider.php | 1 - .../Spec/Provider/AddressGetSpecProvider.php | 5 --- .../Spec/Provider/CustomGroupSpecProvider.php | 40 ------------------- .../Spec/Provider/UserJobSpecProvider.php | 39 ------------------ Civi/Api4/Service/Spec/SpecFormatter.php | 24 ++++++----- .../core/CRM/Afform/DAO/AfformSubmission.php | 10 ++++- .../Provider/AfformSubmissionSpecProvider.php | 37 ----------------- .../schema/CRM/Afform/AfformSubmission.xml | 1 + tests/phpunit/api/v4/Action/GetFieldsTest.php | 19 ++++++++- .../api/v4/Entity/ActionScheduleTest.php | 2 + xml/schema/Core/ActionSchedule.xml | 1 + xml/schema/Core/Address.xml | 6 +++ xml/schema/Core/CustomGroup.xml | 2 + xml/schema/Core/UserJob.xml | 1 + 19 files changed, 95 insertions(+), 137 deletions(-) delete mode 100644 Civi/Api4/Service/Spec/Provider/CustomGroupSpecProvider.php delete mode 100644 Civi/Api4/Service/Spec/Provider/UserJobSpecProvider.php delete mode 100644 ext/afform/core/Civi/Api4/Service/Spec/Provider/AfformSubmissionSpecProvider.php diff --git a/CRM/Core/CodeGen/Specification.php b/CRM/Core/CodeGen/Specification.php index 1a587ca00e..e64367f97b 100644 --- a/CRM/Core/CodeGen/Specification.php +++ b/CRM/Core/CodeGen/Specification.php @@ -497,6 +497,10 @@ class CRM_Core_CodeGen_Specification { if (!isset($field['pseudoconstant']['optionEditPath']) && !empty($field['pseudoconstant']['optionGroupName'])) { $field['pseudoconstant']['optionEditPath'] = 'civicrm/admin/options/' . $field['pseudoconstant']['optionGroupName']; } + // Set suffixes if explicitly declared + if (!empty($fieldXML->pseudoconstant->suffixes)) { + $field['pseudoconstant']['suffixes'] = explode(',', $this->value('suffixes', $fieldXML->pseudoconstant)); + } // For now, fields that have option lists that are not in the db can simply // declare an empty pseudoconstant tag and we'll add this placeholder. // That field's BAO::buildOptions fn will need to be responsible for generating the option list diff --git a/CRM/Core/DAO/ActionSchedule.php b/CRM/Core/DAO/ActionSchedule.php index 9e24ae319e..f75590e064 100644 --- a/CRM/Core/DAO/ActionSchedule.php +++ b/CRM/Core/DAO/ActionSchedule.php @@ -6,7 +6,7 @@ * * Generated from xml/schema/CRM/Core/ActionSchedule.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:38a9760142f9745025ef828989f73eec) + * (GenCodeChecksum:7cd61559377e23d6ad4c833616f22a12) */ /** @@ -1145,6 +1145,11 @@ class CRM_Core_DAO_ActionSchedule extends CRM_Core_DAO { ], 'pseudoconstant' => [ 'callback' => 'CRM_Core_BAO_ActionSchedule::getMappingOptions', + 'suffixes' => [ + 'name', + 'label', + 'icon', + ], ], 'add' => '3.4', ], diff --git a/CRM/Core/DAO/Address.php b/CRM/Core/DAO/Address.php index d6daae7227..c70f36ea36 100644 --- a/CRM/Core/DAO/Address.php +++ b/CRM/Core/DAO/Address.php @@ -6,7 +6,7 @@ * * Generated from xml/schema/CRM/Core/Address.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:93cff77485ca748e88906bcb5d61bf22) + * (GenCodeChecksum:7fed80f6afc84e71f18055294868044d) */ /** @@ -789,6 +789,10 @@ class CRM_Core_DAO_Address extends CRM_Core_DAO { 'keyColumn' => 'id', 'labelColumn' => 'name', 'abbrColumn' => 'abbreviation', + 'suffixes' => [ + 'label', + 'abbr', + ], ], 'add' => '1.1', ], @@ -820,6 +824,10 @@ class CRM_Core_DAO_Address extends CRM_Core_DAO { 'keyColumn' => 'id', 'labelColumn' => 'name', 'abbrColumn' => 'abbreviation', + 'suffixes' => [ + 'label', + 'abbr', + ], ], 'add' => '1.1', ], @@ -926,6 +934,10 @@ class CRM_Core_DAO_Address extends CRM_Core_DAO { 'labelColumn' => 'name', 'nameColumn' => 'iso_code', 'abbrColumn' => 'iso_code', + 'suffixes' => [ + 'label', + 'abbr', + ], ], 'add' => '1.1', ], diff --git a/CRM/Core/DAO/CustomGroup.php b/CRM/Core/DAO/CustomGroup.php index af79e781f7..17c0bd8922 100644 --- a/CRM/Core/DAO/CustomGroup.php +++ b/CRM/Core/DAO/CustomGroup.php @@ -6,7 +6,7 @@ * * Generated from xml/schema/CRM/Core/CustomGroup.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:7bcb3484fe1ff4d97feddb0d2ad981ec) + * (GenCodeChecksum:7a53822fedde32eeb1089f09654a2d88) */ /** @@ -380,6 +380,11 @@ class CRM_Core_DAO_CustomGroup extends CRM_Core_DAO { ], 'pseudoconstant' => [ 'callback' => 'CRM_Core_BAO_CustomGroup::getCustomGroupExtendsOptions', + 'suffixes' => [ + 'name', + 'label', + 'grouping', + ], ], 'add' => '1.1', ], @@ -406,6 +411,11 @@ class CRM_Core_DAO_CustomGroup extends CRM_Core_DAO { ], 'pseudoconstant' => [ 'callback' => 'CRM_Core_BAO_CustomGroup::getExtendsEntityColumnIdOptions', + 'suffixes' => [ + 'name', + 'label', + 'grouping', + ], ], 'add' => '2.2', ], diff --git a/CRM/Core/DAO/UserJob.php b/CRM/Core/DAO/UserJob.php index 9917b6b120..bde39eeef2 100644 --- a/CRM/Core/DAO/UserJob.php +++ b/CRM/Core/DAO/UserJob.php @@ -6,7 +6,7 @@ * * Generated from xml/schema/CRM/Core/UserJob.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:290ce6f8908a1dfc1590534029171f41) + * (GenCodeChecksum:03487d9109a74e0f60ee656055d205f7) */ /** @@ -395,6 +395,11 @@ class CRM_Core_DAO_UserJob extends CRM_Core_DAO { ], 'pseudoconstant' => [ 'callback' => 'CRM_Core_BAO_UserJob::getTypes', + 'suffixes' => [ + 'name', + 'label', + 'url', + ], ], 'add' => '5.50', ], diff --git a/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php b/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php index df7bc7c583..01e84cb3f2 100644 --- a/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php +++ b/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php @@ -43,7 +43,6 @@ class ActionScheduleSpecProvider extends \Civi\Core\Service\AutoService implemen $spec->getFieldByName('repetition_frequency_interval')->setRequiredIf('!empty($values.is_repeat)'); $spec->getFieldByName('end_frequency_interval')->setRequiredIf('!empty($values.is_repeat)'); } - $spec->getFieldByName('mapping_id')->setSuffixes(['name', 'label', 'icon']); } /** diff --git a/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php b/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php index 82cdd50cf6..9c66e59627 100644 --- a/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php +++ b/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php @@ -27,11 +27,6 @@ class AddressGetSpecProvider extends \Civi\Core\Service\AutoService implements G * @param \Civi\Api4\Service\Spec\RequestSpec $spec */ public function modifySpec(RequestSpec $spec) { - // These fields do not have any sensible "name" pseudoconstant so should just use the ID - foreach (['state_province_id', 'country_id', 'county_id'] as $name) { - $spec->getFieldByName($name)->setSuffixes(['label', 'abbr']); - } - // Proximity search field $field = new FieldSpec('proximity', 'Address', 'Boolean'); $field->setLabel(ts('Address Proximity')) diff --git a/Civi/Api4/Service/Spec/Provider/CustomGroupSpecProvider.php b/Civi/Api4/Service/Spec/Provider/CustomGroupSpecProvider.php deleted file mode 100644 index 9d967305d8..0000000000 --- a/Civi/Api4/Service/Spec/Provider/CustomGroupSpecProvider.php +++ /dev/null @@ -1,40 +0,0 @@ -getAction(); - - $spec->getFieldByName('extends') - ->setSuffixes(['name', 'label', 'grouping']); - } - - /** - * @inheritDoc - */ - public function applies($entity, $action) { - return $entity === 'CustomGroup'; - } - -} diff --git a/Civi/Api4/Service/Spec/Provider/UserJobSpecProvider.php b/Civi/Api4/Service/Spec/Provider/UserJobSpecProvider.php deleted file mode 100644 index e15274f755..0000000000 --- a/Civi/Api4/Service/Spec/Provider/UserJobSpecProvider.php +++ /dev/null @@ -1,39 +0,0 @@ -getFieldByName('job_type') - ->setSuffixes(['name', 'label', 'url']); - } - - /** - * @inheritDoc - */ - public function applies($entity, $action): bool { - return $entity === 'UserJob'; - } - -} diff --git a/Civi/Api4/Service/Spec/SpecFormatter.php b/Civi/Api4/Service/Spec/SpecFormatter.php index 56f41d0fa7..df137568e3 100644 --- a/Civi/Api4/Service/Spec/SpecFormatter.php +++ b/Civi/Api4/Service/Spec/SpecFormatter.php @@ -72,16 +72,22 @@ class SpecFormatter { if (($data['pseudoconstant']['prefetch'] ?? NULL) !== 'disabled') { $field->setOptionsCallback([__CLASS__, 'getOptions']); } - // These suffixes are always supported if a field has options - $suffixes = ['name', 'label']; - // Add other columns specified in schema (e.g. 'abbrColumn') - foreach (array_diff(FormattingUtil::$pseudoConstantSuffixes, $suffixes) as $suffix) { - if (!empty($data['pseudoconstant'][$suffix . 'Column'])) { - $suffixes[] = $suffix; - } + // Explicitly declared suffixes + if (!empty($data['pseudoconstant']['suffixes'])) { + $suffixes = $data['pseudoconstant']['suffixes']; } - if (!empty($data['pseudoconstant']['optionGroupName'])) { - $suffixes = CoreUtil::getOptionValueFields($data['pseudoconstant']['optionGroupName'], 'name'); + else { + // These suffixes are always supported if a field has options + $suffixes = ['name', 'label']; + // Add other columns specified in schema (e.g. 'abbrColumn') + foreach (array_diff(FormattingUtil::$pseudoConstantSuffixes, $suffixes) as $suffix) { + if (!empty($data['pseudoconstant'][$suffix . 'Column'])) { + $suffixes[] = $suffix; + } + } + if (!empty($data['pseudoconstant']['optionGroupName'])) { + $suffixes = CoreUtil::getOptionValueFields($data['pseudoconstant']['optionGroupName'], 'name'); + } } $field->setSuffixes($suffixes); } diff --git a/ext/afform/core/CRM/Afform/DAO/AfformSubmission.php b/ext/afform/core/CRM/Afform/DAO/AfformSubmission.php index 8b922ae2b2..4a9a953969 100644 --- a/ext/afform/core/CRM/Afform/DAO/AfformSubmission.php +++ b/ext/afform/core/CRM/Afform/DAO/AfformSubmission.php @@ -6,7 +6,7 @@ * * Generated from org.civicrm.afform/xml/schema/CRM/Afform/AfformSubmission.xml * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:902b3352193d9030fdf583f4a1f2204f) + * (GenCodeChecksum:a617b263eb7f1a2fcb6fb259c62d6fba) */ use CRM_Afform_ExtensionUtil as E; @@ -189,6 +189,14 @@ class CRM_Afform_DAO_AfformSubmission extends CRM_Core_DAO { ], 'pseudoconstant' => [ 'callback' => 'CRM_Afform_BAO_AfformSubmission::getAllAfformsByName', + 'suffixes' => [ + 'name', + 'label', + 'description', + 'abbr', + 'icon', + 'url', + ], ], 'add' => '5.41', ], diff --git a/ext/afform/core/Civi/Api4/Service/Spec/Provider/AfformSubmissionSpecProvider.php b/ext/afform/core/Civi/Api4/Service/Spec/Provider/AfformSubmissionSpecProvider.php deleted file mode 100644 index a43f5ed0c3..0000000000 --- a/ext/afform/core/Civi/Api4/Service/Spec/Provider/AfformSubmissionSpecProvider.php +++ /dev/null @@ -1,37 +0,0 @@ -getFieldByName('afform_name')->setSuffixes(['name', 'label', 'description', 'abbr', 'icon', 'url']); - } - - /** - * @inheritDoc - */ - public function applies($entity, $action) { - return $entity === 'AfformSubmission'; - } - -} diff --git a/ext/afform/core/xml/schema/CRM/Afform/AfformSubmission.xml b/ext/afform/core/xml/schema/CRM/Afform/AfformSubmission.xml index 655f1699ec..70c12a6783 100644 --- a/ext/afform/core/xml/schema/CRM/Afform/AfformSubmission.xml +++ b/ext/afform/core/xml/schema/CRM/Afform/AfformSubmission.xml @@ -52,6 +52,7 @@ 5.41 CRM_Afform_BAO_AfformSubmission::getAllAfformsByName + name,label,description,abbr,icon,url diff --git a/tests/phpunit/api/v4/Action/GetFieldsTest.php b/tests/phpunit/api/v4/Action/GetFieldsTest.php index f7ea5d8c63..13d52c45e2 100644 --- a/tests/phpunit/api/v4/Action/GetFieldsTest.php +++ b/tests/phpunit/api/v4/Action/GetFieldsTest.php @@ -21,11 +21,14 @@ namespace api\v4\Action; use api\v4\Api4TestBase; use Civi\Api4\Activity; +use Civi\Api4\Address; use Civi\Api4\Campaign; use Civi\Api4\Contact; use Civi\Api4\Contribution; +use Civi\Api4\CustomGroup; use Civi\Api4\Email; use Civi\Api4\EntityTag; +use Civi\Api4\UserJob; use Civi\Api4\Utils\CoreUtil; use Civi\Test\TransactionalInterface; @@ -139,11 +142,25 @@ class GetFieldsTest extends Api4TestBase implements TransactionalInterface { public function testGetSuffixes() { $actFields = Activity::getFields(FALSE) ->execute()->indexBy('name'); - $this->assertEquals(['name', 'label', 'description'], $actFields['engagement_level']['suffixes']); $this->assertEquals(['name', 'label', 'description', 'icon'], $actFields['activity_type_id']['suffixes']); $this->assertEquals(['name', 'label', 'description', 'color'], $actFields['status_id']['suffixes']); $this->assertEquals(['name', 'label', 'description', 'color'], $actFields['tags']['suffixes']); + + $addressFields = Address::getFields(FALSE) + ->execute()->indexBy('name'); + $this->assertEquals(['label', 'abbr'], $addressFields['country_id']['suffixes']); + $this->assertEquals(['label', 'abbr'], $addressFields['county_id']['suffixes']); + $this->assertEquals(['label', 'abbr'], $addressFields['state_province_id']['suffixes']); + + $customGroupFields = CustomGroup::getFields(FALSE) + ->execute()->indexBy('name'); + $this->assertEquals(['name', 'label', 'grouping'], $customGroupFields['extends']['suffixes']); + $this->assertEquals(['name', 'label', 'grouping'], $customGroupFields['extends_entity_column_id']['suffixes']); + + $userJobFields = UserJob::getFields(FALSE) + ->execute()->indexBy('name'); + $this->assertEquals(['name', 'label', 'url'], $userJobFields['job_type']['suffixes']); } public function testDynamicFks() { diff --git a/tests/phpunit/api/v4/Entity/ActionScheduleTest.php b/tests/phpunit/api/v4/Entity/ActionScheduleTest.php index bd129bf8d4..2388fd7dce 100644 --- a/tests/phpunit/api/v4/Entity/ActionScheduleTest.php +++ b/tests/phpunit/api/v4/Entity/ActionScheduleTest.php @@ -42,6 +42,8 @@ class ActionScheduleTest extends Api4TestBase { $this->assertEquals('limit', $fields['limit_to']['options'][0]['name']); $this->assertEquals('2', $fields['limit_to']['options'][1]['id']); $this->assertEquals('add', $fields['limit_to']['options'][1]['name']); + + $this->assertEquals(['name', 'label', 'icon'], $fields['mapping_id']['suffixes']); } public function testGetFieldsForActivity(): void { diff --git a/xml/schema/Core/ActionSchedule.xml b/xml/schema/Core/ActionSchedule.xml index 35b463d16c..9063c21e40 100644 --- a/xml/schema/Core/ActionSchedule.xml +++ b/xml/schema/Core/ActionSchedule.xml @@ -379,6 +379,7 @@ CRM_Core_BAO_ActionSchedule::getMappingOptions + name,label,icon Name/ID of the mapping to use on this table 3.4 diff --git a/xml/schema/Core/Address.xml b/xml/schema/Core/Address.xml index f9f06ed27c..97199ff588 100644 --- a/xml/schema/Core/Address.xml +++ b/xml/schema/Core/Address.xml @@ -273,6 +273,8 @@ id name abbreviation + + label,abbr ChainSelect @@ -301,6 +303,8 @@ id name abbreviation + + label,abbr province @@ -372,6 +376,8 @@ name iso_code iso_code + + label,abbr country diff --git a/xml/schema/Core/CustomGroup.xml b/xml/schema/Core/CustomGroup.xml index 186c9c60d5..95f67f66b2 100644 --- a/xml/schema/Core/CustomGroup.xml +++ b/xml/schema/Core/CustomGroup.xml @@ -63,6 +63,7 @@ 1.1 CRM_Core_BAO_CustomGroup::getCustomGroupExtendsOptions + name,label,grouping Select @@ -76,6 +77,7 @@ FK to civicrm_option_value.id (for option group custom_data_type.) CRM_Core_BAO_CustomGroup::getExtendsEntityColumnIdOptions + name,label,grouping 2.2 diff --git a/xml/schema/Core/UserJob.xml b/xml/schema/Core/UserJob.xml index 53a66964d9..bdd196a9c9 100644 --- a/xml/schema/Core/UserJob.xml +++ b/xml/schema/Core/UserJob.xml @@ -132,6 +132,7 @@ CRM_Core_BAO_UserJob::getTypes + name,label,url 5.50 -- 2.25.1