@@ -70,6 +70,47 @@ def _resolve_key(value: str | BaseModel) -> str:
7070 return key
7171
7272
73+ def _coerce_list_payload (payload : Any ) -> list [Any ]:
74+ """Normalize list-like API payloads.
75+
76+ Supports both legacy list responses and paginated envelopes that expose
77+ list items under ``results``.
78+ """
79+ if payload is None :
80+ return []
81+ if isinstance (payload , list ):
82+ return payload
83+ if isinstance (payload , dict ):
84+ results = payload .get ("results" )
85+ if isinstance (results , list ):
86+ return results
87+ return [payload ]
88+ return [payload ]
89+
90+
91+ def _coerce_permission_object_payload (
92+ payload : Any , request_payload : Mapping [str , Any ]
93+ ) -> dict [str , Any ]:
94+ """Normalize permission-object payloads for create operations.
95+
96+ Some API endpoints return `201 Created` with an empty response body.
97+ In that case we reconstruct the object from the original request payload.
98+ """
99+ if isinstance (payload , Mapping ):
100+ data = dict (payload )
101+ if "object_key" not in data and "object" in data :
102+ data ["object_key" ] = data .pop ("object" )
103+ return data
104+
105+ object_key = request_payload .get ("object_key" )
106+ if object_key is None :
107+ object_key = request_payload .get ("object" )
108+ return {
109+ "content_type" : request_payload .get ("content_type" ),
110+ "object_key" : object_key ,
111+ }
112+
113+
73114FolderRef = Union [str , FolderSummary ]
74115ResourceRef = Union [str , ResourceSummary ]
75116RevisionRef = Union [str , RevisionSummary ]
@@ -719,8 +760,10 @@ def list_management_role_permissions(
719760 role_key: Unique identifier of the role.
720761 """
721762 role_key = _resolve_key (role_key )
722- payload = self .request ("GET" , f"{ self ._role_permissions_root (role_key )} /" ) or []
723- return [RolePermission .model_validate (item ) for item in payload ]
763+ payload = self .request ("GET" , f"{ self ._role_permissions_root (role_key )} /" )
764+ return [
765+ RolePermission .model_validate (item ) for item in _coerce_list_payload (payload )
766+ ]
724767
725768 def upsert_management_role_permission (
726769 self ,
@@ -794,9 +837,11 @@ def list_management_permission_objects(
794837 self .request (
795838 "GET" , f"{ self ._role_permission_objects_root (role_key )} /" , params = params
796839 )
797- or []
798840 )
799- return [RolePermissionObject .model_validate (item ) for item in payload ]
841+ return [
842+ RolePermissionObject .model_validate (item )
843+ for item in _coerce_list_payload (payload )
844+ ]
800845
801846 def add_management_permission_object (
802847 self ,
@@ -815,7 +860,9 @@ def add_management_permission_object(
815860 f"{ self ._role_permission_objects_root (role_key )} /" ,
816861 json_body = payload ,
817862 )
818- return RolePermissionObject .model_validate (data )
863+ return RolePermissionObject .model_validate (
864+ _coerce_permission_object_payload (data , payload )
865+ )
819866
820867 def delete_management_permission_object (
821868 self ,
@@ -897,10 +944,10 @@ def list_flux_role_permissions(self, role_key: FluxRoleRef) -> list[RolePermissi
897944 role_key: Unique identifier of the role.
898945 """
899946 role_key = _resolve_key (role_key )
900- payload = (
901- self . request ( "GET" , f" { self . _flux_role_permissions_root ( role_key ) } /" ) or []
902- )
903- return [ RolePermission . model_validate ( item ) for item in payload ]
947+ payload = self . request ( "GET" , f" { self . _flux_role_permissions_root ( role_key ) } /" )
948+ return [
949+ RolePermission . model_validate ( item ) for item in _coerce_list_payload ( payload )
950+ ]
904951
905952 def upsert_flux_role_permission (
906953 self , role_key : FluxRoleRef , payload : Mapping [str , Any ]
@@ -972,9 +1019,11 @@ def list_flux_permission_objects(
9721019 f"{ self ._flux_role_permission_objects_root (role_key )} /" ,
9731020 params = {"content_type" : content_type },
9741021 )
975- or []
9761022 )
977- return [RolePermissionObject .model_validate (item ) for item in payload ]
1023+ return [
1024+ RolePermissionObject .model_validate (item )
1025+ for item in _coerce_list_payload (payload )
1026+ ]
9781027
9791028 def add_flux_permission_object (
9801029 self , role_key : FluxRoleRef , payload : Mapping [str , Any ]
@@ -991,7 +1040,9 @@ def add_flux_permission_object(
9911040 f"{ self ._flux_role_permission_objects_root (role_key )} /" ,
9921041 json_body = payload ,
9931042 )
994- return RolePermissionObject .model_validate (data )
1043+ return RolePermissionObject .model_validate (
1044+ _coerce_permission_object_payload (data , payload )
1045+ )
9951046
9961047 def delete_flux_permission_object (
9971048 self , role_key : FluxRoleRef , payload : Mapping [str , Any ]
@@ -2664,10 +2715,10 @@ async def list_management_role_permissions(
26642715 self , role_key : ManagementRoleRef
26652716 ) -> list [RolePermission ]:
26662717 role_key = _resolve_key (role_key )
2667- payload = (
2668- await self . request ( "GET" , f" { self . _role_permissions_root ( role_key ) } /" ) or []
2669- )
2670- return [ RolePermission . model_validate ( item ) for item in payload ]
2718+ payload = await self . request ( "GET" , f" { self . _role_permissions_root ( role_key ) } /" )
2719+ return [
2720+ RolePermission . model_validate ( item ) for item in _coerce_list_payload ( payload )
2721+ ]
26712722
26722723 async def upsert_management_role_permission (
26732724 self ,
@@ -2716,8 +2767,10 @@ async def list_management_permission_objects(
27162767 f"{ self ._role_permission_objects_root (role_key )} /" ,
27172768 params = {"content_type" : content_type },
27182769 )
2719- payload = payload or []
2720- return [RolePermissionObject .model_validate (item ) for item in payload ]
2770+ return [
2771+ RolePermissionObject .model_validate (item )
2772+ for item in _coerce_list_payload (payload )
2773+ ]
27212774
27222775 async def add_management_permission_object (
27232776 self ,
@@ -2730,7 +2783,9 @@ async def add_management_permission_object(
27302783 f"{ self ._role_permission_objects_root (role_key )} /" ,
27312784 json_body = payload ,
27322785 )
2733- return RolePermissionObject .model_validate (data )
2786+ return RolePermissionObject .model_validate (
2787+ _coerce_permission_object_payload (data , payload )
2788+ )
27342789
27352790 async def delete_management_permission_object (
27362791 self ,
@@ -2781,11 +2836,10 @@ async def list_flux_role_permissions(
27812836 self , role_key : FluxRoleRef
27822837 ) -> list [RolePermission ]:
27832838 role_key = _resolve_key (role_key )
2784- payload = (
2785- await self .request ("GET" , f"{ self ._flux_role_permissions_root (role_key )} /" )
2786- or []
2787- )
2788- return [RolePermission .model_validate (item ) for item in payload ]
2839+ payload = await self .request ("GET" , f"{ self ._flux_role_permissions_root (role_key )} /" )
2840+ return [
2841+ RolePermission .model_validate (item ) for item in _coerce_list_payload (payload )
2842+ ]
27892843
27902844 async def upsert_flux_role_permission (
27912845 self , role_key : FluxRoleRef , payload : Mapping [str , Any ]
@@ -2832,8 +2886,10 @@ async def list_flux_permission_objects(
28322886 f"{ self ._flux_role_permission_objects_root (role_key )} /" ,
28332887 params = {"content_type" : content_type },
28342888 )
2835- payload = payload or []
2836- return [RolePermissionObject .model_validate (item ) for item in payload ]
2889+ return [
2890+ RolePermissionObject .model_validate (item )
2891+ for item in _coerce_list_payload (payload )
2892+ ]
28372893
28382894 async def add_flux_permission_object (
28392895 self ,
@@ -2846,7 +2902,9 @@ async def add_flux_permission_object(
28462902 f"{ self ._flux_role_permission_objects_root (role_key )} /" ,
28472903 json_body = payload ,
28482904 )
2849- return RolePermissionObject .model_validate (data )
2905+ return RolePermissionObject .model_validate (
2906+ _coerce_permission_object_payload (data , payload )
2907+ )
28502908
28512909 async def delete_flux_permission_object (
28522910 self ,
0 commit comments