Skip to content
This repository was archived by the owner on Mar 16, 2024. It is now read-only.

Commit 508b811

Browse files
yannicschroeerYannic Schröer
andauthored
fix the serialization issue with the initial roles when creating a new user (#31)
Co-authored-by: Yannic Schröer <[email protected]>
1 parent 965c1e0 commit 508b811

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

fastapi_keycloak/api.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ def delete_role(self, role_name: str) -> dict:
435435
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
436436
"""
437437
return self._admin_request(url=f'{self.roles_uri}/{role_name}', method=HTTPMethod.DELETE)
438-
438+
439439
@result_or_error(response_model=KeycloakGroup, is_list=True)
440440
def get_all_groups(self) -> List[KeycloakGroup]:
441441
""" Get all base groups of the Keycloak realm
@@ -446,8 +446,8 @@ def get_all_groups(self) -> List[KeycloakGroup]:
446446
Raises:
447447
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
448448
"""
449-
return self._admin_request(url=self.groups_uri, method=HTTPMethod.GET)
450-
449+
return self._admin_request(url=self.groups_uri, method=HTTPMethod.GET)
450+
451451
@result_or_error(response_model=KeycloakGroup, is_list=True)
452452
def get_groups(self, group_names: List[str]) -> List[KeycloakGroup] or None:
453453
""" Returns full entries of base Groups based on group names
@@ -464,8 +464,8 @@ def get_groups(self, group_names: List[str]) -> List[KeycloakGroup] or None:
464464
if group_names is None:
465465
return None
466466
groups = self.get_all_groups()
467-
return list(filter(lambda group: group.name in group_names, groups))
468-
467+
return list(filter(lambda group: group.name in group_names, groups))
468+
469469
def get_subgroups(self, group: KeycloakGroup, path: str):
470470
"""Utility function to iterate through nested group structures
471471
@@ -485,7 +485,7 @@ def get_subgroups(self, group: KeycloakGroup, path: str):
485485
return subgroups
486486
# Went through the tree without hits
487487
return None
488-
488+
489489
@result_or_error(response_model=KeycloakGroup)
490490
def get_group_by_path(self, path: str, search_in_subgroups=True) -> KeycloakGroup or None:
491491
""" Return Group based on path
@@ -501,7 +501,7 @@ def get_group_by_path(self, path: str, search_in_subgroups=True) -> KeycloakGrou
501501
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
502502
"""
503503
groups = self.get_all_groups()
504-
504+
505505
for group in groups:
506506
if group.path == path:
507507
return group
@@ -512,7 +512,7 @@ def get_group_by_path(self, path: str, search_in_subgroups=True) -> KeycloakGrou
512512
res = self.get_subgroups(group, path)
513513
if res is not None:
514514
return res
515-
515+
516516
@result_or_error(response_model=KeycloakGroup)
517517
def get_group(self, group_id: str) -> KeycloakGroup or None:
518518
""" Return Group based on group id
@@ -530,8 +530,8 @@ def get_group(self, group_id: str) -> KeycloakGroup or None:
530530
Raises:
531531
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
532532
"""
533-
return self._admin_request(url=f'{self.groups_uri}/{group_id}', method=HTTPMethod.GET)
534-
533+
return self._admin_request(url=f'{self.groups_uri}/{group_id}', method=HTTPMethod.GET)
534+
535535
@result_or_error(response_model=KeycloakGroup)
536536
def create_group(self, group_name: str, parent: Union[KeycloakGroup, str] = None) -> KeycloakGroup:
537537
""" Create a group on the realm
@@ -546,24 +546,24 @@ def create_group(self, group_name: str, parent: Union[KeycloakGroup, str] = None
546546
Raises:
547547
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
548548
"""
549-
549+
550550
# If it's an objetc id get an instance of the object
551551
if isinstance(parent, str):
552552
parent = self.get_group(parent)
553-
553+
554554
if parent is not None:
555555
groups_uri = f'{self.groups_uri}/{parent.id}/children'
556556
path = f'{parent.path}/{group_name}'
557557
else:
558558
groups_uri = self.groups_uri
559559
path = f'/{group_name}'
560-
560+
561561
response = self._admin_request(url=groups_uri, data={'name': group_name}, method=HTTPMethod.POST)
562562
if response.status_code == 201:
563563
return self.get_group_by_path(path=path, search_in_subgroups=True)
564564
else:
565-
return response
566-
565+
return response
566+
567567
@result_or_error()
568568
def delete_group(self, group_id: str) -> dict:
569569
""" Deletes a group on the realm
@@ -577,7 +577,7 @@ def delete_group(self, group_id: str) -> dict:
577577
Raises:
578578
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
579579
"""
580-
return self._admin_request(url=f'{self.groups_uri}/{group_id}', method=HTTPMethod.DELETE)
580+
return self._admin_request(url=f'{self.groups_uri}/{group_id}', method=HTTPMethod.DELETE)
581581

582582
@result_or_error()
583583
def add_user_group(self, user_id: str, group_id: str) -> dict:
@@ -609,7 +609,7 @@ def get_user_groups(self, user_id: str) -> List[KeycloakGroup]:
609609
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
610610
"""
611611
return self._admin_request(url=f'{self.users_uri}/{user_id}/groups', method=HTTPMethod.GET)
612-
612+
613613
@result_or_error()
614614
def remove_user_group(self, user_id: str, group_id: str) -> dict:
615615
""" Remove group from a specific user
@@ -624,7 +624,7 @@ def remove_user_group(self, user_id: str, group_id: str) -> dict:
624624
Raises:
625625
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
626626
"""
627-
return self._admin_request(url=f'{self.users_uri}/{user_id}/groups/{group_id}', method=HTTPMethod.DELETE)
627+
return self._admin_request(url=f'{self.users_uri}/{user_id}/groups/{group_id}', method=HTTPMethod.DELETE)
628628

629629
@result_or_error(response_model=KeycloakUser)
630630
def create_user(
@@ -660,13 +660,16 @@ def create_user(
660660
Raises:
661661
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
662662
"""
663+
initial_roles = self.get_roles(initial_roles)
664+
initial_roles_json = [role.dict() for role in initial_roles]
665+
663666
data = {
664667
"email": email,
665668
"username": username,
666669
"firstName": first_name,
667670
"lastName": last_name,
668671
"enabled": enabled,
669-
"clientRoles": self.get_roles(initial_roles),
672+
"clientRoles": initial_roles_json,
670673
"credentials": [
671674
{
672675
"temporary": False,
@@ -939,7 +942,7 @@ def users_uri(self):
939942
def roles_uri(self):
940943
""" The roles endpoint URL """
941944
return self.admin_uri(resource="roles")
942-
945+
943946
@functools.cached_property
944947
def groups_uri(self):
945948
""" The groups endpoint URL """

0 commit comments

Comments
 (0)