fix: positionnement des cartes selon les labels et mise à jour après édition
- create_issue: utilise _issue_column() au lieu de hardcoder 'Backlog'
- update_issue_api: recalcule la colonne après changement de labels
- update_issue_api: utilise l'endpoint PUT /labels au lieu de PATCH (Gitea ignore labels dans PATCH)
- webhooks: utilise _issue_column() pour 'opened'/'reopened'
- saveIssueEdit: rafraîchit le board (HTMX) après édition au lieu de rouvrir la modale
- update_issue_labels: corrigé pour utiliser PUT /issues/{id}/labels (liste d'entiers)
This commit is contained in:
+34
-8
@@ -10,6 +10,7 @@ from fastapi import APIRouter, HTTPException, Query, Request
|
||||
|
||||
from app.config import settings
|
||||
from app.db import get_conn
|
||||
from app.routers.board import _issue_column
|
||||
from app.services.gitea_client import gitea
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -266,16 +267,18 @@ async def create_issue(
|
||||
labels=label_ids, milestone=milestone_id, assignee=assignee,
|
||||
)
|
||||
|
||||
# Add card to local board
|
||||
# Add card to local board — determine column from label mapping
|
||||
with get_conn() as conn:
|
||||
board = conn.execute(
|
||||
"SELECT id FROM boards WHERE project_owner=? AND project_name=?",
|
||||
board_row = conn.execute(
|
||||
"SELECT id, columns_json FROM boards WHERE project_owner=? AND project_name=?",
|
||||
(owner, repo),
|
||||
).fetchone()
|
||||
if board:
|
||||
if board_row:
|
||||
columns = json.loads(board_row["columns_json"])
|
||||
col = _issue_column(issue, columns, board_row["id"])
|
||||
conn.execute(
|
||||
"INSERT INTO cards (board_id, gitea_issue_id, column_name, position) VALUES (?, ?, 'Backlog', 0)",
|
||||
(board["id"], issue["number"]),
|
||||
"INSERT INTO cards (board_id, gitea_issue_id, column_name, position) VALUES (?, ?, ?, 0)",
|
||||
(board_row["id"], issue["number"], col),
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
@@ -300,6 +303,7 @@ async def update_issue_api(
|
||||
raise HTTPException(status_code=429, detail="Rate limit exceeded")
|
||||
|
||||
kwargs = {}
|
||||
label_ids = None
|
||||
if title:
|
||||
kwargs["title"] = title
|
||||
if body:
|
||||
@@ -307,13 +311,35 @@ async def update_issue_api(
|
||||
if state:
|
||||
kwargs["state"] = state
|
||||
if labels:
|
||||
kwargs["labels"] = labels.split(",")
|
||||
label_ids = [int(l) for l in labels.split(",") if l.strip().isdigit()]
|
||||
if milestone and milestone.strip().isdigit():
|
||||
kwargs["milestone"] = int(milestone)
|
||||
if assignee:
|
||||
kwargs["assignees"] = [assignee]
|
||||
|
||||
issue = await gitea.update_issue(owner, repo, issue_id, **kwargs)
|
||||
if kwargs:
|
||||
await gitea.update_issue(owner, repo, issue_id, **kwargs)
|
||||
if label_ids is not None:
|
||||
await gitea.update_issue_labels(owner, repo, issue_id, label_ids)
|
||||
|
||||
# Re-fetch issue to get complete updated state for column recalculation
|
||||
issue = await gitea.get_issue(owner, repo, issue_id)
|
||||
|
||||
# Recalculate card column based on updated labels
|
||||
with get_conn() as conn:
|
||||
board_row = conn.execute(
|
||||
"SELECT id, columns_json FROM boards WHERE project_owner=? AND project_name=?",
|
||||
(owner, repo),
|
||||
).fetchone()
|
||||
if board_row:
|
||||
columns = json.loads(board_row["columns_json"])
|
||||
col = _issue_column(issue, columns, board_row["id"])
|
||||
conn.execute(
|
||||
"UPDATE cards SET column_name=?, updated_at=CURRENT_TIMESTAMP WHERE board_id=? AND gitea_issue_id=?",
|
||||
(col, board_row["id"], issue_id),
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
return {"status": "ok", "issue": issue}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user