Skip to content

Commit 9500c6c

Browse files
committed
add admin leaderboard submission listing
1 parent 5f901f7 commit 9500c6c

3 files changed

Lines changed: 12 additions & 65 deletions

File tree

src/kernelbot/api/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,13 +698,13 @@ async def admin_list_leaderboard_submissions(
698698
offset: int = 0,
699699
) -> dict:
700700
with db_context as db:
701-
submissions = db.get_leaderboard_submission_history(leaderboard_name, limit, offset)
701+
submission_ids = db.get_leaderboard_submission_ids(leaderboard_name, limit, offset)
702702
return {
703703
"status": "ok",
704704
"leaderboard": leaderboard_name,
705705
"limit": limit,
706706
"offset": offset,
707-
"submissions": submissions,
707+
"submission_ids": submission_ids,
708708
}
709709

710710

src/libkernelbot/leaderboard_db.py

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,43 +1276,30 @@ def get_user_submissions(
12761276
logger.exception("Error fetching user submissions for user %s", user_id, exc_info=e)
12771277
raise KernelBotError("Error fetching user submissions") from e
12781278

1279-
def get_leaderboard_submission_history(
1279+
def get_leaderboard_submission_ids(
12801280
self,
12811281
leaderboard_name: str,
12821282
limit: int = 100,
12831283
offset: int = 0,
1284-
) -> list[dict]:
1285-
"""Get all submissions for a leaderboard with admin-oriented metadata."""
1286-
limit = max(1, min(limit, 1000))
1284+
) -> list[int]:
1285+
"""Get submission IDs for a leaderboard in reverse chronological order."""
1286+
limit = max(1, limit)
12871287
offset = max(0, offset)
12881288

12891289
try:
12901290
self.get_leaderboard_id(leaderboard_name)
12911291
self.cursor.execute(
12921292
"""
1293-
SELECT s.id, lb.name, s.file_name, s.user_id, ui.user_name,
1294-
s.submission_time, s.done
1293+
SELECT s.id
12951294
FROM leaderboard.submission s
12961295
JOIN leaderboard.leaderboard lb ON s.leaderboard_id = lb.id
1297-
LEFT JOIN leaderboard.user_info ui ON ui.id = s.user_id
12981296
WHERE lb.name = %s
12991297
ORDER BY s.submission_time DESC, s.id DESC
13001298
LIMIT %s OFFSET %s
13011299
""",
13021300
(leaderboard_name, limit, offset),
13031301
)
1304-
return [
1305-
{
1306-
"id": row[0],
1307-
"leaderboard_name": row[1],
1308-
"file_name": row[2],
1309-
"user_id": row[3],
1310-
"user_name": row[4],
1311-
"submission_time": row[5],
1312-
"done": row[6],
1313-
}
1314-
for row in self.cursor.fetchall()
1315-
]
1302+
return [row[0] for row in self.cursor.fetchall()]
13161303
except KernelBotError:
13171304
self.connection.rollback()
13181305
raise

tests/test_admin_api.py

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -142,29 +142,10 @@ class TestAdminSubmissions:
142142
"""Test admin submission endpoints."""
143143

144144
def test_list_leaderboard_submissions(self, test_client, mock_backend):
145-
"""GET /admin/leaderboards/{name}/submissions returns all submission metadata."""
145+
"""GET /admin/leaderboards/{name}/submissions returns submission IDs."""
146146
mock_backend.db.__enter__ = MagicMock(return_value=mock_backend.db)
147147
mock_backend.db.__exit__ = MagicMock(return_value=None)
148-
mock_backend.db.get_leaderboard_submission_history = MagicMock(return_value=[
149-
{
150-
"id": 123,
151-
"leaderboard_name": "test-lb",
152-
"file_name": "submission.py",
153-
"user_id": "42",
154-
"user_name": "alice",
155-
"submission_time": "2026-04-07T12:00:00Z",
156-
"done": True,
157-
},
158-
{
159-
"id": 122,
160-
"leaderboard_name": "test-lb",
161-
"file_name": "submission_old.py",
162-
"user_id": "43",
163-
"user_name": "bob",
164-
"submission_time": "2026-04-07T11:00:00Z",
165-
"done": False,
166-
},
167-
])
148+
mock_backend.db.get_leaderboard_submission_ids = MagicMock(return_value=[123, 122])
168149

169150
response = test_client.get(
170151
"/admin/leaderboards/test-lb/submissions?limit=50&offset=10",
@@ -176,30 +157,9 @@ def test_list_leaderboard_submissions(self, test_client, mock_backend):
176157
"leaderboard": "test-lb",
177158
"limit": 50,
178159
"offset": 10,
179-
"submissions": [
180-
{
181-
"id": 123,
182-
"leaderboard_name": "test-lb",
183-
"file_name": "submission.py",
184-
"user_id": "42",
185-
"user_name": "alice",
186-
"submission_time": "2026-04-07T12:00:00Z",
187-
"done": True,
188-
},
189-
{
190-
"id": 122,
191-
"leaderboard_name": "test-lb",
192-
"file_name": "submission_old.py",
193-
"user_id": "43",
194-
"user_name": "bob",
195-
"submission_time": "2026-04-07T11:00:00Z",
196-
"done": False,
197-
},
198-
],
160+
"submission_ids": [123, 122],
199161
}
200-
mock_backend.db.get_leaderboard_submission_history.assert_called_once_with(
201-
"test-lb", 50, 10
202-
)
162+
mock_backend.db.get_leaderboard_submission_ids.assert_called_once_with("test-lb", 50, 10)
203163

204164
def test_get_submission(self, test_client, mock_backend):
205165
"""GET /admin/submissions/{id} returns submission."""

0 commit comments

Comments
 (0)