fix: detect rework via Gitea repo existence, not BroJS answer field
BroJS clears the answer field when rejecting a task, so repo_url was always None on rework. Now we check Gitea API directly — if the repo exists, it's a rework regardless of BroJS answer state. Comments are still read from BroJS task_get. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
+22
-7
@@ -157,23 +157,38 @@ def _gh():
|
|||||||
async def _get_task_meta(task_id: str) -> dict:
|
async def _get_task_meta(task_id: str) -> dict:
|
||||||
"""Возвращает существующий repo_url и комментарии преподавателя (если есть).
|
"""Возвращает существующий repo_url и комментарии преподавателя (если есть).
|
||||||
|
|
||||||
Используется для определения: первая сдача или пересдача после отклонения.
|
Пересдача определяется по наличию репозитория на Gitea — независимо от того,
|
||||||
|
очистил ли BroJS поле answer при отклонении задания.
|
||||||
"""
|
"""
|
||||||
|
repo_url = None
|
||||||
|
comments = ""
|
||||||
|
|
||||||
|
# 1. Проверяем репо напрямую на Gitea (надёжнее, чем BroJS answer)
|
||||||
|
repo_name = f"task-{task_id}"
|
||||||
|
try:
|
||||||
|
with httpx.Client(timeout=10) as c:
|
||||||
|
r = c.get(
|
||||||
|
f"{GITEA_BASE_URL}/api/v1/repos/{GITEA_OWNER}/{repo_name}",
|
||||||
|
headers=_gh(),
|
||||||
|
)
|
||||||
|
if r.status_code == 200:
|
||||||
|
repo_url = f"{GITEA_BASE_URL}/{GITEA_OWNER}/{repo_name}"
|
||||||
|
except Exception as e:
|
||||||
|
print(f" [meta] Не удалось проверить Gitea: {e}")
|
||||||
|
|
||||||
|
# 2. Читаем комментарии из BroJS
|
||||||
try:
|
try:
|
||||||
raw = await mcp_call("task_get", {"taskId": task_id})
|
raw = await mcp_call("task_get", {"taskId": task_id})
|
||||||
data = json.loads(raw)
|
data = json.loads(raw)
|
||||||
url = (data.get("answer") or {}).get("content", "")
|
|
||||||
repo_url = url if url.startswith(f"{GITEA_BASE_URL}/{GITEA_OWNER}/") else None
|
|
||||||
comments = data.get("comments") or data.get("feedback", "") or ""
|
comments = data.get("comments") or data.get("feedback", "") or ""
|
||||||
# comments может быть списком объектов
|
|
||||||
if isinstance(comments, list):
|
if isinstance(comments, list):
|
||||||
comments = "\n".join(
|
comments = "\n".join(
|
||||||
c.get("text", c.get("content", str(c))) for c in comments if c
|
c.get("text", c.get("content", str(c))) for c in comments if c
|
||||||
)
|
)
|
||||||
return {"repo_url": repo_url, "comments": str(comments).strip()}
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f" [meta] Не удалось получить метаданные задания: {e}")
|
print(f" [meta] Не удалось получить комментарии BroJS: {e}")
|
||||||
return {"repo_url": None, "comments": ""}
|
|
||||||
|
return {"repo_url": repo_url, "comments": str(comments).strip()}
|
||||||
|
|
||||||
|
|
||||||
def gitea_create_repo(name: str) -> str:
|
def gitea_create_repo(name: str) -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user