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

70 lines
2.7 KiB
Python

import datetime
from apiflask import APIBlueprint
from flask import abort, current_app
from ..schemas import MessageSchema, EnrollmentCreateSchema
from ...examination_schedule.models import Enrollment, Committee, ExaminationSchedule
from ...dependencies import db
bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments")
@bp.post('/<int:examination_schedule_id>/')
@bp.input(EnrollmentCreateSchema, location='json')
@bp.output(MessageSchema)
def create_enrollments(examination_schedule_id: int, data: dict) -> dict:
prt = current_app.config["PROJECT_PRESENTATION_TIME"]
examination_schedule = db.session.query(ExaminationSchedule).filter(
ExaminationSchedule.id == examination_schedule_id).first()
if examination_schedule is None:
abort(404, "Examination schedule doesn't exist!")
start_date = data['start_date']
end_date = data['end_date']
if start_date > end_date:
abort(400, "Invalid dates! End date must be greater than start date!")
if start_date.date() != end_date.date():
abort(400, "Invalid dates! Only hours can be different!")
enrollment = Enrollment.query.filter(Enrollment.start_date >= start_date,
Enrollment.start_date < end_date).first()
if enrollment is not None:
abort(400, "You have just created enrollments for this range date!")
enrollment = Enrollment.query.filter(Enrollment.end_date > start_date, Enrollment.end_date <= end_date).first()
if enrollment is not None:
abort(400, "You have just created enrollments for this range date! `1")
delta = end_date - start_date
delta_in_minutes = delta.total_seconds() / 60
if delta_in_minutes % prt != 0:
abort(400, "Invalid format dates!")
amount = int(delta_in_minutes // prt)
enrollments = []
for i in range(amount):
sd = start_date + datetime.timedelta(minutes=i * prt)
ed = start_date + datetime.timedelta(minutes=(i + 1) * prt)
enrollment = Enrollment(start_date=sd, end_date=ed, examination_schedule_id=examination_schedule_id)
enrollments.append(enrollment)
db.session.add_all(enrollments)
db.session.commit()
committees = [Committee(enrollment_id=e.id) for e in enrollments]
db.session.add_all(committees)
db.session.commit()
return {"message": "Enrollments was created!"}
@bp.delete('/<int:enrollment_id>/')
@bp.output(MessageSchema)
def delete_enrollment(enrollment_id: int) -> dict:
enrollment = db.session.query(Enrollment).filter(Enrollment.id == enrollment_id).first()
if enrollment is None:
abort(404, "Enrollment doesn't exist!")
db.session.delete(enrollment)
db.session.commit()
return {"message": "Enrollment was deleted!"}