add endpoints list of assigned group to term of defence and functionality of add, update, delete group to term of defence by coordinator

This commit is contained in:
dominik24c 2022-11-19 20:43:05 +01:00
parent 4d21532b1f
commit 62599214dc
8 changed files with 135 additions and 36 deletions

View File

@ -0,0 +1,43 @@
from flask import abort
from ...examination_schedule.models import ExaminationSchedule, TermOfDefence
from ...students.models import Group
def get_term_of_defence_by_id_and_examination_schedule_id(examination_schedule_id: int,
term_of_defence_id: int) -> ExaminationSchedule:
td = TermOfDefence.query.filter(TermOfDefence.id == term_of_defence_id,
TermOfDefence.examination_schedule_id == examination_schedule_id).first()
if td is None:
abort(404, "Not found examination schedule or term of defence!")
return td
def get_group_by_id(group_id: int) -> Group:
group = Group.query.filter(Group.id == group_id).first()
if group is None:
abort(404, "Not found group!")
return group
def check_the_group_has_assigned_to_term_of_defence(group_id: int) -> TermOfDefence:
td = TermOfDefence.query.filter(TermOfDefence.group_id == group_id).first()
if td is not None:
abort(400, "Group has already assigned to term of defence!")
return td
def set_new_group_to_term_of_defence(examination_schedule_id: int, term_of_defence_id: int,
group_id: int) -> TermOfDefence:
td = get_term_of_defence_by_id_and_examination_schedule_id(examination_schedule_id, term_of_defence_id)
get_group_by_id(group_id)
check_the_group_has_assigned_to_term_of_defence(group_id)
td.group_id = group_id
return td
def get_examination_schedule_by_id(examination_schedule_id: int) -> ExaminationSchedule:
ex = ExaminationSchedule.query.filter(ExaminationSchedule.id == examination_schedule_id).first()
if ex is None:
abort(404, "Not found examination schedule!")
return ex

View File

@ -4,14 +4,17 @@ from itertools import islice
from apiflask import APIBlueprint
from flask import abort, current_app
from sqlalchemy import or_, and_
from flask_sqlalchemy import get_debug_queries
from ..schemas import MessageSchema, TermOfDefenceSchema, TermOfDefenceListSchema, \
TemporaryAvailabilityListSchema
TemporaryAvailabilityListSchema, AssignedGroupToTermOfDefenceListSchema, GroupIdSchema
from ...examination_schedule.models import ExaminationSchedule, TermOfDefence, TemporaryAvailability
from ...students.models import YearGroup
from ...project_supervisor.models import ProjectSupervisor
from ...dependencies import db
from ..utils import generate_range_dates
from ..query.enrollments import get_term_of_defence_by_id_and_examination_schedule_id, set_new_group_to_term_of_defence, \
get_examination_schedule_by_id
bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments")
@ -19,9 +22,7 @@ bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments")
@bp.post('/<int:examination_schedule_id>/generate')
@bp.output(MessageSchema)
def generate_term_of_defence_for_this_examination_schedule(examination_schedule_id: int) -> dict:
ex = ExaminationSchedule.query.filter(ExaminationSchedule.id == examination_schedule_id).first()
if ex is None:
abort(404, "Not found examination schedule!")
ex = get_examination_schedule_by_id(examination_schedule_id)
# print(ex.start_date.date())
# print(ex.end_date.date())
@ -54,7 +55,8 @@ def generate_term_of_defence_for_this_examination_schedule(examination_schedule_
TermOfDefence.end_date < e)
)).first()
if td is None:
term_of_defence = TermOfDefence(start_date=d, end_date=e, examination_schedule_id=examination_schedule_id)
term_of_defence = TermOfDefence(start_date=d, end_date=e,
examination_schedule_id=examination_schedule_id)
db.session.add(term_of_defence)
db.session.commit()
project_supervisors_ids = []
@ -78,9 +80,7 @@ def create_term_of_defence(examination_schedule_id: int, data: dict) -> dict:
if not data:
abort(400, "You have passed empty data!")
ex = ExaminationSchedule.query.filter(ExaminationSchedule.id == examination_schedule_id).first()
if ex is None:
abort(404, "Not found examination schedule!")
ex = get_examination_schedule_by_id(examination_schedule_id)
yg_id = ex.year_group_id
project_supervisors_ids = data.pop('project_supervisors')
@ -186,23 +186,16 @@ def update_term_of_defence(examination_schedule_id: int, term_of_defence_id: int
@bp.delete('/<int:examination_schedule_id>/delete/<int:term_of_defence_id>/')
@bp.output(MessageSchema)
def delete_term_of_defence(examination_schedule_id: int, term_of_defence_id: int) -> dict:
td = TermOfDefence.query.filter(TermOfDefence.id == term_of_defence_id,
ExaminationSchedule.id == examination_schedule_id).first()
if td is None:
abort(404, "Not found term of defence!")
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('/<int:examination_schedule_id>/term-of-defences/')
@bp.output(TermOfDefenceListSchema)
def list_of_term_of_defences(examination_schedule_id: int) -> dict:
ex = ExaminationSchedule.query.filter(ExaminationSchedule.id == examination_schedule_id).first()
if ex is None:
abort(400, "Examination Schedule didn't exist")
get_examination_schedule_by_id(examination_schedule_id)
td = TermOfDefence.query. \
filter(TermOfDefence.examination_schedule_id == examination_schedule_id). \
@ -214,12 +207,51 @@ def list_of_term_of_defences(examination_schedule_id: int) -> dict:
@bp.get('/<int:examination_schedule_id>/temporary-availabilities/')
@bp.output(TemporaryAvailabilityListSchema)
def list_of_temporary_availability(examination_schedule_id: int) -> dict:
ex = ExaminationSchedule.query.filter(ExaminationSchedule.id == examination_schedule_id).first()
if ex is None:
abort(400, "Examination Schedule didn't exist")
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('/<int:examination_schedule_id>/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('/<int:examination_schedule_id>/term-of-defence/<int:term_of_defence_id>/group/')
@bp.input(GroupIdSchema)
@bp.output(MessageSchema)
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 defences!"}
@bp.delete('/<int:examination_schedule_id>/term-of-defence/<int:term_of_defence_id>/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 term of defences!"}
@bp.put('/<int:examination_schedule_id>/term-of-defence/<int:term_of_defence_id>/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!"}

View File

@ -1,7 +1,8 @@
from .enrollments import TermOfDefenceSchema, TermOfDefenceListSchema, TemporaryAvailabilityListSchema
from .enrollments import TermOfDefenceSchema, TermOfDefenceListSchema, TemporaryAvailabilityListSchema, \
AssignedGroupToTermOfDefenceListSchema
from .examination_schedule import ExaminationScheduleSchema, ExaminationScheduleUpdateSchema, \
ExaminationSchedulesPaginationSchema, ExaminationSchedulesQuerySchema, WorkloadSchema
from .groups import GroupQuerySchema, GroupsPaginationSchema, GroupCreateSchema, GroupEditSchema
from .groups import GroupQuerySchema, GroupsPaginationSchema, GroupCreateSchema, GroupEditSchema, GroupIdSchema
from .project_supervisor import ProjectSupervisorQuerySchema, ProjectSupervisorsPaginationSchema, \
ProjectSupervisorCreateSchema, ProjectSupervisorEditSchema, ProjectSupervisorYearGroupSchema
from .students import ProjectSupervisorSchema, GroupSchema, StudentSchema, StudentsPaginationSchema, \

View File

@ -16,6 +16,7 @@ class ProjectSupervisorForTermOfDefenceSchema(Schema):
class TermOfDefenceItemSchema(Schema):
id = fields.Integer()
start_date = fields.DateTime()
end_date = fields.DateTime()
members_of_committee = fields.List(fields.Nested(ProjectSupervisorForTermOfDefenceSchema))
@ -25,6 +26,25 @@ class TermOfDefenceListSchema(Schema):
term_of_defences = fields.List(fields.Nested(TermOfDefenceItemSchema))
class StudentDataItemSchema(Schema):
index = fields.Integer()
first_name = fields.Str()
last_name = fields.Str()
class GroupDataItemSchema(Schema):
name = fields.Str()
students = fields.List(fields.Nested(StudentDataItemSchema))
class AssignedGroupToTermOfDefenceItemSchema(TermOfDefenceItemSchema):
group = fields.Nested(GroupDataItemSchema)
class AssignedGroupToTermOfDefenceListSchema(Schema):
term_of_defences = fields.List(fields.Nested(AssignedGroupToTermOfDefenceItemSchema))
class ProjectSupervisorForTemporaryAvailabilitySchema(Schema):
id = fields.Str()
first_name = fields.Str()

View File

@ -1,28 +1,31 @@
from marshmallow import fields, validate
from marshmallow import Schema, fields, validate
from ...dependencies import ma
from ..validators import validate_index
from .students import GroupSchema, StudentSchema
class GroupQuerySchema(ma.Schema):
class GroupQuerySchema(Schema):
name = fields.Str()
page = fields.Integer()
per_page = fields.Integer()
class GroupsPaginationSchema(ma.Schema):
class GroupsPaginationSchema(Schema):
groups = fields.List(fields.Nested(GroupSchema))
max_pages = fields.Integer()
class GroupCreateSchema(ma.Schema):
class GroupCreateSchema(Schema):
name = fields.Str(validate=validate.Length(min=1, max=255), required=True)
project_supervisor_id = fields.Integer(required=True)
students = fields.List(fields.Integer(validate=validate_index, required=True))
class GroupEditSchema(ma.Schema):
class GroupEditSchema(Schema):
name = fields.Str(validate=validate.Length(min=1, max=255))
project_supervisor_id = fields.Integer(validate=validate_index)
students = fields.List(fields.Nested(StudentSchema), validate=validate.Length(min=1, max=255))
class GroupIdSchema(Schema):
group_id = fields.Integer(required=True)

View File

@ -30,8 +30,8 @@ class TermOfDefence(Base):
examination_schedule_id = db.Column(db.Integer, db.ForeignKey('examination_schedules.id'))
examination_schedule = db.relationship('ExaminationSchedule', backref='term_of_defences')
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'))
group = db.relationship("Group", uselist=False, backref='term_of_defence')
members_of_committee = db.relationship("ProjectSupervisor", secondary=committee)
group = db.relationship("Group", uselist=False, backref='term_of_defence', lazy='joined')
members_of_committee = db.relationship("ProjectSupervisor", secondary=committee, lazy='joined')
class TemporaryAvailability(Base):

View File

@ -21,7 +21,7 @@ class YearGroup(Base):
name = db.Column(db.String(50), nullable=False)
mode = db.Column(db.String(1), nullable=False)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
students = db.relationship("YearGroupStudents")
students = db.relationship("YearGroupStudents", lazy='joined')
__table__args = (
db.UniqueConstraint('name', 'mode', name='uc_name_mode_year_group')
@ -41,12 +41,12 @@ class Group(Base):
prz_kod = db.Column(db.String(60), default='06-DPRILI0')
tzaj_kod = db.Column(db.String(60), default='LAB')
project_supervisor_id = db.Column(db.Integer, db.ForeignKey('project_supervisors.id'))
project_supervisor = db.relationship('ProjectSupervisor', backref='groups', lazy=True)
project_supervisor = db.relationship('ProjectSupervisor', backref='groups', lazy='joined')
year_group_id = db.Column(db.Integer, db.ForeignKey('year_groups.id'))
year_group = db.relationship('YearGroup', backref='groups', lazy=True)
year_group = db.relationship('YearGroup', backref='groups', lazy='joined')
points_for_first_term = db.Column(db.Integer, default=0, nullable=False)
points_for_second_term = db.Column(db.Integer, default=0, nullable=False)
students = db.relationship('Student', secondary=students_groups, back_populates='groups')
students = db.relationship('Student', secondary=students_groups, back_populates='groups', lazy='joined')
@classmethod
def search_by_name(cls, year_group_id: int, search_name: str = None) -> BaseQuery:
@ -63,8 +63,8 @@ class Student(Person):
pesel = db.Column(db.String(11), default='')
index = db.Column(db.Integer, primary_key=True)
groups = db.relationship('Group', secondary=students_groups, back_populates='students')
year_groups = db.relationship("YearGroupStudents")
groups = db.relationship('Group', secondary=students_groups, back_populates='students', lazy='joined')
year_groups = db.relationship("YearGroupStudents", lazy='joined')
@classmethod
def search_by_fullname_and_mode_and_order_by_first_name_or_last_name(cls, year_group_id: int, fullname: str = None,