@@ -435,7 +435,7 @@ def delete_role(self, role_name: str) -> dict:
435
435
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
436
436
"""
437
437
return self ._admin_request (url = f'{ self .roles_uri } /{ role_name } ' , method = HTTPMethod .DELETE )
438
-
438
+
439
439
@result_or_error (response_model = KeycloakGroup , is_list = True )
440
440
def get_all_groups (self ) -> List [KeycloakGroup ]:
441
441
""" Get all base groups of the Keycloak realm
@@ -446,8 +446,8 @@ def get_all_groups(self) -> List[KeycloakGroup]:
446
446
Raises:
447
447
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
448
448
"""
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
+
451
451
@result_or_error (response_model = KeycloakGroup , is_list = True )
452
452
def get_groups (self , group_names : List [str ]) -> List [KeycloakGroup ] or None :
453
453
""" 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:
464
464
if group_names is None :
465
465
return None
466
466
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
+
469
469
def get_subgroups (self , group : KeycloakGroup , path : str ):
470
470
"""Utility function to iterate through nested group structures
471
471
@@ -485,7 +485,7 @@ def get_subgroups(self, group: KeycloakGroup, path: str):
485
485
return subgroups
486
486
# Went through the tree without hits
487
487
return None
488
-
488
+
489
489
@result_or_error (response_model = KeycloakGroup )
490
490
def get_group_by_path (self , path : str , search_in_subgroups = True ) -> KeycloakGroup or None :
491
491
""" Return Group based on path
@@ -501,7 +501,7 @@ def get_group_by_path(self, path: str, search_in_subgroups=True) -> KeycloakGrou
501
501
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
502
502
"""
503
503
groups = self .get_all_groups ()
504
-
504
+
505
505
for group in groups :
506
506
if group .path == path :
507
507
return group
@@ -512,7 +512,7 @@ def get_group_by_path(self, path: str, search_in_subgroups=True) -> KeycloakGrou
512
512
res = self .get_subgroups (group , path )
513
513
if res is not None :
514
514
return res
515
-
515
+
516
516
@result_or_error (response_model = KeycloakGroup )
517
517
def get_group (self , group_id : str ) -> KeycloakGroup or None :
518
518
""" Return Group based on group id
@@ -530,8 +530,8 @@ def get_group(self, group_id: str) -> KeycloakGroup or None:
530
530
Raises:
531
531
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
532
532
"""
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
+
535
535
@result_or_error (response_model = KeycloakGroup )
536
536
def create_group (self , group_name : str , parent : Union [KeycloakGroup , str ] = None ) -> KeycloakGroup :
537
537
""" Create a group on the realm
@@ -546,24 +546,24 @@ def create_group(self, group_name: str, parent: Union[KeycloakGroup, str] = None
546
546
Raises:
547
547
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
548
548
"""
549
-
549
+
550
550
# If it's an objetc id get an instance of the object
551
551
if isinstance (parent , str ):
552
552
parent = self .get_group (parent )
553
-
553
+
554
554
if parent is not None :
555
555
groups_uri = f'{ self .groups_uri } /{ parent .id } /children'
556
556
path = f'{ parent .path } /{ group_name } '
557
557
else :
558
558
groups_uri = self .groups_uri
559
559
path = f'/{ group_name } '
560
-
560
+
561
561
response = self ._admin_request (url = groups_uri , data = {'name' : group_name }, method = HTTPMethod .POST )
562
562
if response .status_code == 201 :
563
563
return self .get_group_by_path (path = path , search_in_subgroups = True )
564
564
else :
565
- return response
566
-
565
+ return response
566
+
567
567
@result_or_error ()
568
568
def delete_group (self , group_id : str ) -> dict :
569
569
""" Deletes a group on the realm
@@ -577,7 +577,7 @@ def delete_group(self, group_id: str) -> dict:
577
577
Raises:
578
578
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
579
579
"""
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 )
581
581
582
582
@result_or_error ()
583
583
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]:
609
609
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
610
610
"""
611
611
return self ._admin_request (url = f'{ self .users_uri } /{ user_id } /groups' , method = HTTPMethod .GET )
612
-
612
+
613
613
@result_or_error ()
614
614
def remove_user_group (self , user_id : str , group_id : str ) -> dict :
615
615
""" Remove group from a specific user
@@ -624,7 +624,7 @@ def remove_user_group(self, user_id: str, group_id: str) -> dict:
624
624
Raises:
625
625
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
626
626
"""
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 )
628
628
629
629
@result_or_error (response_model = KeycloakUser )
630
630
def create_user (
@@ -660,13 +660,16 @@ def create_user(
660
660
Raises:
661
661
KeycloakError: If the resulting response is not a successful HTTP-Code (>299)
662
662
"""
663
+ initial_roles = self .get_roles (initial_roles )
664
+ initial_roles_json = [role .dict () for role in initial_roles ]
665
+
663
666
data = {
664
667
"email" : email ,
665
668
"username" : username ,
666
669
"firstName" : first_name ,
667
670
"lastName" : last_name ,
668
671
"enabled" : enabled ,
669
- "clientRoles" : self . get_roles ( initial_roles ) ,
672
+ "clientRoles" : initial_roles_json ,
670
673
"credentials" : [
671
674
{
672
675
"temporary" : False ,
@@ -939,7 +942,7 @@ def users_uri(self):
939
942
def roles_uri (self ):
940
943
""" The roles endpoint URL """
941
944
return self .admin_uri (resource = "roles" )
942
-
945
+
943
946
@functools .cached_property
944
947
def groups_uri (self ):
945
948
""" The groups endpoint URL """
0 commit comments