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//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//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//goals/", 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//goals/", 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": "移除成功"})