From 3306cfb338463b3bc68983e994e57f32c941f472 Mon Sep 17 00:00:00 2001 From: Gleb Lysov <17965301+hardenchant@users.noreply.github.com> Date: Mon, 12 May 2025 13:17:58 +0300 Subject: [PATCH 1/4] feat: adds support for group get all roles endpoint --- src/keycloak/keycloak_admin.py | 38 ++++++++++++++++++++++++++++++++++ src/keycloak/urls_patterns.py | 3 +++ 2 files changed, 41 insertions(+) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index 3af3319..1d5bec2 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -3993,6 +3993,25 @@ class KeycloakAdmin: ) return raise_error_from_response(data_raw, KeycloakGetError) + def get_all_roles_of_group(self, group_id: str, brief_representation: bool = True) -> dict: + """ + Get all roles of a group. + + :param group_id: id of the group + :type group_id: str + :param brief_representation: whether to omit role attributes in the response + :type brief_representation: bool + :return: Keycloak server response + :rtype: list + """ + params_path = {"realm-name": self.connection.realm_name, "id": group_id} + params = {"briefRepresentation": brief_representation} + data_raw = self.connection.raw_get( + urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), + **params + ) + return raise_error_from_response(data_raw, KeycloakGetError) + def delete_group_client_roles(self, group_id: str, client_id: str, roles: str | list) -> bytes: """ Delete client roles of a group. @@ -9278,6 +9297,25 @@ class KeycloakAdmin: ) return raise_error_from_response(data_raw, KeycloakGetError) + async def a_get_all_roles_of_group(self, group_id: str, brief_representation: bool = True) -> dict: + """ + Get all roles of a group asynchronously. + + :param group_id: id of the group + :type group_id: str + :param brief_representation: whether to omit role attributes in the response + :type brief_representation: bool + :return: Keycloak server response + :rtype: list + """ + params_path = {"realm-name": self.connection.realm_name, "id": group_id} + params = {"briefRepresentation": brief_representation} + data_raw = await self.connection.a_raw_get( + urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), + **params + ) + return raise_error_from_response(data_raw, KeycloakGetError) + async def a_delete_group_client_roles( self, group_id: str, diff --git a/src/keycloak/urls_patterns.py b/src/keycloak/urls_patterns.py index aa36810..05b2d39 100644 --- a/src/keycloak/urls_patterns.py +++ b/src/keycloak/urls_patterns.py @@ -62,6 +62,9 @@ URL_ADMIN_USER_REALM_ROLES_AVAILABLE = ( URL_ADMIN_USER_REALM_ROLES_COMPOSITE = ( "admin/realms/{realm-name}/users/{id}/role-mappings/realm/composite" ) +URL_ADMIN_GROUP_ALL_ROLES = ( + "admin/realms/{realm-name}/groups/{id}/role-mappings" +) URL_ADMIN_GROUPS_REALM_ROLES = "admin/realms/{realm-name}/groups/{id}/role-mappings/realm" URL_ADMIN_GROUPS_CLIENT_ROLES = ( "admin/realms/{realm-name}/groups/{id}/role-mappings/clients/{client-id}" From 1bf5af353d8648464f8af7a486ab7cbb9b213024 Mon Sep 17 00:00:00 2001 From: Gleb Lysov <17965301+hardenchant@users.noreply.github.com> Date: Mon, 12 May 2025 13:28:26 +0300 Subject: [PATCH 2/4] chore: fix linting issue --- src/keycloak/keycloak_admin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index 1d5bec2..a88448b 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -9297,7 +9297,11 @@ class KeycloakAdmin: ) return raise_error_from_response(data_raw, KeycloakGetError) - async def a_get_all_roles_of_group(self, group_id: str, brief_representation: bool = True) -> dict: + async def a_get_all_roles_of_group( + self, + group_id: str, + brief_representation: bool = True + ) -> dict: """ Get all roles of a group asynchronously. From acce6394b0f0569341b37ba1bf51c87a87dbc717 Mon Sep 17 00:00:00 2001 From: Gleb Lysov <17965301+hardenchant@users.noreply.github.com> Date: Mon, 12 May 2025 13:30:40 +0300 Subject: [PATCH 3/4] chore: fix reformatting issue --- src/keycloak/urls_patterns.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/keycloak/urls_patterns.py b/src/keycloak/urls_patterns.py index 05b2d39..4bac8f3 100644 --- a/src/keycloak/urls_patterns.py +++ b/src/keycloak/urls_patterns.py @@ -62,9 +62,7 @@ URL_ADMIN_USER_REALM_ROLES_AVAILABLE = ( URL_ADMIN_USER_REALM_ROLES_COMPOSITE = ( "admin/realms/{realm-name}/users/{id}/role-mappings/realm/composite" ) -URL_ADMIN_GROUP_ALL_ROLES = ( - "admin/realms/{realm-name}/groups/{id}/role-mappings" -) +URL_ADMIN_GROUP_ALL_ROLES = "admin/realms/{realm-name}/groups/{id}/role-mappings" URL_ADMIN_GROUPS_REALM_ROLES = "admin/realms/{realm-name}/groups/{id}/role-mappings/realm" URL_ADMIN_GROUPS_CLIENT_ROLES = ( "admin/realms/{realm-name}/groups/{id}/role-mappings/clients/{client-id}" From ccf2ede92d456024e8d56e2cc99209b1f945acf9 Mon Sep 17 00:00:00 2001 From: Gleb Lysov <17965301+hardenchant@users.noreply.github.com> Date: Mon, 12 May 2025 13:32:39 +0300 Subject: [PATCH 4/4] chore: fix reformatting issue --- src/keycloak/keycloak_admin.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index a88448b..7ec682a 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -4007,8 +4007,7 @@ class KeycloakAdmin: params_path = {"realm-name": self.connection.realm_name, "id": group_id} params = {"briefRepresentation": brief_representation} data_raw = self.connection.raw_get( - urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), - **params + urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), **params ) return raise_error_from_response(data_raw, KeycloakGetError) @@ -9298,9 +9297,7 @@ class KeycloakAdmin: return raise_error_from_response(data_raw, KeycloakGetError) async def a_get_all_roles_of_group( - self, - group_id: str, - brief_representation: bool = True + self, group_id: str, brief_representation: bool = True ) -> dict: """ Get all roles of a group asynchronously. @@ -9315,8 +9312,7 @@ class KeycloakAdmin: params_path = {"realm-name": self.connection.realm_name, "id": group_id} params = {"briefRepresentation": brief_representation} data_raw = await self.connection.a_raw_get( - urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), - **params + urls_patterns.URL_ADMIN_GROUP_ALL_ROLES.format(**params_path), **params ) return raise_error_from_response(data_raw, KeycloakGetError)