diff --git a/backend/app/api.py b/backend/app/api.py index 93b0650..1861c52 100644 --- a/backend/app/api.py +++ b/backend/app/api.py @@ -1,9 +1,11 @@ from flask import Blueprint from .coordinator.routes import bp as coordinator_bp from .project_supervisor.routes import bp as project_supervisor_bp +from .students.routes import bp as students_bp api_bp = Blueprint('api', __name__, url_prefix='/api') # register blueprints here api_bp.register_blueprint(coordinator_bp) api_bp.register_blueprint(project_supervisor_bp) +api_bp.register_blueprint(students_bp) diff --git a/backend/app/coordinator/routes/__init__.py b/backend/app/coordinator/routes/__init__.py index 6252558..2f39af8 100644 --- a/backend/app/coordinator/routes/__init__.py +++ b/backend/app/coordinator/routes/__init__.py @@ -1,7 +1,9 @@ from flask import Blueprint from .students import bp as students_bp +from .groups import bp as groups_bp bp = Blueprint("coordinator", __name__, url_prefix="/coordinator") bp.register_blueprint(students_bp) +bp.register_blueprint(groups_bp) diff --git a/backend/app/coordinator/utils.py b/backend/app/coordinator/utils.py index 011263f..2496cdd 100644 --- a/backend/app/coordinator/utils.py +++ b/backend/app/coordinator/utils.py @@ -9,7 +9,7 @@ from ..students.models import Student def check_columns(df: pd.DataFrame) -> bool: headers = set(df.keys().values) - columns = ['NAZWISKO','IMIE','INDEKS','PESEL','EMAIL'] + columns = ['NAZWISKO', 'IMIE', 'INDEKS', 'PESEL', 'EMAIL'] if len(headers - set(columns)) != 0: return False @@ -31,12 +31,12 @@ def parse_csv(file, mode) -> Generator[Student, Any, None]: # if not check_columns(df): # raise InvalidNameOrTypeHeaderException - students = (Student(last_name = dict(item.items())['NAZWISKO'], - first_name = dict(item.items())['NAZWISKO'], - index = dict(item.items())['INDEKS'], - pesel = str(int(dict(item.items())['PESEL'])) if not pd.isna(dict(item.items())['PESEL']) else '', - email = dict(item.items())['EMAIL'], + students = (Student(last_name=dict(item.items())['NAZWISKO'], + first_name=dict(item.items())['IMIE'], + index=dict(item.items())['INDEKS'], + pesel=str(int(dict(item.items())['PESEL'])) if not pd.isna(dict(item.items())['PESEL']) else None, + email=dict(item.items())['EMAIL'], mode=mode) for _, item in df.iterrows()) - + return students diff --git a/backend/app/students/routes.py b/backend/app/students/routes.py deleted file mode 100644 index e69de29..0000000 diff --git a/backend/app/students/routes/__init__.py b/backend/app/students/routes/__init__.py new file mode 100644 index 0000000..b3098d7 --- /dev/null +++ b/backend/app/students/routes/__init__.py @@ -0,0 +1,7 @@ +from flask import Blueprint + +from .registrations import bp as registrations_bp + +bp = Blueprint("students", __name__, url_prefix="/students") + +bp.register_blueprint(registrations_bp) \ No newline at end of file diff --git a/backend/app/students/routes/registrations.py b/backend/app/students/routes/registrations.py new file mode 100644 index 0000000..5ee0a39 --- /dev/null +++ b/backend/app/students/routes/registrations.py @@ -0,0 +1,39 @@ +from apiflask import APIBlueprint +from flask import abort + +from ...project_supervisor.models import ProjectSupervisor +from ..models import Group +from ...dependencies import db +from ..schemas import ProjectSupervisorPaginationSchema, ProjectSupervisorQuerySchema +from ...base.utils import paginate_models + +bp = APIBlueprint("registrations", __name__, url_prefix="/registrations") + + +@bp.route('/', methods=['GET']) +@bp.input(ProjectSupervisorQuerySchema, location='query') +@bp.output(ProjectSupervisorPaginationSchema) +def list_available_groups(query: dict) -> dict: + mode = query.get('mode') + page = query.get('page') + per_page = query.get('per_page') + + ps_query = db.session.query(ProjectSupervisor, + (ProjectSupervisor.count_groups - db.func.count(Group.id))).join(Group) + if mode is not None: + ps_query = ps_query.filter(ProjectSupervisor.mode == mode) + ps_query = ps_query.group_by(Group.id) + + response = paginate_models(page, ps_query, per_page) + if (message := response.get('message')) is not None: + abort(response['status_code'], message) + + project_supervisors = [] + for project_supervisor, available_groups in response['items']: + setattr(project_supervisor, 'available_groups', available_groups) + project_supervisors.append(project_supervisor) + + return { + "project_supervisors": project_supervisors, + "max_pages": response['max_pages'] + } diff --git a/backend/app/students/schemas.py b/backend/app/students/schemas.py index e69de29..9d84e5c 100644 --- a/backend/app/students/schemas.py +++ b/backend/app/students/schemas.py @@ -0,0 +1,20 @@ +from ..dependencies import ma +from marshmallow import fields + + +class ProjectSupervisorSchema(ma.Schema): + first_name = fields.Str() + last_name = fields.Str() + mode = fields.Boolean() + available_groups = fields.Integer() + + +class ProjectSupervisorPaginationSchema(ma.Schema): + project_supervisors = fields.List(fields.Nested(ProjectSupervisorSchema)) + max_pages = fields.Integer() + + +class ProjectSupervisorQuerySchema(ma.Schema): + page = fields.Integer() + per_page = fields.Integer() + mode = fields.Boolean()