Skip to content

Commit f7678e1

Browse files
committed
feat: enhance user listing with product name and account request status filtering
1 parent 30d6398 commit f7678e1

File tree

3 files changed

+37
-41
lines changed

3 files changed

+37
-41
lines changed

services/web/server/src/simcore_service_webserver/users/_users_repository.py

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import contextlib
2+
import logging
23
from typing import Any
34

45
import sqlalchemy as sa
@@ -48,6 +49,8 @@
4849
UserNotFoundError,
4950
)
5051

52+
_logger = logging.getLogger(__name__)
53+
5154

5255
def _parse_as_user(user_id: Any) -> UserID:
5356
try:
@@ -381,45 +384,33 @@ async def list_users_for_admin(
381384
engine: AsyncEngine,
382385
connection: AsyncConnection | None = None,
383386
*,
384-
filter_approved: bool | None = None,
385-
limit: int = 50,
386-
offset: int = 0,
387-
include_deleted: bool = False,
387+
product_name: ProductName,
388+
filter_account_request_status: AccountRequestStatus | None = None,
389+
filter_include_deleted: bool = False,
390+
pagination_limit: int = 50,
391+
pagination_offset: int = 0,
388392
) -> tuple[list[dict[str, Any]], int]:
389393
"""
390394
Gets users data for admin with pagination support using SQLAlchemy expressions
391395
392-
Args:
393-
engine: The database engine
394-
connection: Optional existing connection to reuse
395-
filter_approved: If set, filters users by their approval status
396-
limit: Maximum number of users to return
397-
offset: Number of users to skip for pagination
398-
include_deleted: Whether to include users marked as deleted
399-
400396
Returns:
401397
Tuple of (list of user data, total count)
402398
"""
403399
joined_user_tables = users.outerjoin(
404400
users_pre_registration_details,
405-
users.c.id == users_pre_registration_details.c.user_id,
401+
(users.c.id == users_pre_registration_details.c.user_id)
402+
& (users_pre_registration_details.c.product_name == product_name),
406403
)
407404

408405
where_conditions = []
409-
if not include_deleted:
406+
if not filter_include_deleted:
410407
where_conditions.append(users.c.status != UserStatus.DELETED)
411408

412-
if filter_approved is not None:
413-
if filter_approved:
414-
where_conditions.append(
415-
users_pre_registration_details.c.account_request_status
416-
== AccountRequestStatus.APPROVED
417-
)
418-
else:
419-
where_conditions.append(
420-
users_pre_registration_details.c.account_request_status
421-
!= AccountRequestStatus.APPROVED
422-
)
409+
if filter_account_request_status is not None:
410+
where_conditions.append(
411+
users_pre_registration_details.c.account_request_status
412+
== filter_account_request_status
413+
)
423414

424415
where_clause = sa.and_(*where_conditions) if where_conditions else sa.true()
425416

@@ -478,18 +469,17 @@ async def list_users_for_admin(
478469
users_pre_registration_details.c.created.desc(), # newest pre-registered first
479470
users_pre_registration_details.c.pre_email,
480471
)
481-
.limit(limit)
482-
.offset(offset)
472+
.limit(pagination_limit)
473+
.offset(pagination_offset)
483474
)
484475

485-
print(
476+
_logger.debug(
477+
"%s\n%s\n%s\n%s",
486478
"-" * 100,
487-
"\n",
488479
as_postgres_sql_query_str(main_query),
489480
"-" * 100,
490-
"\n",
491481
as_postgres_sql_query_str(count_query),
492-
) # DEBUG
482+
)
493483

494484
async with pass_or_acquire_connection(engine, connection) as conn:
495485
# Get total count

services/web/server/src/simcore_service_webserver/users/_users_rest.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import logging
2-
from contextlib import suppress
3-
41
from aiohttp import web
52
from models_library.api_schemas_webserver.users import (
63
MyProfileGet,
@@ -178,9 +175,11 @@ async def list_users_for_admin(request: web.Request) -> web.Response:
178175

179176
users, total_count = await _users_service.list_users_as_admin(
180177
request.app,
181-
filter_approved=query_params.approved,
182-
limit=query_params.limit,
183-
offset=query_params.offset,
178+
filter_account_request_status={"PENDING": AccountRequestStatus.PENDING}.get(
179+
query_params.status or ""
180+
),
181+
pagination_limit=query_params.limit,
182+
pagination_offset=query_params.offset,
184183
)
185184

186185
page = Page[UserForAdminGet].model_validate(
@@ -236,6 +235,7 @@ async def pre_register_user_for_admin(request: web.Request) -> web.Response:
236235
creator_user_id=req_ctx.user_id,
237236
product_name=req_ctx.product_name,
238237
)
238+
239239
return envelope_json_response(
240240
user_profile.model_dump(**_RESPONSE_MODEL_MINIMAL_POLICY)
241241
)

services/web/server/src/simcore_service_webserver/users/_users_service.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import pycountry
55
from aiohttp import web
6+
from common_library.users_enums import AccountRequestStatus
67
from models_library.api_schemas_webserver.users import MyProfilePatch, UserForAdminGet
78
from models_library.basic_types import IDStr
89
from models_library.emails import LowerCaseEmailStr
@@ -208,9 +209,10 @@ async def is_user_in_product(
208209
async def list_users_as_admin(
209210
app: web.Application,
210211
*,
211-
filter_approved: bool | None = None,
212-
limit: int = 50,
213-
offset: int = 0,
212+
product_name: ProductName,
213+
filter_account_request_status: AccountRequestStatus | None = None,
214+
pagination_limit: int = 50,
215+
pagination_offset: int = 0,
214216
) -> tuple[list[dict[str, Any]], int]:
215217
"""
216218
Get a paginated list of users for admin view with filtering options.
@@ -228,7 +230,11 @@ async def list_users_as_admin(
228230

229231
# Get user data with pagination
230232
users_data, total_count = await _users_repository.list_users_for_admin(
231-
engine, filter_approved=filter_approved, limit=limit, offset=offset
233+
engine,
234+
product_name=product_name,
235+
filter_account_request_status=filter_account_request_status,
236+
pagination_limit=pagination_limit,
237+
pagination_offset=pagination_offset,
232238
)
233239

234240
# For each user, append additional information if needed

0 commit comments

Comments
 (0)