diff --git a/cumulusci/tasks/preflight/licenses.py b/cumulusci/tasks/preflight/licenses.py index 1c059dbee0..cc40ed1591 100644 --- a/cumulusci/tasks/preflight/licenses.py +++ b/cumulusci/tasks/preflight/licenses.py @@ -16,9 +16,9 @@ def _run_task(self): class GetAvailablePermissionSetLicenses(BaseSalesforceApiTask): def _run_task(self): self.return_values = [ - result["DeveloperName"] + result["PermissionSetLicenseKey"] for result in self.sf.query( - "SELECT DeveloperName FROM PermissionSetLicense" + "SELECT PermissionSetLicenseKey FROM PermissionSetLicense" )["records"] ] licenses = "\n".join(self.return_values) diff --git a/cumulusci/tasks/preflight/tests/test_licenses.py b/cumulusci/tasks/preflight/tests/test_licenses.py index 6df7daff5f..f2cf117ad6 100644 --- a/cumulusci/tasks/preflight/tests/test_licenses.py +++ b/cumulusci/tasks/preflight/tests/test_licenses.py @@ -34,14 +34,14 @@ def test_psl_preflight(self): task._init_api.return_value.query.return_value = { "totalSize": 2, "records": [ - {"DeveloperName": "TEST1"}, - {"DeveloperName": "TEST2"}, + {"PermissionSetLicenseKey": "TEST1"}, + {"PermissionSetLicenseKey": "TEST2"}, ], } task() task._init_api.return_value.query.assert_called_once_with( - "SELECT DeveloperName FROM PermissionSetLicense" + "SELECT PermissionSetLicenseKey FROM PermissionSetLicense" ) assert task.return_values == ["TEST1", "TEST2"] diff --git a/cumulusci/tasks/salesforce/users/permsets.py b/cumulusci/tasks/salesforce/users/permsets.py index 530f9bd4fe..8df9fa0ba6 100644 --- a/cumulusci/tasks/salesforce/users/permsets.py +++ b/cumulusci/tasks/salesforce/users/permsets.py @@ -158,7 +158,7 @@ def _process_composite_results(self, api_results): class AssignPermissionSetLicenses(AssignPermissionSets): task_docs = """ -Assigns Permission Set Licenses whose Developer Names are in ``api_names`` to either the default org user or the user whose Alias is ``user_alias``. This task skips assigning Permission Set Licenses that are already assigned. +Assigns Permission Set Licenses whose Developer Names or PermissionSetLicenseKey are in ``api_names`` to either the default org user or the user whose Alias is ``user_alias``. This task skips assigning Permission Set Licenses that are already assigned. Permission Set Licenses are usually associated with a Permission Set, and assigning the Permission Set usually assigns the associated Permission Set License automatically. However, in non-namespaced developer scratch orgs, assigning the associated Permission Set may not automatically assign the Permission Set License, and this task will ensure the Permission Set Licenses are assigned. """ @@ -174,12 +174,35 @@ class AssignPermissionSetLicenses(AssignPermissionSets): } permission_name = "PermissionSetLicense" - permission_name_field = "DeveloperName" + permission_name_field = ["DeveloperName", "PermissionSetLicenseKey"] permission_label = "Permission Set License" assignment_name = "PermissionSetLicenseAssign" assignment_lookup = "PermissionSetLicenseId" assignment_child_relationship = "PermissionSetLicenseAssignments" + def _get_perm_ids(self): + perms_by_ids = {} + api_names = "', '".join(self.options["api_names"]) + perms = self.sf.query( + f"SELECT Id,{self.permission_name_field[0]},{self.permission_name_field[1]} FROM {self.permission_name} WHERE {self.permission_name_field[0]} IN ('{api_names}') OR {self.permission_name_field[1]} IN ('{api_names}')" + ) + for p in perms["records"]: + if p[self.permission_name_field[0]] in self.options["api_names"]: + perms_by_ids[p["Id"]] = p[self.permission_name_field[0]] + else: + perms_by_ids[p["Id"]] = p[self.permission_name_field[1]] + + missing_perms = [ + api_name + for api_name in self.options["api_names"] + if api_name not in perms_by_ids.values() + ] + if missing_perms: + raise CumulusCIException( + f"The following {self.permission_label}s were not found: {', '.join(missing_perms)}." + ) + return perms_by_ids + class AssignPermissionSetGroups(AssignPermissionSets): task_docs = """ diff --git a/cumulusci/tasks/salesforce/users/tests/test_permsets.py b/cumulusci/tasks/salesforce/users/tests/test_permsets.py index 901a49952c..65b6a97119 100644 --- a/cumulusci/tasks/salesforce/users/tests/test_permsets.py +++ b/cumulusci/tasks/salesforce/users/tests/test_permsets.py @@ -447,19 +447,21 @@ def test_create_permsetlicense(self): ) responses.add( method="GET", - url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", + url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName%2CPermissionSetLicenseKey+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29+OR+PermissionSetLicenseKey+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", status=200, json={ "done": True, - "totalSize": 1, + "totalSize": 2, "records": [ { "Id": "0PL000000000000", "DeveloperName": "PermSetLicense1", + "PermissionSetLicenseKey": "PermSetLicense1", }, { "Id": "0PL000000000001", "DeveloperName": "PermSetLicense2", + "PermissionSetLicenseKey": "PermSetLicense1", }, ], }, @@ -516,19 +518,21 @@ def test_create_permsetlicense__no_assignments(self): ) responses.add( method="GET", - url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", + url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName%2CPermissionSetLicenseKey+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29+OR+PermissionSetLicenseKey+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", status=200, json={ "done": True, - "totalSize": 1, + "totalSize": 2, "records": [ { "Id": "0PL000000000000", "DeveloperName": "PermSetLicense1", + "PermissionSetLicenseKey": "PermSet.License1", }, { "Id": "0PL000000000001", "DeveloperName": "PermSetLicense2", + "PermissionSetLicenseKey": "PermSet.License2", }, ], }, @@ -597,23 +601,26 @@ def test_create_permsetlicense__alias(self): ) responses.add( method="GET", - url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", + url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName%2CPermissionSetLicenseKey+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29+OR+PermissionSetLicenseKey+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%29", status=200, json={ "done": True, - "totalSize": 1, + "totalSize": 2, "records": [ { "Id": "0PL000000000000", "DeveloperName": "PermSetLicense1", + "PermissionSetLicenseKey": "PermSetLicense1", }, { "Id": "0PL000000000001", "DeveloperName": "PermSetLicense2", + "PermissionSetLicenseKey": "PermSetLicense2", }, ], }, ) + responses.add( method="POST", url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/sobjects/PermissionSetLicenseAssign/", @@ -698,7 +705,7 @@ def test_create_permsetlicense_raises(self): ) responses.add( method="GET", - url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%2C+%27PermSetLicense3%27%29", + url=f"{task.org_config.instance_url}/services/data/v{CURRENT_SF_API_VERSION}/query/?q=SELECT+Id%2CDeveloperName%2CPermissionSetLicenseKey+FROM+PermissionSetLicense+WHERE+DeveloperName+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%2C+%27PermSetLicense3%27%29+OR+PermissionSetLicenseKey+IN+%28%27PermSetLicense1%27%2C+%27PermSetLicense2%27%2C+%27PermSetLicense3%27%29", status=200, json={ "done": True, @@ -707,15 +714,16 @@ def test_create_permsetlicense_raises(self): { "Id": "0PL000000000000", "DeveloperName": "PermSetLicense1", + "PermissionSetLicenseKey": "PermSetLicense1", }, { "Id": "0PL000000000001", "DeveloperName": "PermSetLicense2", + "PermissionSetLicenseKey": "PermSetLicense2", }, ], }, ) - with pytest.raises(CumulusCIException): task()