From 09ff21e05c96a8392dddc08a6376b12fab8f73c3 Mon Sep 17 00:00:00 2001 From: etm Date: Fri, 21 Aug 2026 17:45:52 +0330 Subject: [PATCH] fix(admin): allow clearing data limit with null --- app/db/crud/admin.py | 8 ++++++-- tests/api/test_admin.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/app/db/crud/admin.py b/app/db/crud/admin.py index 4bb132791..f85516fa3 100644 --- a/app/db/crud/admin.py +++ b/app/db/crud/admin.py @@ -190,8 +190,12 @@ async def update_admin(db: AsyncSession, db_admin: Admin, modified_admin: AdminM if modified_admin.status is not None and modified_admin.status != db_admin.status: db_admin.status = modified_admin.status db_admin.last_status_change = datetime.now(UTC) - if modified_admin.data_limit is not None: - db_admin.data_limit = modified_admin.data_limit if modified_admin.data_limit > 0 else None + if "data_limit" in modified_admin.model_fields_set: + db_admin.data_limit = ( + modified_admin.data_limit + if modified_admin.data_limit is not None and modified_admin.data_limit > 0 + else None + ) # Recompute limited/active based on new data_limit — never touch disabled if db_admin.status != AdminStatus.disabled: should_be_limited = ( diff --git a/tests/api/test_admin.py b/tests/api/test_admin.py index 042152bc0..8b8e8b58f 100644 --- a/tests/api/test_admin.py +++ b/tests/api/test_admin.py @@ -1358,6 +1358,37 @@ def test_admin_data_limit_zero_means_unlimited(access_token): delete_admin(access_token, admin["username"]) +def test_admin_data_limit_null_means_unlimited(access_token): + """Explicit data_limit=null clears the limit while an omitted field leaves it unchanged.""" + admin = create_admin(access_token) + try: + response = client.put( + f"/api/admin/{admin['username']}", + json={"data_limit": 1073741824}, + headers=auth_headers(access_token), + ) + assert response.status_code == status.HTTP_200_OK + assert response.json()["data_limit"] == 1073741824 + + response = client.put( + f"/api/admin/{admin['username']}", + json={"note": "keep the existing limit"}, + headers=auth_headers(access_token), + ) + assert response.status_code == status.HTTP_200_OK + assert response.json()["data_limit"] == 1073741824 + + response = client.put( + f"/api/admin/{admin['username']}", + json={"data_limit": None}, + headers=auth_headers(access_token), + ) + assert response.status_code == status.HTTP_200_OK + assert response.json()["data_limit"] is None + finally: + delete_admin(access_token, admin["username"]) + + def test_admin_status_defaults_to_active(access_token): """Newly created admin has status=active.""" admin = create_admin(access_token)