|
5 | 5 |
|
6 | 6 | import psycopg2 |
7 | 7 |
|
8 | | -from libkernelbot.db_types import LeaderboardItem, LeaderboardRankedEntry, RunItem, SubmissionItem |
| 8 | +from libkernelbot.db_types import ( |
| 9 | + LeaderboardItem, |
| 10 | + LeaderboardRankedEntry, |
| 11 | + MilestoneItem, |
| 12 | + RunItem, |
| 13 | + SubmissionItem, |
| 14 | +) |
9 | 15 | from libkernelbot.run_eval import CompileResult, RunResult, SystemInfo |
10 | 16 | from libkernelbot.task import LeaderboardDefinition, LeaderboardTask |
11 | 17 | from libkernelbot.utils import ( |
@@ -238,6 +244,55 @@ def delete_leaderboard(self, leaderboard_name: str, force: bool = False): |
238 | 244 | logger.exception("Could not delete leaderboard %s.", leaderboard_name, exc_info=e) |
239 | 245 | raise KernelBotError(f"Could not delete leaderboard {leaderboard_name}.") from e |
240 | 246 |
|
| 247 | + def create_milestone( |
| 248 | + self, |
| 249 | + leaderboard_id: int, |
| 250 | + name: str, |
| 251 | + code: str, |
| 252 | + description: str = None, |
| 253 | + ) -> int: |
| 254 | + """Create a new milestone for a leaderboard""" |
| 255 | + try: |
| 256 | + self.cursor.execute( |
| 257 | + """ |
| 258 | + INSERT INTO leaderboard.milestones ( |
| 259 | + leaderboard_id, name, code, description |
| 260 | + ) |
| 261 | + VALUES (%s, %s, %s, %s) |
| 262 | + RETURNING id |
| 263 | + """, |
| 264 | + (leaderboard_id, name, code, description), |
| 265 | + ) |
| 266 | + milestone_id = self.cursor.fetchone()[0] |
| 267 | + self.connection.commit() |
| 268 | + return milestone_id |
| 269 | + except psycopg2.Error as e: |
| 270 | + self.connection.rollback() |
| 271 | + logger.exception("Error creating milestone", exc_info=e) |
| 272 | + raise KernelBotError("Error creating milestone") from e |
| 273 | + |
| 274 | + def get_leaderboard_milestones(self, leaderboard_id: int) -> "list[MilestoneItem]": |
| 275 | + """Get all milestones for a leaderboard""" |
| 276 | + self.cursor.execute( |
| 277 | + """ |
| 278 | + SELECT id, name, code, description, created_at |
| 279 | + FROM leaderboard.milestones |
| 280 | + WHERE leaderboard_id = %s |
| 281 | + ORDER BY created_at |
| 282 | + """, |
| 283 | + (leaderboard_id,), |
| 284 | + ) |
| 285 | + return [ |
| 286 | + { |
| 287 | + "id": row[0], |
| 288 | + "name": row[1], |
| 289 | + "code": row[2], |
| 290 | + "description": row[3], |
| 291 | + "created_at": row[4], |
| 292 | + } |
| 293 | + for row in self.cursor.fetchall() |
| 294 | + ] |
| 295 | + |
241 | 296 | def create_submission( |
242 | 297 | self, |
243 | 298 | leaderboard: str, |
|
0 commit comments