app.course_utils module

course_utils.py

course_views.py的依赖函数

registration_status_check: 检查学生选课状态变化的合法性 registration_status_change: 改变学生选课状态 course_to_display: 把课程信息转换为方便前端呈现的形式 draw_lots: 预选阶段结束时执行抽签 change_course_status: 改变课程的选课阶段 remaining_willingness_point(暂不启用): 计算学生剩余的意愿点数 process_time: 把datetime对象转换成人类可读的时间表示 check_course_time_conflict: 检查当前选择的课是否与已选的课上课时间冲突

app.course_utils.cal_participate_num(course: Course) dict[源代码]

计算该课程对应组织所有成员的参与次数 return {Naturalperson.id:参与次数} 前端使用的时候直接读取字典的值就好了 :param course: 选择要计算的课程 :type course: Course :return: 返回统计数据 :rtype: dict

app.course_utils.cancel_course_activity(request: HttpRequest, activity: Activity, cancel_all: bool = False)[源代码]

取消课程活动,是cancel_activity的简化版,在聚合页面被调用

在聚合页面中,应确保activity是课程活动,并且应检查activity.status, 如果不是WAITING或PROGRESSING,不应调用本函数

成功无返回值,失败返回错误消息 (或者也可以在聚合页面判断出来能不能取消)

参数:
  • request (HttpRequest) -- 取消单次课程活动的请求

  • activity (Activity) -- 待取消的活动

  • cancel_all (bool, optional) -- 取消该时段所有活动, defaults to False

返回:

取消失败的话返回错误信息

返回类型:

string

app.course_utils.change_course_status(cur_status: Status, to_status: Status) None[源代码]

作为定时任务,在课程设定的时间改变课程的选课阶段

example: scheduler.add_job(change_course_status, "date",

id=f"course_{course_id}_{to_status}, run_date, args)

参数:
抛出:
  • AssertionError -- 选课已经结束 / 两个状态间不匹配

  • AssertionError -- 未提供当前阶段的信息

app.course_utils.check_ac_time_course(start_time: datetime, end_time: datetime) bool[源代码]

时间合法性的检查:开始早于结束

参数:
  • start_time (datetime) -- 活动开始时间

  • end_time (datetime) -- 活动结束时间

返回:

是否合法

返回类型:

bool

app.course_utils.check_post_and_modify(records: QuerySet, post_data: QueryDict) dict[源代码]

records和post_data分别为原先和更新后的list 检查post表单是否可以为这个course对应的内容, 如果可以,修改学时 - 返回wrong|succeed - 不抛出异常 在检查过程中,会使用事务和 select_for_update 来保证原子性。 :param records: 原本的学时数据 :type records: QuerySet[CourseRecord] :param post_data: 由前端上传上来的修改结果 :type post_data: QueryDict :return: 检查结果 :rtype: MESSAGECONTEXT

app.course_utils.course_activity_base_check(request: HttpRequest) dict[源代码]

检查课程活动,是activity_base_check的简化版,失败时抛出AssertionError

参数:

request (HttpRequest) -- 修改/发起单次课程活动的请求

抛出:

AssertionError -- 活动时间非法/需要报名的活动必须提前至少一小时发起

返回:

context

返回类型:

dict

app.course_utils.course_base_check(request, if_new=None)[源代码]

选课单变量合法性检查并准备变量

app.course_utils.course_to_display(courses: QuerySet, user: NaturalPerson, detail: bool = False) List[dict][源代码]

将课程信息转换为列表,方便前端呈现

参数:
  • courses (QuerySet[Course]) -- 课程集合

  • user (NaturalPerson) -- 当前用户

  • detail (bool) -- 是否显示课程的详细信息, defaults to False

返回:

课程信息列表,用一个字典来传递课程的全部信息

返回类型:

List[dict]

app.course_utils.create_course(request, course_id=None)[源代码]

检查课程,合法时寻找该课程,不存在时创建 返回(course.id, created)

app.course_utils.create_single_course_activity(request: HttpRequest) Tuple[int, bool][源代码]

创建单次课程活动,是create_activity的简化版 错误提示通过AssertionError抛出

参数:

request (HttpRequest) -- 发起单次课程活动的请求

返回:

课程活动id,True(成功创建)/False(相似活动已存在)

返回类型:

Tuple[int, bool]

app.course_utils.download_course_record(course: Course = None, year: int = None, semester: Semester = None) HttpResponse[源代码]

返回需要导出的学时信息文件 course:

提供course时为单个课程服务,只导出该课程的相关人员的学时信息 不提供时下载所有学时信息,注意,只有相关负责老师可以访问!

参数:
  • course (Course, optional) -- 所选择的课程, defaults to None

  • year (int, optional) -- 所选择的学年, defaults to None

  • semester (Semester, optional) -- 所选择的学期, defaults to None

返回:

返回下载的文件数据

返回类型:

HttpResponse

app.course_utils.download_select_info(single_course: Course | None = None)[源代码]

下载选课信息 single_course:

提供single_course时为单个课程服务,只导出该课程的相关人员的选课信息 不提供时下载所有选课信息,注意,此时只有相关负责老师可以访问! 不提供手动选课人员名单。

返回:

返回下载的文件数据

返回类型:

HttpResponse

app.course_utils.finish_course(course: Course)[源代码]

结束课程 设置课程状态为END 生成学时表并通知同学该课程已结束。

app.course_utils.modify_course_activity(request: HttpRequest, activity: Activity)[源代码]

修改单次课程活动信息,是modify_activity的简化版 错误提示通过AssertionError抛出

参数:
  • request (HttpRequest) -- 修改单次课程活动的请求

  • activity (Activity) -- 待修改的活动

app.course_utils.registration_status_change(course_id: int, user: NaturalPerson, action: str) dict[源代码]

学生点击选课或者取消选课后,更改学生的选课状态

参数:
  • course_id (int) -- 当前课程的编号

  • user (NaturalPerson) -- 当前用户

  • action (str) -- 希望进行的操作,可能为"select"或"cancel"

返回:

操作是否成功执行

返回类型:

MESSAGECONTEXT