Files
LoveACE-EndF/loveace/router/endpoint/jwc/exam.py

98 lines
3.6 KiB
Python
Raw Normal View History

from datetime import datetime
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
from pydantic import ValidationError
from loveace.router.endpoint.jwc.academic import get_academic_info
from loveace.router.endpoint.jwc.model.academic import AcademicInfo
from loveace.router.endpoint.jwc.model.exam import ExamInfoResponse
from loveace.router.endpoint.jwc.utils.exam import fetch_unified_exam_info
from loveace.router.schemas.error import ProtectRouterErrorToCode
from loveace.router.schemas.uniresponse import UniResponseModel
from loveace.service.remote.aufe import AUFEConnection
from loveace.service.remote.aufe.depends import get_aufe_conn
jwc_exam_router = APIRouter(
prefix="/exam",
responses=ProtectRouterErrorToCode().gen_code_table(),
)
@jwc_exam_router.get(
"/info", response_model=UniResponseModel[ExamInfoResponse], summary="获取考试信息"
)
async def get_exam_info(
conn: AUFEConnection = Depends(get_aufe_conn),
) -> UniResponseModel[ExamInfoResponse] | JSONResponse:
"""
获取用户的考试信息
功能特性
- 获取当前学期的考试安排
- 自动确定考试时间范围
- 显示考试时间地点课程等信息
💡 使用场景
- 查看即将进行的考试
- 了解考试安排和地点
- 提前规划复习计划
Returns:
ExamInfoResponse: 包含考试列表和总数
"""
try:
academic_info = await get_academic_info(conn)
if isinstance(academic_info, UniResponseModel):
if academic_info.data and isinstance(academic_info.data, AcademicInfo):
term_code = academic_info.data.current_term
else:
result = ExamInfoResponse(exams=[], total_count=0)
return UniResponseModel[ExamInfoResponse](
success=False,
data=result,
message="无法获取学期信息",
error=None,
)
elif isinstance(academic_info, AcademicInfo):
term_code = academic_info.current_term
else:
result = ExamInfoResponse(exams=[], total_count=0)
return UniResponseModel[ExamInfoResponse](
success=False,
data=result,
message="无法获取学期信息",
error=None,
)
conn.logger.info(f"获取用户 {conn.userid} 的考试信息")
start_date = datetime.now()
# termcode 结尾为 1 为秋季学期考试应在3月之前2为春季学期考试应在9月之前
end_date = datetime(
year=start_date.year + (1 if term_code.endswith("1") else 0),
month=3 if term_code.endswith("1") else 9,
day=30,
)
exam_info = await fetch_unified_exam_info(
conn,
start_date=start_date.strftime("%Y-%m-%d"),
end_date=end_date.strftime("%Y-%m-%d"),
term_code=term_code,
)
return UniResponseModel[ExamInfoResponse](
success=True,
data=exam_info,
message="获取考试信息成功",
error=None,
)
except ValidationError as e:
conn.logger.error(f"用户 {conn.userid} 的考试信息数据验证失败: {e}")
return ProtectRouterErrorToCode().validation_error.to_json_response(
conn.logger.trace_id
)
except Exception as e:
conn.logger.error(f"用户 {conn.userid} 的考试信息获取失败: {e}")
return ProtectRouterErrorToCode().server_error.to_json_response(
conn.logger.trace_id
)