add endpoints of list enrollments for coordinator, students and project supervisors
This commit is contained in:
parent
276cdf2b88
commit
b205bd1698
@ -8,6 +8,7 @@ class Config:
|
|||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
SRC_DIR = BASE_DIR / "app"
|
SRC_DIR = BASE_DIR / "app"
|
||||||
EXCLUDED_DIRS = ["__pycache__", "commands"]
|
EXCLUDED_DIRS = ["__pycache__", "commands"]
|
||||||
|
TIMEZONE = 'Europe/Warsaw'
|
||||||
|
|
||||||
ENABLE_CORS = os.environ.get('ENABLE_CORS') or False
|
ENABLE_CORS = os.environ.get('ENABLE_CORS') or False
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ def create_enrollments(examination_schedule_id: int, data: dict) -> dict:
|
|||||||
for i in range(amount):
|
for i in range(amount):
|
||||||
sd = start_date + datetime.timedelta(minutes=i * prt)
|
sd = start_date + datetime.timedelta(minutes=i * prt)
|
||||||
ed = start_date + datetime.timedelta(minutes=(i + 1) * prt)
|
ed = start_date + datetime.timedelta(minutes=(i + 1) * prt)
|
||||||
enrollment = Enrollment(start_date=sd, end_date=ed)
|
enrollment = Enrollment(start_date=sd, end_date=ed, examination_schedule_id=examination_schedule_id)
|
||||||
enrollments.append(enrollment)
|
enrollments.append(enrollment)
|
||||||
db.session.add_all(enrollments)
|
db.session.add_all(enrollments)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -6,6 +6,3 @@ from ..validators import validate_datetime_greater_than_now
|
|||||||
class EnrollmentCreateSchema(Schema):
|
class EnrollmentCreateSchema(Schema):
|
||||||
start_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
start_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
||||||
end_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
end_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
||||||
|
|
||||||
class Meta:
|
|
||||||
datetimeformat = '%Y-%m-%d %H:%M:%S'
|
|
||||||
|
@ -11,9 +11,6 @@ class ExaminationScheduleUpdateSchema(Schema):
|
|||||||
start_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
start_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
||||||
end_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
end_date = fields.DateTime(validate=validate_datetime_greater_than_now, required=True)
|
||||||
|
|
||||||
class Meta:
|
|
||||||
datetimeformat = '%Y-%m-%d %H:%M:%S'
|
|
||||||
|
|
||||||
|
|
||||||
class ExaminationScheduleListItemSchema(Schema):
|
class ExaminationScheduleListItemSchema(Schema):
|
||||||
id = fields.Integer(required=True)
|
id = fields.Integer(required=True)
|
||||||
|
@ -11,5 +11,5 @@ def validate_index(index: int) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def validate_datetime_greater_than_now(date: datetime) -> None:
|
def validate_datetime_greater_than_now(date: datetime) -> None:
|
||||||
if date < datetime.now():
|
if date.timestamp() < datetime.utcnow().timestamp():
|
||||||
raise ValidationError("Date must be greater than NOW!")
|
raise ValidationError("Date must be greater than NOW!")
|
||||||
|
@ -1,9 +1,61 @@
|
|||||||
|
import datetime
|
||||||
|
|
||||||
from apiflask import APIBlueprint
|
from apiflask import APIBlueprint
|
||||||
|
from flask import abort
|
||||||
|
|
||||||
|
from ..schemas import EnrollmentPaginationSchema, EnrollmentQuerySchema
|
||||||
|
from ..utils import check_examination_schedule_is_exist, get_list_of_enrollments_response
|
||||||
|
|
||||||
bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments")
|
bp = APIBlueprint("enrollments", __name__, url_prefix="/enrollments")
|
||||||
|
|
||||||
|
|
||||||
# list enrollments in examination schedule module for students, coordinator and project_supervisor
|
# list of the exam registration for students
|
||||||
@bp.get('/')
|
@bp.get('/<int:examination_schedule_id>/student-view')
|
||||||
def list_enrollments() -> dict:
|
@bp.input(EnrollmentQuerySchema, location='query')
|
||||||
pass
|
@bp.output(EnrollmentPaginationSchema)
|
||||||
|
def list_enrollments_for_students(examination_schedule_id: int, query: dict) -> dict:
|
||||||
|
page = query.get('page')
|
||||||
|
per_page = query.get('per_page')
|
||||||
|
|
||||||
|
examination_schedule = check_examination_schedule_is_exist(examination_schedule_id)
|
||||||
|
|
||||||
|
now = datetime.datetime.utcnow()
|
||||||
|
if examination_schedule.start_date is None or examination_schedule.end_date is None:
|
||||||
|
abort(403, "Forbidden! The examination schedule is not available yet")
|
||||||
|
|
||||||
|
if examination_schedule.start_date.timestamp() > now.timestamp():
|
||||||
|
abort(403, "Forbidden! Enrollments haven't just started!")
|
||||||
|
|
||||||
|
if examination_schedule.end_date.timestamp() < now.timestamp():
|
||||||
|
abort(400, "The exam registration has just finished!")
|
||||||
|
|
||||||
|
return get_list_of_enrollments_response(examination_schedule_id, page, per_page)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.get('/<int:examination_schedule_id>/coordinator-view/')
|
||||||
|
@bp.input(EnrollmentQuerySchema, location='query')
|
||||||
|
@bp.output(EnrollmentPaginationSchema)
|
||||||
|
def list_enrollments_for_coordinator(examination_schedule_id: int, query: dict) -> dict:
|
||||||
|
page = query.get('page')
|
||||||
|
per_page = query.get('per_page')
|
||||||
|
|
||||||
|
check_examination_schedule_is_exist(examination_schedule_id)
|
||||||
|
|
||||||
|
return get_list_of_enrollments_response(examination_schedule_id, page, per_page)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.get('/<int:examination_schedule_id>/project-supervisor-view/')
|
||||||
|
@bp.input(EnrollmentQuerySchema, location='query')
|
||||||
|
@bp.output(EnrollmentPaginationSchema)
|
||||||
|
def list_enrollments_for_project_supervisor(examination_schedule_id: int, query: dict) -> dict:
|
||||||
|
page = query.get('page')
|
||||||
|
per_page = query.get('per_page')
|
||||||
|
|
||||||
|
examination_schedule = check_examination_schedule_is_exist(examination_schedule_id)
|
||||||
|
|
||||||
|
now = datetime.datetime.utcnow()
|
||||||
|
|
||||||
|
if examination_schedule.start_date.timestamp() < now.timestamp():
|
||||||
|
abort(403, "Forbidden! Enrollment has just started! You cannot assign to the exam committees!")
|
||||||
|
|
||||||
|
return get_list_of_enrollments_response(examination_schedule_id, page, per_page)
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
from marshmallow import fields, validate, Schema
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectSupervisorSchema(Schema):
|
||||||
|
first_name = fields.Str()
|
||||||
|
last_name = fields.Str()
|
||||||
|
|
||||||
|
|
||||||
|
class CommitteeSchema(Schema):
|
||||||
|
members = fields.List(fields.Nested(ProjectSupervisorSchema))
|
||||||
|
|
||||||
|
|
||||||
|
class GroupSchema(Schema):
|
||||||
|
name = fields.Str()
|
||||||
|
|
||||||
|
|
||||||
|
class EnrollmentSchema(Schema):
|
||||||
|
start_date = fields.DateTime()
|
||||||
|
end_date = fields.DateTime()
|
||||||
|
committee = fields.Nested(CommitteeSchema)
|
||||||
|
group = fields.Nested(GroupSchema)
|
||||||
|
|
||||||
|
|
||||||
|
class EnrollmentPaginationSchema(Schema):
|
||||||
|
enrollments = fields.List(fields.Nested(EnrollmentSchema))
|
||||||
|
max_pages = fields.Integer()
|
||||||
|
|
||||||
|
|
||||||
|
class EnrollmentQuerySchema(Schema):
|
||||||
|
page = fields.Integer()
|
||||||
|
per_page = fields.Integer()
|
27
backend/app/examination_schedule/utils.py
Normal file
27
backend/app/examination_schedule/utils.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from flask import abort
|
||||||
|
|
||||||
|
from ..dependencies import db
|
||||||
|
from .models import Enrollment, Committee, ExaminationSchedule
|
||||||
|
from ..students.models import Group
|
||||||
|
from ..base.utils import paginate_models
|
||||||
|
|
||||||
|
|
||||||
|
def check_examination_schedule_is_exist(examination_schedule_id: int) -> ExaminationSchedule:
|
||||||
|
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!")
|
||||||
|
|
||||||
|
return examination_schedule
|
||||||
|
|
||||||
|
|
||||||
|
def get_list_of_enrollments_response(examination_schedule_id: int, page: int = None, per_page: int = None) -> dict:
|
||||||
|
enrollments_query = db.session.query(Enrollment). \
|
||||||
|
join(Group, isouter=True).join(Committee, isouter=True). \
|
||||||
|
join(ExaminationSchedule, isouter=True). \
|
||||||
|
filter(ExaminationSchedule.id == examination_schedule_id)
|
||||||
|
|
||||||
|
data = paginate_models(page, enrollments_query, per_page)
|
||||||
|
|
||||||
|
return {"enrollments": data["items"], "max_pages": data["max_pages"]}
|
@ -5,6 +5,7 @@ from ..base.models import Person, Base
|
|||||||
from ..base.utils import order_by_column_name
|
from ..base.utils import order_by_column_name
|
||||||
from ..examination_schedule.models import Enrollment
|
from ..examination_schedule.models import Enrollment
|
||||||
|
|
||||||
|
|
||||||
class Group(Base):
|
class Group(Base):
|
||||||
__tablename__ = "groups"
|
__tablename__ = "groups"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user