@@ -267,13 +267,6 @@ async def get_admins(
267267 List[Admin] | tuple[list[Admin], int, int, int]: A list of admin objects or tuple with counts.
268268 """
269269 params = query
270- base_query = select (Admin )
271- if params .ids :
272- base_query = base_query .where (Admin .id .in_ (params .ids ))
273- if params .usernames :
274- base_query = base_query .where (Admin .username .in_ (params .usernames ))
275- if params .username :
276- base_query = base_query .where (Admin .username .ilike (f"%{ params .username } %" ))
277270
278271 total = None
279272 active = None
@@ -285,23 +278,19 @@ async def get_admins(
285278 func .sum (case ((Admin .is_disabled .is_ (False ), 1 ), else_ = 0 )).label ("active" ),
286279 func .sum (case ((Admin .is_disabled .is_ (True ), 1 ), else_ = 0 )).label ("disabled" ),
287280 )
281+ if params .ids :
282+ counts_stmt = counts_stmt .where (Admin .id .in_ (params .ids ))
283+ if params .usernames :
284+ counts_stmt = counts_stmt .where (Admin .username .in_ (params .usernames ))
288285 if params .username :
289286 counts_stmt = counts_stmt .where (Admin .username .ilike (f"%{ params .username } %" ))
287+
290288 result = await db .execute (counts_stmt )
291289 row = result .one ()
292290 total = row .total or 0
293291 active = row .active or 0
294292 disabled = row .disabled or 0
295293
296- stmt = base_query
297- if params .sort :
298- stmt = stmt .order_by (* [_build_admin_sort_clause (sort_option ) for sort_option in params .sort ])
299-
300- if params .offset :
301- stmt = stmt .offset (params .offset )
302- if params .limit :
303- stmt = stmt .limit (params .limit )
304-
305294 if compact :
306295 users_count_subq = (
307296 select (User .admin_id .label ("admin_id" ), func .count (User .id ).label ("total_users" ))
@@ -317,25 +306,36 @@ async def get_admins(
317306 .subquery ()
318307 )
319308
320- stmt = (
321- select (
322- Admin ,
323- func .coalesce (users_count_subq .c .total_users , 0 ).label ("total_users" ),
324- func .coalesce (reset_usage_subq .c .reseted_usage , 0 ).label ("reseted_usage" ),
325- )
326- .outerjoin (users_count_subq , users_count_subq .c .admin_id == Admin .id )
327- .outerjoin (reset_usage_subq , reset_usage_subq .c .admin_id == Admin .id )
309+ stmt = select (
310+ Admin ,
311+ func .coalesce (users_count_subq .c .total_users , 0 ).label ("total_users" ),
312+ func .coalesce (reset_usage_subq .c .reseted_usage , 0 ).label ("reseted_usage" ),
328313 )
329- if params .username :
330- stmt = stmt .where (Admin .username .ilike (f"%{ params .username } %" ))
331- if params .sort :
332- stmt = stmt .order_by (* [_build_admin_sort_clause (sort_option ) for sort_option in params .sort ])
333- if params .offset :
334- stmt = stmt .offset (params .offset )
335- if params .limit :
336- stmt = stmt .limit (params .limit )
337-
338- rows = (await db .execute (stmt )).all ()
314+ stmt = stmt .outerjoin (users_count_subq , users_count_subq .c .admin_id == Admin .id )
315+ stmt = stmt .outerjoin (reset_usage_subq , reset_usage_subq .c .admin_id == Admin .id )
316+ else :
317+ stmt = select (Admin )
318+
319+ # Apply filters consistently
320+ if params .ids :
321+ stmt = stmt .where (Admin .id .in_ (params .ids ))
322+ if params .usernames :
323+ stmt = stmt .where (Admin .username .in_ (params .usernames ))
324+ if params .username :
325+ stmt = stmt .where (Admin .username .ilike (f"%{ params .username } %" ))
326+
327+ # Apply sorting
328+ if params .sort :
329+ stmt = stmt .order_by (* [_build_admin_sort_clause (sort_option ) for sort_option in params .sort ])
330+
331+ # Apply pagination
332+ if params .offset is not None :
333+ stmt = stmt .offset (params .offset )
334+ if params .limit is not None :
335+ stmt = stmt .limit (params .limit )
336+
337+ if compact :
338+ rows = (await db .execute (stmt )).unique ().all ()
339339 admins = []
340340 for admin , total_users , reseted_usage in rows :
341341 lifetime_used_traffic = int ((reseted_usage or 0 ) + (admin .used_traffic or 0 ))
@@ -359,14 +359,10 @@ async def get_admins(
359359 lifetime_used_traffic = lifetime_used_traffic ,
360360 )
361361 )
362-
363- if return_with_count :
364- return admins , total , active , disabled
365- return admins
366-
367- admins = (await db .execute (stmt )).scalars ().all ()
368- for admin in admins :
369- await load_admin_attrs (admin )
362+ else :
363+ admins = list ((await db .execute (stmt )).scalars ().all ())
364+ for admin in admins :
365+ await load_admin_attrs (admin )
370366
371367 if return_with_count :
372368 return admins , total , active , disabled
@@ -401,13 +397,13 @@ async def get_admins_simple(
401397
402398 # Get count BEFORE pagination (always)
403399 count_stmt = select (func .count ()).select_from (stmt .subquery ())
404- total = (await db .execute (count_stmt )).scalar ()
400+ total = (await db .execute (count_stmt )).scalar () or 0
405401
406402 # Apply pagination or safety limit
407403 if not query .all :
408- if query .offset :
404+ if query .offset is not None :
409405 stmt = stmt .offset (query .offset )
410- if query .limit :
406+ if query .limit is not None :
411407 stmt = stmt .limit (query .limit )
412408 else :
413409 stmt = stmt .limit (10000 ) # Safety limit when all=true
0 commit comments