Files
piano-plan/app/routes/student_goals.py
T

112 lines
4.0 KiB
Python

from flask import Blueprint, request, jsonify
from app.models import db, StudentGoal, Goal
from app.routes.auth import login_required_json
from datetime import datetime, timedelta
student_goals_bp = Blueprint("student_goals", __name__)
def compute_status(start_date, assessment_date):
"""根据日期计算状态"""
now = datetime.now()
if start_date and now < start_date:
return "未开始"
elif assessment_date and now > assessment_date:
return "已结束"
else:
return "进行中"
@student_goals_bp.route("/api/students/<int:student_id>/goals", methods=["GET"])
@login_required_json
def get_student_goals(student_id):
records = StudentGoal.query.filter_by(student_id=student_id).all()
# 计算状态并排序
def sort_key(r):
status_order = {"进行中": 1, "未开始": 2, "已结束": 3}
status = compute_status(r.start_date, r.assessment_date)
order = status_order.get(status, 4)
assessment = r.assessment_date if r.assessment_date else datetime.min
return (order, -assessment.timestamp() if assessment else 0)
records.sort(key=sort_key)
return jsonify([r.to_dict() for r in records])
@student_goals_bp.route("/api/students/<int:student_id>/goals", methods=["POST"])
@login_required_json
def assign_goal(student_id):
data = request.get_json()
# 检查目标是否存在
goal = Goal.query.get(data["goal_id"])
if not goal:
return jsonify({"error": "目标不存在"}), 404
# 检查是否已分配
existing = StudentGoal.query.filter_by(student_id=student_id, goal_id=data["goal_id"]).first()
if existing:
return jsonify({"error": "目标已分配"}), 400
# 处理评估日期
assessment_date = None
if data.get("assessment_date"):
# 直接指定日期
assessment_date = datetime.fromisoformat(data["assessment_date"])
elif data.get("assessment_days"):
# 指定天数后
assessment_date = datetime.now() + timedelta(days=int(data["assessment_days"]))
# 处理开始日期
start_date = None
if data.get("start_date"):
start_date = datetime.fromisoformat(data["start_date"])
# 如果没有指定开始日期,默认为当前时间
elif data.get("start_now"):
start_date = datetime.now()
record = StudentGoal(
student_id=student_id,
goal_id=data["goal_id"],
start_date=start_date,
assessment_date=assessment_date
)
db.session.add(record)
db.session.commit()
return jsonify(record.to_dict()), 201
@student_goals_bp.route("/api/students/<int:student_id>/goals/<int:goal_id>", methods=["PUT"])
@login_required_json
def update_student_goal(student_id, goal_id):
record = StudentGoal.query.filter_by(student_id=student_id, goal_id=goal_id).first_or_404()
data = request.get_json()
if "start_date" in data:
if data["start_date"]:
record.start_date = datetime.fromisoformat(data["start_date"])
else:
record.start_date = None
if "assessment_date" in data:
if data["assessment_date"]:
record.assessment_date = datetime.fromisoformat(data["assessment_date"])
else:
record.assessment_date = None
if "mastery_level" in data:
record.mastery_level = data["mastery_level"]
if "achievement_date" in data:
if data["achievement_date"]:
record.achievement_date = datetime.fromisoformat(data["achievement_date"])
else:
record.achievement_date = None
if "comment" in data:
record.comment = data["comment"]
db.session.commit()
return jsonify(record.to_dict())
@student_goals_bp.route("/api/students/<int:student_id>/goals/<int:goal_id>", methods=["DELETE"])
@login_required_json
def remove_student_goal(student_id, goal_id):
record = StudentGoal.query.filter_by(student_id=student_id, goal_id=goal_id).first_or_404()
db.session.delete(record)
db.session.commit()
return jsonify({"message": "移除成功"})