Spaces:
Running
Running
Allow admins to monitor active analyses
Browse files
app.py
CHANGED
|
@@ -658,21 +658,22 @@ async def analyze(request: Request, playerId: str = Form(...), clientId: UUID =
|
|
| 658 |
raise
|
| 659 |
|
| 660 |
|
| 661 |
-
def owned_job(client_id, user_id):
|
| 662 |
job = jobs.get(client_id)
|
| 663 |
-
if not job or job["userId"] != user_id:
|
| 664 |
raise HTTPException(404, "Analysis not found")
|
| 665 |
return job
|
| 666 |
|
| 667 |
|
| 668 |
@app.get("/api/progress/{client_id}")
|
| 669 |
def progress(client_id: str, request: Request):
|
| 670 |
-
|
|
|
|
| 671 |
|
| 672 |
|
| 673 |
@app.post("/api/retry-save/{client_id}")
|
| 674 |
def retry_save(client_id: str, request: Request):
|
| 675 |
-
job = owned_job(client_id, request.state.user_id)
|
| 676 |
if job.get("completion"):
|
| 677 |
backend(f'/{job["sessionId"]}', job["userId"], "PUT", job["completion"])
|
| 678 |
job.pop("completion", None)
|
|
@@ -682,12 +683,18 @@ def retry_save(client_id: str, request: Request):
|
|
| 682 |
|
| 683 |
@app.get("/api/active-analyses")
|
| 684 |
def active(request: Request):
|
| 685 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 686 |
|
| 687 |
|
| 688 |
@app.post("/api/cancel/{client_id}")
|
| 689 |
def cancel(client_id: str, request: Request):
|
| 690 |
-
job = owned_job(client_id, request.state.user_id)
|
| 691 |
if job["status"] not in {"completed", "failed", "cancelled", "sync_failed"}:
|
| 692 |
job["cancel"] = True
|
| 693 |
return {"status": job["status"], "clientId": client_id}
|
|
|
|
| 658 |
raise
|
| 659 |
|
| 660 |
|
| 661 |
+
def owned_job(client_id, user_id, is_admin=False):
|
| 662 |
job = jobs.get(client_id)
|
| 663 |
+
if not job or (job["userId"] != user_id and not is_admin):
|
| 664 |
raise HTTPException(404, "Analysis not found")
|
| 665 |
return job
|
| 666 |
|
| 667 |
|
| 668 |
@app.get("/api/progress/{client_id}")
|
| 669 |
def progress(client_id: str, request: Request):
|
| 670 |
+
job = owned_job(client_id, request.state.user_id, request.state.is_admin)
|
| 671 |
+
return {key: value for key, value in job.copy().items() if key not in {"userId", "cancel", "completion"}}
|
| 672 |
|
| 673 |
|
| 674 |
@app.post("/api/retry-save/{client_id}")
|
| 675 |
def retry_save(client_id: str, request: Request):
|
| 676 |
+
job = owned_job(client_id, request.state.user_id, request.state.is_admin)
|
| 677 |
if job.get("completion"):
|
| 678 |
backend(f'/{job["sessionId"]}', job["userId"], "PUT", job["completion"])
|
| 679 |
job.pop("completion", None)
|
|
|
|
| 683 |
|
| 684 |
@app.get("/api/active-analyses")
|
| 685 |
def active(request: Request):
|
| 686 |
+
is_admin = request.state.is_admin
|
| 687 |
+
return {"jobs": [
|
| 688 |
+
{key: value for key, value in job.copy().items() if key not in {"userId", "cancel", "completion"}}
|
| 689 |
+
for job in list(jobs.values())
|
| 690 |
+
if (is_admin or job["userId"] == request.state.user_id)
|
| 691 |
+
and job["status"] in {"uploading", "queued", "running"}
|
| 692 |
+
]}
|
| 693 |
|
| 694 |
|
| 695 |
@app.post("/api/cancel/{client_id}")
|
| 696 |
def cancel(client_id: str, request: Request):
|
| 697 |
+
job = owned_job(client_id, request.state.user_id, request.state.is_admin)
|
| 698 |
if job["status"] not in {"completed", "failed", "cancelled", "sync_failed"}:
|
| 699 |
job["cancel"] = True
|
| 700 |
return {"status": job["status"], "clientId": client_id}
|