79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
from flask import request
|
|
from flask_jwt_extended import jwt_required
|
|
from flask_pydantic import validate
|
|
|
|
from app import db
|
|
from app.decorators import load_board_owned, load_card_owned
|
|
from app.models import CardLabel, Label
|
|
from app.schemas import LabelCreateRequest
|
|
|
|
from . import kanban_bp
|
|
|
|
|
|
@kanban_bp.route("/boards/<int:board_id>/labels", methods=["GET"])
|
|
@jwt_required()
|
|
@load_board_owned
|
|
def get_labels(board_id, board):
|
|
"""Get all labels for a board"""
|
|
labels = board.labels.all()
|
|
return [label.to_dict() for label in labels], 200
|
|
|
|
|
|
@kanban_bp.route("/boards/<int:board_id>/labels", methods=["POST"])
|
|
@jwt_required()
|
|
@load_board_owned
|
|
@validate(body=LabelCreateRequest)
|
|
def create_label(board_id, board, body: LabelCreateRequest):
|
|
"""Create a new label in a board"""
|
|
label = Label(
|
|
name=body.name,
|
|
color=body.color,
|
|
board_id=board_id,
|
|
)
|
|
|
|
db.session.add(label)
|
|
db.session.commit()
|
|
|
|
return label.to_dict(), 201
|
|
|
|
|
|
@kanban_bp.route("/cards/<int:card_id>/labels", methods=["POST"])
|
|
@jwt_required()
|
|
@load_card_owned
|
|
def add_label_to_card(card_id, card):
|
|
"""Add a label to a card"""
|
|
data = request.json
|
|
label_id = data.get("label_id")
|
|
|
|
if not label_id:
|
|
return {"error": "Label ID is required"}, 400
|
|
|
|
label = db.session.get(Label, label_id)
|
|
if not label or label.board_id != card.board_id:
|
|
return {"error": "Label not found or doesn't belong to this board"}, 404
|
|
|
|
# Check if already labeled
|
|
existing = CardLabel.query.filter_by(card_id=card_id, label_id=label_id).first()
|
|
if existing:
|
|
return {"error": "Label already added to card"}, 400
|
|
|
|
card_label = CardLabel(card_id=card_id, label_id=label_id)
|
|
db.session.add(card_label)
|
|
db.session.commit()
|
|
|
|
return card_label.to_dict(), 201
|
|
|
|
|
|
@kanban_bp.route("/cards/<int:card_id>/labels/<int:label_id>", methods=["DELETE"])
|
|
@jwt_required()
|
|
@load_card_owned
|
|
def remove_label_from_card(card_id, card, label_id):
|
|
"""Remove a label from a card"""
|
|
card_label = CardLabel.query.filter_by(card_id=card_id, label_id=label_id).first()
|
|
if not card_label:
|
|
return {"error": "Label not found on card"}, 404
|
|
|
|
db.session.delete(card_label)
|
|
db.session.commit()
|
|
|
|
return {"message": "Label removed from card"}, 200
|