feat: 重构学员目标系统,支持评估日期/状态自动计算/评估目标,同时恢复方案列表的典型设置
This commit is contained in:
+58
-11
@@ -1,13 +1,34 @@
|
||||
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"])
|
||||
@@ -25,12 +46,28 @@ def assign_goal(student_id):
|
||||
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"],
|
||||
status=data.get("status", "未开始"),
|
||||
mastery_level=data.get("mastery_level", 1),
|
||||
deadline=data.get("deadline")
|
||||
start_date=start_date,
|
||||
assessment_date=assessment_date
|
||||
)
|
||||
db.session.add(record)
|
||||
db.session.commit()
|
||||
@@ -42,15 +79,25 @@ 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 "status" in data:
|
||||
record.status = data["status"]
|
||||
if data["status"] == "已完成" and not record.completed_at:
|
||||
from datetime import datetime
|
||||
record.completed_at = datetime.now()
|
||||
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 "deadline" in data:
|
||||
record.deadline = data["deadline"]
|
||||
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())
|
||||
@@ -61,4 +108,4 @@ 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": "移除成功"})
|
||||
return jsonify({"message": "移除成功"})
|
||||
|
||||
Reference in New Issue
Block a user