from sqlalchemy.sql import text from flask_sqlalchemy import BaseQuery from ..dependencies import db from ..base.models import Person, Base from ..base.utils import order_by_column_name class ProjectSupervisor(Base, Person): __tablename__ = "project_supervisors" limit_group = db.Column(db.Integer, default=1, nullable=False) mode = db.Column(db.Boolean, default=True, nullable=False) # True - stationary, False - non-stationary class Group(Base): __tablename__ = "groups" name = db.Column(db.String(60), nullable=False) project_supervisor_id = db.Column(db.Integer, db.ForeignKey('project_supervisors.id')) project_supervisor = db.relationship('ProjectSupervisor', backref='groups', lazy=True) class Student(Person): __tablename__ = "students" index = db.Column(db.Integer, primary_key=True) first_term = db.Column(db.Integer, default=0, nullable=False) second_term = db.Column(db.Integer, default=0, nullable=False) group_id = db.Column(db.Integer, db.ForeignKey('groups.id')) group = db.relationship('Group', backref='students', lazy=True) mode = db.Column(db.Boolean, default=True, nullable=False) # True - stationary, False - non-stationary @classmethod def search_by_fullname_and_order_by_first_name_or_last_name(cls, fullname: str = None, order_by_first_name: str = None, order_by_last_name: str = None) -> BaseQuery: student_query = cls.query if fullname is not None: """This works only for sqlite3 database - concat function doesn't exist so i used builtin concat operator specific only for sqlite db - || """ student_query = student_query.filter( text("students_first_name || ' ' || students_last_name LIKE :fullname ") ).params(fullname=f'{fullname}%') student_query = order_by_column_name(student_query, Student.first_name, order_by_first_name) student_query = order_by_column_name(student_query, Student.last_name, order_by_last_name) return student_query