system-pri/backend/app/students/routes/enrollments.py

168 lines
5.5 KiB
Python

from apiflask import APIBlueprint
from flask import abort
from ...base.mode import EnrollmentsMode
from ...base.schemas import MessageSchema
from ...dependencies import db
from ...examination_schedule.models import ExaminationSchedule
from ...project_supervisor.models import ProjectSupervisor
from ..models import Group, Student, TermOfDefence
from ..schemas import (
ExaminationScheduleListSchema,
TemporaryStudentSchema,
TermOfDefenceStudentListSchema,
)
bp = APIBlueprint("enrollments", __name__, url_prefix="/")
@bp.post("/<int:examination_schedule_id>/enrollments/<int:term_of_defence_id>/")
@bp.input(TemporaryStudentSchema)
@bp.output(MessageSchema, status_code=201)
def assign_your_group_to_term_of_defence(
examination_schedule_id: int, term_of_defence_id: int, data: dict
) -> dict:
# this code will be removed
student = Student.query.filter(Student.id == data.get("student_id")).first()
if student is None:
abort(404, "Not found student!")
################
term_of_defence = (
TermOfDefence.query.filter(
TermOfDefence.id == term_of_defence_id,
TermOfDefence.examination_schedule_id == examination_schedule_id,
)
.join(ExaminationSchedule)
.first()
)
if term_of_defence is None or (ex := term_of_defence.examination_schedule) is None:
abort(404, "Term of defence not found!")
if ex.open_enrollments != EnrollmentsMode.OPEN.value:
abort(400, "Enrollments is closed! You have been delayed!")
group = (
Group.query.join(ProjectSupervisor)
.filter(Group.year_group_id == ex.year_group_id)
.join(Group.students)
.filter_by(index=student.index)
.first()
)
if group is None or group.project_supervisor is None:
abort(
400,
"You don't have a group or your group doesn't"
" have an assigned project supervisor!",
)
defence = TermOfDefence.query.filter(
TermOfDefence.group_id == group.id,
TermOfDefence.examination_schedule_id == examination_schedule_id,
).first()
if defence is not None:
abort(400, "Your group has already assigned to any exam date!")
td = (
TermOfDefence.query.join(TermOfDefence.members_of_committee)
.filter_by(id=group.project_supervisor_id)
.first()
)
if td is None:
abort(400, "Your project supervisor is not in committee!")
term_of_defence.group_id = group.id
db.session.add(term_of_defence)
db.session.commit()
return {"message": "You have just assigned the group for this exam date!"}
@bp.delete("/<int:examination_schedule_id>/enrollments/<int:term_of_defence_id>/")
@bp.input(TemporaryStudentSchema)
@bp.output(MessageSchema)
def delete_your_group_from_term_of_defence(
examination_schedule_id: int, term_of_defence_id: int, data: dict
) -> dict:
# this code will be removed
student = Student.query.filter(Student.id == data.get("student_id")).first()
if student is None:
abort(404, "Not found student!")
################
term_of_defence = (
TermOfDefence.query.join(ExaminationSchedule)
.filter(TermOfDefence.id == term_of_defence_id)
.filter(TermOfDefence.examination_schedule_id == examination_schedule_id)
.first()
)
if term_of_defence is None:
abort(404, "Not found term of defence!")
ex = term_of_defence.examination_schedule
group = (
Group.query.filter(Group.year_group_id == ex.year_group_id)
.join(Group.students)
.filter_by(index=student.index)
.first()
)
if group is None or group.id != term_of_defence.group_id:
abort(400, "You are not assigned to this group!")
term_of_defence.group_id = None
db.session.add(term_of_defence)
db.session.commit()
return {"message": "You have just removed the group for this exam date!"}
@bp.get("/examination-schedule/year-group/<int:year_group_id>/")
@bp.input(TemporaryStudentSchema, location="query")
@bp.output(ExaminationScheduleListSchema)
def list_examination_schedule(year_group_id: int, data: dict) -> dict:
# this code will be removed
student = Student.query.filter(Student.id == data.get("student_id")).first()
if student is None:
abort(404, "Not found student!")
################
examination_schedules = ExaminationSchedule.query.filter(
ExaminationSchedule.year_group_id == year_group_id
).all()
return {"examination_schedules": examination_schedules}
@bp.get("/examination-schedule/<int:examination_schedule_id>/enrollments/")
@bp.input(TemporaryStudentSchema, location="query")
@bp.output(TermOfDefenceStudentListSchema)
def list_term_of_defences(examination_schedule_id: int, data: dict) -> dict:
# this code will be removed
student = Student.query.filter(Student.id == data.get("student_id")).first()
if student is None:
abort(404, "Not found student!")
################
term_of_defences = (
TermOfDefence.query.filter(
TermOfDefence.examination_schedule_id == examination_schedule_id
)
.join(ExaminationSchedule, isouter=True)
.all()
)
term_of_defences = list(
filter(
lambda n: len(
[
d.id
for d in n.members_of_committee
if d.id == student.groups[0].project_supervisor.id
]
)
> 0,
term_of_defences,
)
)
return {"term_of_defences": term_of_defences}