update create groups endpoint - change logic of counting groups and list available groups endpoint
This commit is contained in:
parent
980cf5da50
commit
f6b53a84a3
@ -16,6 +16,7 @@ class Config:
|
|||||||
|
|
||||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||||
SQLALCHEMY_DATABASE_URI = f'sqlite:///{BASE_DIR / "db.sqlite"}'
|
SQLALCHEMY_DATABASE_URI = f'sqlite:///{BASE_DIR / "db.sqlite"}'
|
||||||
|
LIMIT_STUDENTS_PER_GROUP = 5
|
||||||
|
|
||||||
DESCRIPTION = 'System PRI'
|
DESCRIPTION = 'System PRI'
|
||||||
OPENAPI_VERSION = '3.0.2'
|
OPENAPI_VERSION = '3.0.2'
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from flask import abort
|
from flask import abort, current_app
|
||||||
from apiflask import APIBlueprint
|
from apiflask import APIBlueprint
|
||||||
from flask_sqlalchemy import get_debug_queries
|
from flask_sqlalchemy import get_debug_queries
|
||||||
|
|
||||||
@ -40,16 +40,17 @@ def create_group(data: dict) -> dict:
|
|||||||
|
|
||||||
project_supervisor = ProjectSupervisor.query.filter_by(id=project_supervisor_id).first()
|
project_supervisor = ProjectSupervisor.query.filter_by(id=project_supervisor_id).first()
|
||||||
|
|
||||||
|
limit_student_per_group = current_app.config.get('LIMIT_STUDENTS_PER_GROUP')
|
||||||
if project_supervisor is None:
|
if project_supervisor is None:
|
||||||
abort(400, f"Project Supervisor with id {project_supervisor_id} doesnt exist")
|
abort(400, f"Project Supervisor with id {project_supervisor_id} doesnt exist")
|
||||||
elif project_supervisor.limit_group < len(students_indexes):
|
elif limit_student_per_group is not None and limit_student_per_group < len(students_indexes):
|
||||||
abort(400, f"Too much students you want add to group, "
|
abort(400, f"Too much students you want add to group, "
|
||||||
f"this group can have only {project_supervisor.limit_group} students")
|
f"The group can have only {limit_student_per_group} students")
|
||||||
|
|
||||||
result = db.session.query(ProjectSupervisor.count_groups - db.func.count(ProjectSupervisor.id)).join(Group).filter(
|
limit = db.session.query(ProjectSupervisor.limit_group - db.func.count(ProjectSupervisor.id)).join(Group).filter(
|
||||||
ProjectSupervisor.id == project_supervisor_id).group_by(ProjectSupervisor.id).scalar()
|
ProjectSupervisor.id == project_supervisor_id).group_by(ProjectSupervisor.id).scalar()
|
||||||
|
|
||||||
if result is not None and result <= 0:
|
if limit is not None and limit <= 0:
|
||||||
abort(400, "Can't create new group, project supervisor achieved a limit of groups")
|
abort(400, "Can't create new group, project supervisor achieved a limit of groups")
|
||||||
|
|
||||||
group = Group(name=name, project_supervisor_id=project_supervisor_id)
|
group = Group(name=name, project_supervisor_id=project_supervisor_id)
|
||||||
@ -66,6 +67,7 @@ def create_group(data: dict) -> dict:
|
|||||||
students = db.session.query(Student).filter(Student.index.in_(students_indexes)).all()
|
students = db.session.query(Student).filter(Student.index.in_(students_indexes)).all()
|
||||||
for student in students:
|
for student in students:
|
||||||
student.group_id = group.id
|
student.group_id = group.id
|
||||||
|
project_supervisor.count_groups += 1
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
@ -18,11 +18,14 @@ def list_available_groups(query: dict) -> dict:
|
|||||||
page = query.get('page')
|
page = query.get('page')
|
||||||
per_page = query.get('per_page')
|
per_page = query.get('per_page')
|
||||||
|
|
||||||
ps_query = db.session.query(ProjectSupervisor,
|
available_groups = (ProjectSupervisor.limit_group - ProjectSupervisor.count_groups)
|
||||||
(ProjectSupervisor.count_groups - db.func.count(Group.id))).join(Group)
|
ps_query = db.session.query(ProjectSupervisor, available_groups).join(Group)
|
||||||
|
|
||||||
if mode is not None:
|
if mode is not None:
|
||||||
ps_query = ps_query.filter(ProjectSupervisor.mode == mode)
|
ps_query = ps_query.filter(ProjectSupervisor.mode == mode)
|
||||||
ps_query = ps_query.group_by(Group.id)
|
|
||||||
|
ps_query = ps_query.group_by(ProjectSupervisor.id). \
|
||||||
|
having(available_groups > 0)
|
||||||
|
|
||||||
data = paginate_models(page, ps_query, per_page)
|
data = paginate_models(page, ps_query, per_page)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user