import datetime from apiflask import APIBlueprint from flask import abort from ...base.schemas import MessageSchema from ...dependencies import db from ...examination_schedule.models import TemporaryAvailability, TermOfDefence from ..query.enrollments import ( check_the_term_of_defence_not_exists_in_chosen_date_range, get_and_check_the_project_supervisors_exists_in_db, get_examination_schedule_by_id, get_term_of_defence_by_id_and_examination_schedule_id, set_new_group_to_term_of_defence, validate_enrollments_date, ) from ..schemas.enrollments import ( AssignedGroupToTermOfDefenceListSchema, TemporaryAvailabilityListSchema, TermOfDefenceSchema, ) from ..schemas.groups import GroupIdSchema from ..utils import generate_range_dates bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments") @bp.post("//add") @bp.input(TermOfDefenceSchema) @bp.output(MessageSchema, status_code=201) def create_term_of_defence(examination_schedule_id: int, data: dict) -> dict: chairman_of_committee_id = data.pop("chairman_of_committee") project_supervisors_ids = data.pop("project_supervisors") if chairman_of_committee_id not in project_supervisors_ids: abort(400, "Invalid id of chairman committee!") ex = get_examination_schedule_by_id(examination_schedule_id) project_supervisors = get_and_check_the_project_supervisors_exists_in_db( ex.year_group_id, project_supervisors_ids ) validate_enrollments_date(ex.start_date, ex.end_date, ex.duration_time, data) check_the_term_of_defence_not_exists_in_chosen_date_range( examination_schedule_id, data ) td = TermOfDefence( **data, examination_schedule_id=examination_schedule_id, chairman_of_committee=chairman_of_committee_id ) db.session.add(td) db.session.commit() for p in project_supervisors: td.members_of_committee.append(p) db.session.commit() return {"message": "Term of defence was created!"} @bp.post("//add-term-of-defences/") @bp.input(TermOfDefenceSchema) @bp.output(MessageSchema, status_code=201) def create_many_term_of_defences(examination_schedule_id: int, data: dict) -> dict: chairman_of_committee_id = data.pop("chairman_of_committee") project_supervisors_ids = data.pop("project_supervisors") if chairman_of_committee_id not in project_supervisors_ids: abort(400, "Invalid id of chairman committee!") ex = get_examination_schedule_by_id(examination_schedule_id) project_supervisors = get_and_check_the_project_supervisors_exists_in_db( ex.year_group_id, project_supervisors_ids ) validate_enrollments_date(ex.start_date, ex.end_date, ex.duration_time, data) check_the_term_of_defence_not_exists_in_chosen_date_range( examination_schedule_id, data ) # create many here start_date = data.get("start_date") end_date = data.get("end_date") dates = generate_range_dates(start_date, end_date, ex.duration_time) for start_date in dates: end_date = start_date + datetime.timedelta(minutes=ex.duration_time) td = TermOfDefence( start_date=start_date, end_date=end_date, examination_schedule_id=examination_schedule_id, chairman_of_committee=chairman_of_committee_id, ) td.members_of_committee = project_supervisors db.session.add(td) db.session.commit() return {"message": "Term of defences was created!"} @bp.put("//update//") @bp.input(TermOfDefenceSchema) @bp.output(MessageSchema) def update_term_of_defence( examination_schedule_id: int, term_of_defence_id: int, data: dict ) -> dict: chairman_of_committee_id = data.pop("chairman_of_committee") project_supervisors_ids = data.pop("project_supervisors") if chairman_of_committee_id not in project_supervisors_ids: abort(400, "Invalid id of chairman committee!") td_query = TermOfDefence.query.filter( TermOfDefence.id == term_of_defence_id, TermOfDefence.examination_schedule_id == examination_schedule_id, ) td = td_query.first() if td is None: abort(404, "Not found term of defence!") ex = get_examination_schedule_by_id(examination_schedule_id) project_supervisors = get_and_check_the_project_supervisors_exists_in_db( ex.year_group_id, project_supervisors_ids ) validate_enrollments_date(ex.start_date, ex.end_date, ex.duration_time, data) check_the_term_of_defence_not_exists_in_chosen_date_range( examination_schedule_id, data ) td_query.update(data) td.members_of_committee = [] td.chairman_of_committee = chairman_of_committee_id db.session.commit() for p in project_supervisors: td.members_of_committee.append(p) db.session.commit() return {"message": "Term of defence was updated!"} @bp.delete("//delete//") @bp.output(MessageSchema) def delete_term_of_defence( examination_schedule_id: int, term_of_defence_id: int ) -> dict: td = get_term_of_defence_by_id_and_examination_schedule_id( examination_schedule_id, term_of_defence_id ) db.session.delete(td) db.session.commit() return {"message": "Term of defence was deleted!"} @bp.get("//term-of-defences/") @bp.output(AssignedGroupToTermOfDefenceListSchema) def list_of_term_of_defences(examination_schedule_id: int) -> dict: get_examination_schedule_by_id(examination_schedule_id) td = ( TermOfDefence.query.join(TermOfDefence.members_of_committee, isouter=True) .filter(TermOfDefence.examination_schedule_id == examination_schedule_id) .all() ) return {"term_of_defences": td} @bp.get("//temporary-availabilities/") @bp.output(TemporaryAvailabilityListSchema) def list_of_temporary_availability(examination_schedule_id: int) -> dict: get_examination_schedule_by_id(examination_schedule_id) td = ( TemporaryAvailability.query.filter( TemporaryAvailability.examination_schedule_id == examination_schedule_id ) .join(TemporaryAvailability.project_supervisor) .all() ) return {"temporary_availabilities": td} @bp.get("//assigned-group-to-term-of-defences/") @bp.output(AssignedGroupToTermOfDefenceListSchema) def list_of_assigned_group_to_term_of_defences(examination_schedule_id: int) -> dict: get_examination_schedule_by_id(examination_schedule_id) td = ( TermOfDefence.query.join(TermOfDefence.members_of_committee, isouter=True) .join(TermOfDefence.group) .filter(TermOfDefence.examination_schedule_id == examination_schedule_id) .filter(TermOfDefence.group_id.isnot(None)) .all() ) return {"term_of_defences": td} @bp.post( "//term-of-defence//group/" ) @bp.input(GroupIdSchema) @bp.output(MessageSchema, status_code=201) def add_group_to_term_of_defence( examination_schedule_id: int, term_of_defence_id: int, data: dict ) -> dict: set_new_group_to_term_of_defence( examination_schedule_id, term_of_defence_id, data.get("group_id") ) db.session.commit() return {"message": "Group was added to term of defence!"} @bp.delete( "//term-of-defence//group/" ) @bp.output(MessageSchema) def delete_group_to_term_of_defence( examination_schedule_id: int, term_of_defence_id: int ) -> dict: td = get_term_of_defence_by_id_and_examination_schedule_id( examination_schedule_id, term_of_defence_id ) td.group_id = None db.session.commit() return {"message": "Group was deleted from this term of defence!"} @bp.put( "//term-of-defence//group/" ) @bp.input(GroupIdSchema) @bp.output(MessageSchema) def update_group_for_term_of_defence( examination_schedule_id: int, term_of_defence_id: int, data: dict ) -> dict: set_new_group_to_term_of_defence( examination_schedule_id, term_of_defence_id, data.get("group_id") ) db.session.commit() return {"message": "Group for term of defence was updated!"}