44 GLOBAL_SCOPE_WILDCARD ,
55 ScopeData ,
66)
7- from openedx_authz .rest_api .data import AssignmentSortField , SearchField , SortField , SortOrder
7+ from openedx_authz .rest_api .data import (
8+ AssignmentSortField ,
9+ BaseEnum ,
10+ SearchField ,
11+ SortField ,
12+ SortOrder ,
13+ UserAssignmentSortField ,
14+ )
815
916
1017def get_generic_scope (scope : ScopeData ) -> ScopeData :
@@ -95,6 +102,41 @@ def filter_users(users: list[dict], search: str | None, roles: list[str] | None)
95102 return filtered_users
96103
97104
105+ def _sort_by_field (
106+ items : list [dict ],
107+ sort_by : str ,
108+ order : str ,
109+ allowed_fields : type [BaseEnum ],
110+ ) -> list [dict ]:
111+ """
112+ Sort a list of dicts by a given field and order, validating against the provided enum.
113+
114+ Args:
115+ items (list[dict]): The items to sort.
116+ sort_by (str): The field to sort by.
117+ order (str): The order to sort by.
118+ allowed_fields (type[BaseEnum]): The enum class whose values are the valid sort fields.
119+
120+ Raises:
121+ ValueError: If the sort field is invalid.
122+ ValueError: If the sort order is invalid.
123+
124+ Returns:
125+ list[dict]: The sorted items.
126+ """
127+ if sort_by not in allowed_fields .values ():
128+ raise ValueError (f"Invalid field: '{ sort_by } '. Must be one of { allowed_fields .values ()} " )
129+
130+ if order not in SortOrder .values ():
131+ raise ValueError (f"Invalid order: '{ order } '. Must be one of { SortOrder .values ()} " )
132+
133+ return sorted (
134+ items ,
135+ key = lambda item : (item .get (sort_by ) or "" ).lower (),
136+ reverse = order == SortOrder .DESC ,
137+ )
138+
139+
98140def sort_assignments (
99141 assignments : list [dict ],
100142 sort_by : AssignmentSortField = AssignmentSortField .ROLE ,
@@ -115,15 +157,27 @@ def sort_assignments(
115157 Returns:
116158 list[dict]: The sorted assignments.
117159 """
118- if sort_by not in AssignmentSortField .values ():
119- raise ValueError (f"Invalid field: '{ sort_by } '. Must be one of { AssignmentSortField .values ()} " )
160+ return _sort_by_field (assignments , sort_by , order , AssignmentSortField )
120161
121- if order not in SortOrder .values ():
122- raise ValueError (f"Invalid order: '{ order } '. Must be one of { SortOrder .values ()} " )
123162
124- sorted_assignments = sorted (
125- assignments ,
126- key = lambda assignment : (assignment .get (sort_by ) or "" ).lower (),
127- reverse = order == SortOrder .DESC ,
128- )
129- return sorted_assignments
163+ def sort_user_assignments (
164+ assignments : list [dict ],
165+ sort_by : UserAssignmentSortField = UserAssignmentSortField .ROLE ,
166+ order : SortOrder = SortOrder .ASC ,
167+ ) -> list [dict ]:
168+ """
169+ Sort role assignments by a given field and order.
170+
171+ Args:
172+ assignments (list[dict]): The assignments to sort.
173+ sort_by (UserAssignmentSortField, optional): The field to sort by. Defaults to UserAssignmentSortField.ROLE.
174+ order (SortOrder, optional): The order to sort by. Defaults to SortOrder.ASC.
175+
176+ Raises:
177+ ValueError: If the sort field is invalid.
178+ ValueError: If the sort order is invalid.
179+
180+ Returns:
181+ list[dict]: The sorted assignments.
182+ """
183+ return _sort_by_field (assignments , sort_by , order , UserAssignmentSortField )
0 commit comments