from apiflask import APIBlueprint from ...base.utils import paginate_models from ...dependencies import db from ...project_supervisor.models import ProjectSupervisor from ..models import Group from ..schemas import ProjectSupervisorPaginationSchema, ProjectSupervisorQuerySchema bp = APIBlueprint("registrations", __name__, url_prefix="/registrations") @bp.get("//") @bp.input(ProjectSupervisorQuerySchema, location="query") @bp.output(ProjectSupervisorPaginationSchema) def list_available_groups(year_group_id: int, query: dict) -> dict: page = query.get("page") per_page = query.get("per_page") available_groups = ProjectSupervisor.limit_group - db.func.count(Group.id) ps_query = ( db.session.query(ProjectSupervisor, available_groups) .join(Group, isouter=True) .filter(ProjectSupervisor.year_group_id == year_group_id) .group_by(ProjectSupervisor.id) ) data = paginate_models(page, ps_query, per_page) project_supervisors = [] for project_supervisor, available_groups in data["items"]: setattr(project_supervisor, "available_groups", available_groups) project_supervisors.append(project_supervisor) return {"project_supervisors": project_supervisors, "max_pages": data["max_pages"]}